- const WDT_CONFIG_T wdtConfig =
- {
- .clkSrc = WDT_LPO_CLOCK, //时钟源为128KHz LPO
- .updateEnable = true,
- .intEnable = true, //使能WDT中断,延长系统复位时间
- .timeoutValue = 64000U,
- .windowEnable = true, //开启窗口模式
- .windowValue = 30000U,
- .prescalerEnable = false, //不分频
- .opMode =
- {
- false, /* Wait Mode */
- false, /* Stop Mode */
- false /* Debug Mode*/
- }
- };
2.2 利用滴答时钟中断进行喂狗- void SysTick_Handler(void)
- {
- if (WDT_ReadCounter(WDT_INSTANCE) > wdtConfig.windowValue) //判断计数器值在窗口内,就进行喂狗
- {
- /* Reset Watchdog counter */
- INT_SYS_DisableIRQGlobal();
- WDT_HW_Refresh(WDT); //特定的时序,进行喂狗
- INT_SYS_EnableIRQGlobal();
- printf("Feed WDT \r\n");
- }
- }
2.3 WDT中断函数- void WDT_EWDT_IRQHandler(void)
- {
- if(WDT->CSTS.reg & 0x4000) //Watchdog Interrupt Flag
- {
- while(1)
- {
- GPIOD->PLLOT.reg = (1U << 16U);//翻转PD16,观察波形的输出时间,即可测试出系统复位延时时间
- }
- }
- }
2.4 main函数主体逻辑- if(POWER_SYS_ReadResetSrcStatus(RMU, RMU_BY_WATCH_DOG) == true)//判断复位源是不是看门狗引起的系统复位
- {
- printf("******************************** \r\n");
- printf("Reset by WDT, disable WDT now \r\n");
- WDT_DeInit(WDT_INSTANCE);
- LED_On(LED_RED);
- }
- else
- {
- SysTick_Init();
- status = WDT_Init(WDT_INSTANCE, &wdtConfig);
- if(status == STATUS_SUCCESS)
- {
- LED_On(LED_GREEN);
- }
- }
- while(1)
- {
- /* Put down KEY1, disable the systick */
- if (BTN_GetState(BUTTON_KEY1) == 0)
- {
- G32_SysTick->CSR.reg = 0U; //停止喂狗
- }
- }
2.5 测试情况
本实验的BUS_CLOCK(总线时钟)是48MHz,128个BUS_CLOCK 就约等于2.6us。
实测符合预期。

2.6 使能RMU中断,再次延长系统复位时间
RMU中断函数
- void RMU_IRQHandler(void)
- {
- if(WDT->CSTS.reg & 0x4000) //Watchdog Interrupt Flag
- {
- while(1)
- {
- GPIOD->PLLOT.reg = (1U << 16U);
- }
- }
- }
main函数主体逻辑代码
- if(POWER_SYS_ReadResetSrcStatus(RMU, RMU_BY_WATCH_DOG) == true)
- {
- printf("******************************** \r\n");
- printf("Reset by WDT, disable WDT now \r\n");
- WDT_DeInit(WDT_INSTANCE);
- LED_On(LED_RED);
- }
- else
- {
- SysTick_Init();
- status = WDT_Init(WDT_INSTANCE, &wdtConfig);
- if(status == STATUS_SUCCESS)
- {
- LED_On(LED_GREEN);
- }
- INT_SYS_DisableIRQ(WDT_EWDT_IRQn); //失能WDT中断
- RMU->RSTIEN.reg = 0x00A3; //配置系统复位延长时间,514 LPO cycles(≈4ms,128kHz)
- INT_SYS_EnableIRQ(RMU_IRQn); //使能RMU中断
- }
- while(1)
- {
- /* Put down KEY1, disable the systick */
- if (BTN_GetState(BUTTON_KEY1) == 0)
- {
- G32_SysTick->CSR.reg = 0U;
- }
- }
测试情况:
系统复位延时时间:514 LPO cycles约等于4ms。
实测符合预期。
