MSP430F5529 DriverLib 库函数学习笔记(十四)看门狗定时器 (WDT)

目录

  • 硬知识
    • 看门狗定时计数器 (WDTCNT)
    • 看门狗模式
    • 定时计数模式
    • 看门狗定时器中断
    • 时钟故障保护功能
    • 低功耗模式下的看门狗操作
    • 看门狗定时器控制寄存器
  • WDT_A API (机翻)
    • 参数
  • 上机实战
    • 定时计数模式
      • 配置
      • 中断服务函数
      • 整体代码
      • 实验结果
    • 看门狗模式
      • 配置
      • 整体代码

平台:Code Composer Studio 10.3.1
MSP430F5529 LaunchPad™ Development Kit
(MSP‑EXP430F5529LP)


硬知识

       在工业控制现场,往往会由于供电电源、空间电磁干扰或其他的原因引起强烈的干扰噪声。这些干扰作用于数字器件,极易使其产生误动作,引起单片机程序跑飞,若不进行有效的处理,程序就不能回到正常的运行状态。为了保证系统的正常工作,一方面要尽量减少干扰源对系统的影响;另一方面,在系统受到影响之后要能尽快地恢复,看门狗就起到了这个作用。看门狗的用法:在正常工作期间,一次看门狗定时时间将产生一次系统复位。如果通过编程使看门狗定时时间稍大于程序中主循环执行一遍所用的时间,并且程序执行过程中都有对看门狗定时器清零的指令,使计数值重新计数,程序正常运行时,就会在看门狗定时时间到达之前对看门狗清零,不会产生看门狗溢出。如果由于干扰使程序跑飞,则不会在看门狗定时时间到达之前执行看门狗清零指令,看门狗就会产生溢出,从而产生系统复位,使CPU重新运行用户程序,这样程序就又可以恢复正常运行。
       看门狗定时器具有如下特点:
 软件可编程的8种时间间隔选择;
 看门狗模式;
 定时计数模式;
 对看门狗控制寄存器更改受口令的保护,若口令输入错误,则控制寄存器无法更改;
 多种时钟源供选择;
 可选择关闭看门狗以减少功耗;
 时钟故障保护功能。
       MSP430单片机的看门狗定时器逻辑结构框图如图所示。由该图可知,MSP430单片机看门狗定时器由中断产生逻辑单元、看门狗定时计数器、口令比较单元、看门狗控制寄存器、参考时钟选择逻辑单元等构成。
在这里插入图片描述

看门狗定时计数器 (WDTCNT)

       看门狗定时计数器是一个32位增计数器,不能通过软件程序直接访问其计数值。软件可通过看门狗控制寄存器(WDTCTL)控制看门狗定时计数器及配置其产生的时间间隔。看门狗定时计数器的参考时钟源可通过WDTSSEL控制位配置为SMCLK、ACLK、VLOCLK或X_CLK,产生的时间间隔可通过WDTIS控制位选择,具体请参考相应寄存器配置。

看门狗模式

       在一个上电复位清除(PUC)后,看门狗定时器被默认配置为采用SMCLK作为参考时钟源,复位时间间隔约为32ms并工作在看门狗模式。用户必须在看门狗复位时间间隔期满或另一个复位信号产生之前,配置、停止或清除看门狗定时器。当看门狗定时器被配置工作在看门狗模式时,利用一个错误的口令密码操作看门狗控制寄存器(WDTCTL)或选择的时间间隔期满都将产生一个PUC复位信号,一个PUC复位信号可将看门狗定时器复位到默认状态。

定时计数模式

       将WDTTMSEL控制位选择为1,看门狗定时器被配置为定时计数模式。这个模式可以被用来产生周期性中断,在定时计数模式下,当选定的时间间隔到来时,将置位看门狗定时计数中断标志位(WDTIFG),但并不产生PUC复位信号。当看门狗定时计数中断允许控制位(WDTIE)和全局中断允许控制位(GIE)置位时,CPU将响应WDTIFG中断请求。中断请求被响应后,单片机将自动清除看门狗定时计数中断标志位,当然也可通过软件手动清除看门狗定时计数中断标志位。在定时计数模式下的中断向量地址不同于在看门狗模式下的中断向量地址,具体请参考MSP430单片机中断向量表。

看门狗定时器中断

       看门狗定时器利用以下两个寄存器控制看门狗定时器中断:
 看门狗中断标志位WDTIFG:位于SFRIFG1.0内;
 看门狗中断允许控制位WDTIE:位于SFRIE1.0内。
       当看门狗定时器工作在看门狗模式时,看门狗中断标志位WDTIFG来源于一个复位向量中断。复位中断服务程序可利用看门狗中断标志位WDTIFG来判定看门狗定时器是否产生了一个系统复位信号。若WDTIFG标志位置位,看门狗定时器产生一个复位条件,要么复位定时时间到,要么口令密码错误。
