敏矽微电子Cortex-M0学习笔记14-看门狗复位实例( 二 )
3-2 关闭看门狗通过关闭看门狗时钟来取消看门狗功能 。
void WDT_Deinit(void){SYSCON->SYSAHBCLKCTRL_b.WDT_CLK=0;//关闭看门狗时钟return;}
3-3 看门狗喂狗操作看门狗的喂狗操作 , 依序向寄存器写入0xAA和0x55来进行喂狗 。
void WDT_Feed (void){WDT->FEED_b.WDFEED= 0xAA;WDT->FEED_b.WDFEED= 0x55;return;}
3-4 设置看门狗超时时间设置看门狗的超时时间 , 单位为ms 。 设置的超时时间上限为10 S , 超时后会根据模式产生中断和复位 。
void WDT_SetIntervalinMiliSec(uint32_t ms){volatile uint32_t ticks;//看门狗超时上限为10Sif (ms>10000)ms=10000;SYSCON->WDTOSCCTRL_b.WDTCLKSRC=http://kandian.youth.cn/index/0;SYSCON->WDTOSCCTRL_b.DIVSEL=ms/1600+1;ticks=MainClock/(1000*SYSCON->WDTOSCCTRL_b.DIVSEL);ticks=(ticks*ms)>>2;if (ticks>0xFFFFFF)ticks=0xFFFFFF;//设置看门狗超时时间WDT->TC_b.WDTC=ticks;ticks=0;while(ticks++<0xFFF);return;}
3-5 使能看门狗超时复位使能看门狗的超时复位功能后 , 一旦没有及时喂狗 , 看门狗会触发MCU的复位操作 。
void WDT_EnableResetSystem(void){WDT->MOD_b.WDRESET=1;//使能看门狗超时复位系统return;}
3-6 看门狗锁定执行函数后 , 看门狗会处于锁定状态 , 不可再修改 , 除非系统复位 。
void WDT_EnableLock (void){WDT->MOD_b.WDLOCKCLK=1;WDT->MOD_b.WDLOCKDP=1;WDT->MOD_b.WDLOCKEN=1;return;}
4、看门狗例程接下来写个小例程来测试下看门狗的运行情况 , 程序源码如下 。
int main(void){//初始化串口PA_2_INIT(PA_2_TX0);UART_Open(UART0,9600,UART_NO_PARITY,0);UART_PutString(UART0,"System Reset...");//串口提示系统复位//初始化触摸按键PA_12_INIT(PA_12_TOUCH5);//PA12引脚复用为TOUCH5引脚itouch_init(TOUCH5);//初始化TOUCH5引脚//配置看门狗WDT_Init ();//看门狗初始化WDT_SetIntervalinMiliSec(10000);//设置看门狗超时时间10秒WDT_EnableResetSystem();//看门狗模式设为复位模式WDT_Enable_Timer;//启动看门狗WDT_Feed();//喂狗while (1) {SYS_DelaymS(1000);if(itouch.status//喂狗UART_PutString(UART0,"WatchDog Feed...");//串口提示已喂狗} }}
例程首先对串口进行初始化 , 然后串口输出提示系统复位 。 接下是触摸按键的初始化 , 关于触摸按键的学习在之前的笔记中有讲解 , 想了解的可以回顾下之前的笔记 。 随后就是看门狗的初始化 。 将看门时间设置为10秒钟 , 并且为复位模式 。 最后在while(1)主循环中进行触摸按键的检测 , 当按键按下后 , 进行喂狗操作并串口输出提示 。
程序编译无误后 , 便可以下载仿真调试了 。 这个实验不需要打断点测试 , 直接全速运行即可 。 首先我们不进行任何操作 , 观察串口工具的输出信息 。 通过串口工具记录的接收时间 , 我们发现MCU确实是每隔10秒便复位一次 。
文章插图
图7 运行实例
上面的情况是因为没有及时进行喂狗操作 , 发生了看门狗复位 。 接下来每隔一小段时间 , 便触摸下按键进行喂狗操作 , 此时观察到MCU没有再发生复位 。 而当我们不再去触摸按键喂狗后 , MCU便又发生复位 , 而且距离上次喂狗刚好过去了10秒钟 。
文章插图
【敏矽微电子Cortex-M0学习笔记14-看门狗复位实例】图8 运行实例