1,学会在定时器和看门狗模式下操作 WDT,了解 WDT 寄存器的配置
2,编程实现WDT 定时功能,WDT 时钟源来自 ACLK,且 ACLK 无失效来自 XT1
晶体
3,实现功能:250ms 定时,每 250ms LED1 亮灭交替闪烁
1,看门狗介绍
看门狗定时器是一个32位的定时器它可以作为看门狗或定时器使用所有F5XX系列的器件中都有增强型看门狗定时器—WDT_A。
什么是看门狗?
从字面的意思理解,看门狗帮我的系统看门,防止我的系统到处乱跑。在实际嵌入式系统中看门狗也是充当这个角色的。看门狗,简称WDT,很明显它实际上是一个定时器,就如同我们所讲的Timer_A3亦或是Timer_B7系统一样,他们可以实现定时器的基本功能。但是,看门狗不具备Timer_A3或者Timer_B7那么多的计数模式以及输出功能,但是看门狗具有它自己的看家本领---看门---就是在某些时候迫使系统复位,主要是在程序死锁、系统异常等情况下完成强制复位。
看门狗的特性
1、电路里面包含有定时器和时钟源,当定时器计数到一定程度(一般是溢出)后将产生一个特定的信号;
2、在定时器计数的过程中,可以通过某些信号将定时器清零;
3、也可以禁用这个定时器以禁止看门狗功能;
4、另外,从看门狗的功能和应用领域讲,看门狗内部电路不应过于复杂,同时看门狗电路必须具有比处理器更高的稳定性和可靠性。
处理器如何控制看门狗
看门狗内部有定时器,如果MCU不能在一段时间内把看门狗定时器清零它就会发出一个信号。“狠狠地”通知MCU---看门狗很生气,后果很严重---MCU将被RESET。因此,一旦你的系统中添加了看门狗电路,你就一定要格外小心,“不要忽略你身边的任何一条狗”。
因此,一旦电路中添加了看门狗的功能,我们就必须在程序中添加将看门狗定时器清零的代码,这种操作我们称之为喂狗。对于喂狗操作,我们应当注意以下几点:
1、MCU中任何两次喂狗操作之间的时间间隔应小于看门狗的定时周期,如果某一任务的执行周期超过了看门狗的定时周期,需要向其中加入喂狗操作;
2、对于无操作系统的系统来说,喂狗操作只能在主循环中或被主循环调用的程序中执行,不可以在定时器中断服务程序中进行;
3、此外,用户还可以根据自己系统的情况来选择适当的看门狗定时器时间。
2,MSP430F54x的内部看门狗定时器
前面介绍的都是看门狗的一些共性,对于MSP430F54x系列微处理器来说,其内部的看门狗相对来说具有更强大的功能和灵活性:
8种软件可选的定时时间
看门狗工作模式
定时器工作模式
带密码保护的WDT控制寄存器
可选择时钟源
允许关闭以降低功耗
时钟故障保护
看门狗逻辑框图
3,实验原理
WDT 可以工作在两种模式,一.看门够模式,时间一到就产生复位。另一种模式就是普通的定时器模式,对 WDT 寄存器进行配置可以完成不同时间间隔的定时。
如图 上图,看门狗内部是由两个 16 位的计数器组成一个 32 位的计数器来进行定时。计数器计数可以达到 ,当计数数值达到被选择的时间间隔就会使中断标志位为 1,如果工作在看门狗模式下,在看门狗中断标志置 1 同时,也会产生一个复位信号。当看门狗工作在定时器模式下,定时时间到来后就会使定时器中断标志位置 1,如果中断使能打开,就会进入看门狗定时器中断,执行中断程序。
4,寄存器设置
WDTPW :看门狗密钥读出值是0x69,写时必须为0x5A,否则将产生PUC。
WDTHOLD: 关看门狗定时器降低功耗
WDTSSEL:看门狗时钟源
WDTTMSEL:工作模式选择
WDTCNTCL:看门狗计数器清零,当WDTCNTCL=1时,看门狗计数器值就变为0。WDTCNTCL位之后自动复位。
WDTIS :看门狗定时间隔选择。这些位可以选择看门狗的定时时间间隔而触发WDTIFG或者PUC信号,看门狗工作模式决定。
看门狗寄存器有密码保护,因此在要对看门狗进行配置的时候需要写入正确的密码 0x5A,如果密码错误会导致 PUC 复位。默认状态下工作在看门狗模式下,定时 32ms,如果不使用 WDT,可以将 WDTHOLD 位置为高将看门狗关闭,WDTTMSEL 选择定时器模式还是看门狗模式。WDTCNTCL用来清除 32 位计数器数值,WDTCNTCL 用来选择定时间隔。
例如 配置看门狗工作在定时器状态,定时间隔为 1 秒
WDTCTL = WDTPW + WDTTMSEL + WDTCNTCL + WDTSSEL0 + WDTIS2;
5,程序流程
6,实验代码
// 功能: 250ms 定时,每 250ms LED1 亮灭交替闪烁
#include
void Init_Clk(void);
void Init_System(void);
void main(void)
{
Init_System(); // 系统初始化
_EINT(); // 开总中断
__bis_SR_register(LPM3_bits); //进入 LPM3
}
/****** 看门狗中断服务程序************************/
#pragma vector = WDT_VECTOR
__interrupt void watchdog_timer(void)
{
P1OUT ^= BIT0; // LED1 翻转
}
//函数(模块)名称:void Init_System(void)
void Init_System(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关看门狗
Init_Clk(); //初始化时钟
WDTCTL = WDT_ADLY_250; // WDT 250ms, ACLK,
SFRIE1 |= WDTIE; // WDT 中断使能
P1DIR |= BIT0; // 设置 P1。0 为输出
}
//函数(模块)名称:void Init_Clk(void)
void Init_Clk(void)
{
P7SEL |= 0x03; // XT1 起振
P1DIR |= BIT0; // P1.0 输出
UCSCTL1 = DCORSEL_2; // 选择 DCO 频率范围
UCSCTL4 = SELA_0 ; // 设置 MCLK = DCOC,MCLK =DCO,ACLK=XT1
while (SFRIFG1 & OFIFG) //清除 OFIFG,and XT1OFFG ,DCOFFG
{
UCSCTL7 &= ~( XT1LFOFFG + DCOFFG);
SFRIFG1 &= ~OFIFG;
}
}