当看门狗定时器工作在定时计数模式时,当定时时间到,将置位看门狗中断标志位WDTIFG,若WTDIE和GIE都置位,则可响应看门狗定时计数中断。

时钟故障保护功能

       看门狗定时器提供了一个时钟故障保护功能,确保在看门狗模式下,参考时钟不失效,这就意味着低功耗模式将有可能影响看门狗定时器参考时钟的选择。如果SMCLK或ACLK作为定时器参考时钟源时失效,看门狗定时器将自动选择VLOCLK作为其参考时钟源。当看门狗定时器工作于定时计数模式时,看门狗定时器没有时钟故障保护功能。

低功耗模式下的看门狗操作

       MSP430单片机具有多种低功耗模式,在不同的低功耗模式下,启用不同的时钟信号。应用程序的需要及所选时钟的类型决定了看门狗定时器的配置,例如如果用户想用低功耗模式3(LPM3),就要避免看门狗定时器的参考时钟选择以DCO、高频模式下的XT1或XT2作为时钟源的SMCLK或ACLK。当不需要看门狗定时器时,可利用WDTHOLD控制位关闭看门狗计数器(WDTCNT),以减少单片机功耗。

看门狗定时器控制寄存器

看门狗定时器控制寄存器(WDTCTL)列表如表所示。
在这里插入图片描述

WDT_A API (机翻)

       看门狗定时器(WDT_A) API提供了一组使用MSP430Ware WDT_A模块的函数。提供了初始化看门狗定时器为定时计数模式或看门狗模式的函数,具有可选择的时钟源和分频器来设置定时器周期。
WDT_A模块在定时器定时计数模式下只能产生一种中断。在看门狗模式时,一旦定时器计数完成,WDT_A模块将产生一次复位。

WDT_A_hold(uint16_t baseAddress)
//暂停看门狗定时器
WDT_A_start(uint16_t baseAddress)
//启动看门狗定时器
WDT_A_resetTimer(uint16_t baseAddress)
//重置看门狗定时器的计数值
WDT_A_initWatchdogTimer(uint16_t baseAddress, uint8_t clockSelect, uint8_t clockDivider)
//以看门狗模式设置看门狗定时器的时钟源
WDT_A_initIntervalTimer(uint16_t baseAddress, uint8_t clockSelect, uint8_t clockDivider)
//以定时计数模式设置看门狗定时器的时钟源

参数

baseAddress

WDT_A_BASE

clockSelect

/*is the clock source that the watchdog timer will use. Valid values are:*/
WDT_A_CLOCKSOURCE_SMCLK /*[Default]*/
WDT_A_CLOCKSOURCE_ACLK
WDT_A_CLOCKSOURCE_VLOCLK
WDT_A_CLOCKSOURCE_XCLK
/*Modified bits are WDTSSEL of WDTCTL register.*/

clockDivider

/*is the divider of the clock source, in turn setting the watchdog timer interval.
Valid values are:*/
WDT_A_CLOCKDIVIDER_2G
WDT_A_CLOCKDIVIDER_128M
WDT_A_CLOCKDIVIDER_8192K
WDT_A_CLOCKDIVIDER_512K
WDT_A_CLOCKDIVIDER_32K /*[Default]*/
WDT_A_CLOCKDIVIDER_8192
WDT_A_CLOCKDIVIDER_512
WDT_A_CLOCKDIVIDER_64
/*Modified bits are WDTIS and WDTHOLD of WDTCTL register.*/

上机实战

定时计数模式

配置

配置为定时计数模式,时钟源选为ACLK = 32768HZ ,分频系数设为32768,得到1s的定时周期

    WDT_A_hold(WDT_A_BASE);		//暂停计数SystemClock_Init();WDT_A_initIntervalTimer(WDT_A_BASE, WDT_A_CLOCKSOURCE_ACLK, WDT_A_CLOCKDIVIDER_32K);	//初始化看门狗定时计数模式SFR_enableInterrupt(SFR_WATCHDOG_INTERVAL_TIMER_INTERRUPT);	//启用看门狗定时计数模式中断GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);WDT_A_start(WDT_A_BASE);	//开始计数__bis_SR_register(GIE);

中断服务函数

// 看门狗中断服务程序
#pragma vector = WDT_VECTOR
__interrupt void WDT_ISR(void)
{GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);    // 反转P1.0端口状态
}

整体代码

