讲解下看门狗的定时中断功能。既然提到了定时功能,那就需要先介绍下看门狗的时钟系统。
看门狗定时器模块使用两个时钟:PCLK和WDCLK。PCLK由系统时钟生成,供APB 访问看门狗寄存器使用。WDCLK由看门狗时钟振荡器中的wdt_clk生成,供看门狗定时器计数使用。wdt_clk时钟可以从IRC和看门狗振荡器中选择一个作为时钟源。
这两个时钟源之间存在一些同步逻辑。当MOD和TC寄存器通过APB操作更新时,新的值将由WDCLK时钟设定并生效。当看门狗定时器处于WDCLK时钟周期时,同步逻辑会先锁定WDCLK上计数器的值,然后使其与PCLK同步,以作为TV寄存器的值供 CPU 读取。
2、看门狗中断
首先介绍下看门狗警告中断比较值寄存器(WDWARNINT寄存器),它决定产生看门狗警告中断的看门狗定时器值。当计数器的低10位与WARNINT的10位具有相同值,且计数器其余高位均为0时,便触发看门狗警告中断。如例图所示,设置看门狗中断比较值寄存器的定时值位0x3FF,当看门狗计数器到03FF时,看门狗中断触发。
图1 看门狗中断
除了看门狗警告中断之外,还有看门狗超时中断。这个是通过看门狗模式寄存器的WDRESET位置1,来选择看门狗超时引发中断。模式寄存器的WDTOF位就是看门狗超时标志位。在看门狗超时、发生喂狗错误或当 WDPROTECT=1 且尝试向 WDTC 寄存器写入时,便会设置看门狗超时标志。通过软件向此位写入 0 可将该标志清零。 WDTOF 位置 1,都可以触发中断。在任何情况下,非看门狗超时引起的看门狗超时标志置位都不会触发系统复位。
3、看门狗中断例程
接下来写个小例程来测试下看门狗定时中断功能的运行情况,程序源码如下。
int main(void)
{
//初始化串口
PA_2_INIT(PA_2_TX0);
UART_Open(UART0,9600,UART_NO_PARITY,0);
UART_PutString(UART0,“System Reset.。。”);//Send System Inital String
WDT_Init ();//看门狗初始化
WDT_SetIntervalinMiliSec(4000);//设置看门狗超时时间4秒
WDT-》WARNINT_b.WARNINT = 0x3FF;//警告中断定时值设置为最大值,方便演示
NVIC_EnableIRQ(WDT_IRQn);//设置看门狗NVIC中断
WDT_Enable_Timer;//启动看门狗
WDT_Feed();//喂狗
while(1);
}
void WDT_IRQHandler(void)//看门狗中断服务子程序
{
if(WDT-》MOD_b.WDINT == 1)//警告中断
{
WDT_Feed();
UART_PutString(UART0,“WDT Warning Int.。。”);
UART_ByteWrite(UART0,‘\n’);
}
if(WDT-》MOD_b.WDTOF == 1)//超时中断
{
WDT_Feed();
UART_PutString(UART0,“WDT Timeout Int.。。”);
UART_ByteWrite(UART0,‘\n}
WDT_ClearIntFlag();//清除看门狗中断
return;
}
例程首先对串口进行初始化,然后串口输出提示系统复位。随后就是看门狗的初始化。将看门时间设置为4秒钟,并且为中断模式。并且使能看门狗中断。在看门狗中断服务程序中,根据触发的中断不同,输出相应的提示信息。
程序编译无误后,便可以下载仿真调试了。首先全速运行,看下串口输出的信息。根据输出的信息我们发现只有看门狗警告中断信息输出,并没有超时中断信息。这是因为在警告中断发生后及时进行了喂狗操作。所以看门狗并不会超时。
图2 看门狗中断实例1
接下来我们可以把看门狗警告中断的喂狗函数WDT_Feed()屏蔽掉,然后再下载仿真看看效果。这时候我们就会看到看门狗超时中断的信息输出。因为警告中断后没有及时喂狗操作,导致看门狗超时发生。
图3 看门狗中断实例2
责任编辑人:CC
-
看门狗
+关注
关注
10文章
559浏览量
70730 -
定时中断
+关注
关注
0文章
19浏览量
8547
发布评论请先 登录
相关推荐
评论