- /* 看门狗是向上计数的,PWM是向下计数的
- 看门狗特征:
- 1)18位自由运行的计数器以防止CPU在延迟时间结束之前发生看门狗定时器复位
- 2)溢出时间间隔可选(2^4 ~ 2^18),溢出时间范围在104ms~26.3168s(如果WDT_CLK为10KHz)
- 3)复位周期=(1/10KHz)*63,如果WDT_CLK=10KHz */
- #include "WDT.h"
- #define DEBUGMSG printf
- void SystemInit(void)
- {
- PROTECT_REG
- (
- PWRCON |= XTL12M_EN; //默认时钟源为外部晶振
- while((CLKSTATUS & XTL12M_STB) == 0); //等待12MHz时钟稳定
- CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟
- /* 使能内部10K时钟 */
- PWRCON |= OSC10K_EN;
- /* 等待10K时钟稳定 */
- while((CLKSTATUS & OSC10K_STB) == 0);
- /* HCLK时钟选择为外部晶振 */
- CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;
- )
- }
- /****************************************
- *函数名称:WatchDogInit
- *输 入:无
- *输 出:无
- *功 能:看门狗初始化
- ******************************************/
- VOID WatchDogInit(VOID)
- {
- PROTECT_REG
- (
- /* 使能看门狗时钟 */
- APBCLK |= WDT_CLKEN;
- /* 设置看门狗时钟源为10K */
- CLKSEL1 = (CLKSEL1 & (~WDT_CLK)) | WDT_10K;
- /* 使能看门狗定时器复位功能 */
- WTCR |= WTRE;
- /* 设置看门狗超时间隔为1740.8ms */
- WTCR &= ~WTIS;
- WTCR |= TO_2T14_CK; //(2^14+1024)*(1000000/10000)=17408*100=1740800us=1.7408s
- /* 使能看门狗中断 */
- WTCR |= WTIE;
- NVIC_ISER |= WDT_INT;
- /* 使能看门狗 */
- WTCR |= WTE;
- /* 复位看门狗计数值 */
- WTCR |= CLRWTR;
- )
- }
-
- /****************************************
- *函数名称:WDT_IRQHandler
- *输 入:无
- *输 出:无
- *功 能:看门狗中断服务函数
- ******************************************/
- VOID WDT_IRQHandler(VOID)
- {
- DEBUGMSG("WDT Reset \r\n"); //打印复位信息
- PROTECT_REG
- (
- WTCR |= WTWKF;
- WTCR |= WTIF;
- )
- }
- /****************************************
- *函数名称:main
- *输 入:无
- *输 出:无
- *功 能:函数主体
- ******************************************/
- INT32 main(VOID)
- {
- SystemInit();
- UartInit(12000000,9600); //波特率设置为9600bps
- WatchDogInit(); //看门狗初始化
- while(1)
- {
- WTCR |= CLRWTR; //喂狗操作
- DEBUGMSG("WDT No Reset \r\n");
- Delayms(50);
- WTCR |= CLRWTR; //喂狗操作
- Delayms(50);
- WTCR |= CLRWTR; //喂狗操作
- Delayms(50);
- WTCR |= CLRWTR; //喂狗操作
- Delayms(50);
- }
- }
|