#include "driverlib.h"#define MCLK_IN_HZ      25000000#define delay_us(x)     __delay_cycles((MCLK_IN_HZ/1000000*(x)))
#define delay_ms(x)     __delay_cycles((MCLK_IN_HZ/1000*(x)))void SystemClock_Init(void)
{PMM_setVCore(PMM_CORE_LEVEL_3);     //高主频工作需要较高的核心电压//XT1引脚复用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN4);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN5);//起振XT1UCS_turnOnLFXT1(UCS_XT1_DRIVE_3,UCS_XCAP_3);//XT2引脚复用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);//起振XT2UCS_turnOnXT2(UCS_XT2_DRIVE_4MHZ_8MHZ);//XT2作为FLL参考时钟,先8分频,再50倍频 4MHz / 8 * 50 = 25MHzUCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);UCS_initFLLSettle(25000, 50);//XT1作为ACLK时钟源 = 32768HzUCS_initClockSignal(UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作为MCLK时钟源 = 25MHzUCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作为SMCLK时钟源 = 25MHzUCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//设置外部时钟源的频率,使得在调用UCS_getMCLK, UCS_getSMCLK 或 UCS_getACLK时可得到正确值UCS_setExternalClockSource(32768, 4000000);
}int main(void)
{WDT_A_hold(WDT_A_BASE);SystemClock_Init();WDT_A_initIntervalTimer(WDT_A_BASE, WDT_A_CLOCKSOURCE_ACLK, WDT_A_CLOCKDIVIDER_32K);SFR_enableInterrupt(SFR_WATCHDOG_INTERVAL_TIMER_INTERRUPT);GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);WDT_A_start(WDT_A_BASE);__bis_SR_register(GIE);while(1){}
}// 看门狗中断服务程序
#pragma vector = WDT_VECTOR
__interrupt void WDT_ISR(void)
{GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);    // 反转P1.0端口状态
}

实验结果

在这里插入图片描述

看门狗模式

配置

初始化P2.1为上拉输入,P1.0为LED输出,按下P2.1 按钮喂狗,当得不到及时的喂狗,系统将会复位。

    WDT_A_hold(WDT_A_BASE);SystemClock_Init();WDT_A_initWatchdogTimer(WDT_A_BASE, WDT_A_CLOCKSOURCE_ACLK, WDT_A_CLOCKDIVIDER_32K);GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN1);WDT_A_start(WDT_A_BASE);__bis_SR_register(GIE);while(1){if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){delay_ms(20);if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){WDT_A_resetTimer(WDT_A_BASE);while(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1));}}}

整体代码

#include "driverlib.h"#define MCLK_IN_HZ      25000000#define delay_us(x)     __delay_cycles((MCLK_IN_HZ/1000000*(x)))
#define delay_ms(x)     __delay_cycles((MCLK_IN_HZ/1000*(x)))void SystemClock_Init(void)
{PMM_setVCore(PMM_CORE_LEVEL_3);     //高主频工作需要较高的核心电压//XT1引脚复用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN4);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN5);//起振XT1UCS_turnOnLFXT1(UCS_XT1_DRIVE_3,UCS_XCAP_3);//XT2引脚复用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);//起振XT2UCS_turnOnXT2(UCS_XT2_DRIVE_4MHZ_8MHZ);//XT2作为FLL参考时钟,先8分频,再50倍频 4MHz / 8 * 50 = 25MHzUCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);UCS_initFLLSettle(25000, 50);//XT1作为ACLK时钟源 = 32768HzUCS_initClockSignal(UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作为MCLK时钟源 = 25MHzUCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作为SMCLK时钟源 = 25MHzUCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//设置外部时钟源的频率,使得在调用UCS_getMCLK, UCS_getSMCLK 或 UCS_getACLK时可得到正确值UCS_setExternalClockSource(32768, 4000000);
}int main(void)
{WDT_A_hold(WDT_A_BASE);SystemClock_Init();WDT_A_initWatchdogTimer(WDT_A_BASE, WDT_A_CLOCKSOURCE_ACLK, WDT_A_CLOCKDIVIDER_32K);GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN1);WDT_A_start(WDT_A_BASE);__bis_SR_register(GIE);while(1){if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){delay_ms(20);if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){WDT_A_resetTimer(WDT_A_BASE);while(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1));}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初学 Unsupervised feature learning and deep learning--Sparse autoencoder

今天做了一下 Stanford CS294A 的一个 programming assignment: sparse autoencoder 因为之前做过 Andrew Ng 的 ml online class 的 neural network 那节的作业,所以这个实现起来就很 easy 了。直接贴代码(all vectorized):1 [d …

【Nginx】Windows平台下配置Nginx服务实现负载均衡

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

PLC基础入门

PLC编程入门基础技术知识学习 2016-06-27 xjp7879 摘自 电工技术知...第一章 可编程控制器简介 可编程序控制器,英文称Programmable Controller,简称PC。但由于PC容易和个人计算机(Personal Computer)混淆,故人们仍习…

Xcode 的正确打开方式——Debugging

2019独角兽企业重金招聘Python工程师标准>>> 程序员日常开发中有大量时间都会花费在 debug 上,从事 iOS 开发不可避免地需要使用 Xcode。这篇博客就主要介绍了 Xcode 中几种能够大幅提升代码调试效率的方式。 “If debugging is the process of removing…

VS Code 调试 PHP有关配置

一、安装VS CODE 、 WampServer 二、用VS Code 打开php项目后,提示 "Cannot validate since no PHP executable is set. Use the setting php.validate.executablePath to configure the PHP executable." 解决方法如下: 在“文件”-“首选项”…

MSP430F5529 DriverLib 库函数学习笔记(十六)比较器B Comp_B

目录硬知识比较器B介绍比较器 B 的特点比较器 B 的结构模拟输入部分比较部分基准电压部分低通滤波部分比较器和普通运放的区别比较器B测量电阻原理利用比较器B实现电容触摸按键原理比较器B控制寄存器COMP_B API (机翻)介绍处理初始化和输出的函数参数处理中断的函数参数处理COM…

深入解析kubernetes controller-runtime

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

数据结构练习 00-自测3. 数组元素循环右移问题 (20)

一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>0)个位置,即将A中的数据由(A0A1……AN-1)变换为(AN-M …… AN-1…

MSP432P401R TI Drivers 库函数学习笔记(一)导入工程模板

目录从Resource Explorer中导入从SDK导入测试平台:Code Composer Studio 10.4.0 MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件 (MSP-EXP432P401R) 从Resource Explorer中导入 本文所用编程平台为Code Composer Studio 10.4.0 启动软件后在Help中打开…

ThreadLocal的简单理解

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

JMS 在 SpringBoot 中的使用

当前环境 Mac OS 10.11.xdocker 1.12.1JDK 1.8SpringBoot 1.5前言 基于之前一篇“一个故事告诉你什么是消息队列”,了解了消息队列的使用场景以及相关的特性。本文主要讲述消息服务在 JAVA 中的使用。 市面上的有关消息队列的技术选型非常多,如果我们的代…

MSP432P401R TI Drivers 库函数学习笔记(二)认识TI-RTOS (TI-POSIX)

目录简介TI-RTOSFreeRTOSPOSIX运行时对象查看器 (Runtime Object Viewer)TI-POSIX 介绍在源代码中使用 POSIXTI-POSIX支持的函数摘要线程函数调用的前后关系线程管理线程属性线程同步障碍属性条件变量条件变量属性互斥锁互斥属性读写锁定读写锁属性辅助函数调用的前后关系时钟消…

arcgis创建postgre企业级数据库

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

[floyd+路径输出]HDU1385 Minimum Transport Cost

题目链接 题目翻译: 有N个城市,然后直接给出这些城市之间的邻接矩阵,矩阵中-1代表那两个城市无道路相连,其他值代表路径长度。 如果一辆汽车经过某个城市,必须要交一定的钱(可能是过路费)。 现在要从a城到b城,花费为路…

MSP432P401R TI Drivers 库函数学习笔记(三)认识任务的创建及图形化配置

目录任务的简单创建图形化配置上手简简单单点个灯配置引脚建立任务实验结果整体代码main.cmyTask.cmyTask.h平台:Code Composer Studio 10.4.0 MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件 (MSP-EXP432P401R) 任务的简单创建 根据上篇机翻的函数作用…

JavaScript实现自适应宽度的瀑布流

摘要: 主要介绍瀑布流的一种实现方法:绝对定位(css)javascriptajaxjson。简单一点如果不做滚动加载的话就是绝对定位(css)javascript了,ajax和json是滚动加载更多内容的时候用到的。 这样的布局并不陌生,从2011年Pinterest创立以来&#xff0…

.net web 开发平台- 表单设计器 一(web版)

如今为了适应需求的不断变化,动态表单设计器应运而生。它主要是为了满足界面的不断变化和提高开发速度。比如:一些页面客户可能也无法确定页面的终于布局,控件的位置,在哪种情况下显示或不显示等可能须要随时改动。为了应对这些需…

.NET程序配置文件操作(ini,cfg,config)

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

MSP432P401R TI Drivers 库函数学习笔记(四)GPIO

目录API头文件函数 (机翻)宏GPIO驱动程序api返回的通用状态代码GPIO_PinConfig输出引脚配置宏GPIO_PinConfig输入引脚配置宏GPIO_PinConfig中断配置宏特殊的GPIO_PinConfig配置宏类型别名示例配置引脚示例配置外部中断示例上机实战配置引脚main.cmyTask.cmyTask.h实验结果平台&…

# Vue3 toRef 和 toRefs 函数

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…