|

楼主 |
发表于 2021-10-20 09:46:52
|
显示全部楼层
程序启动了 IWDT 跟低功耗定时器以后,死机的概率就比较高,关掉独立看门狗跟低功耗定时器以后出现死机的概率就几乎可以忽略了,
低功耗定时器是用来唤醒 MCU,喂IWDT,因为 IWDT 不能唤醒 MCU
下面是看门狗初始化跟休眠程序
- // IWDT 初始化
- void MF_IWDT_Init(void)
- {
- FL_IWDT_InitTypeDef IWDT_InitStruct;
- IWDT_InitStruct.overflowPeriod = FL_IWDT_PERIOD_4000MS;
- IWDT_InitStruct.iwdtWindows = 0;
-
- FL_IWDT_EnableFreezeWhileSleep(IWDT);
- FL_IWDT_Init(IWDT, &IWDT_InitStruct);
- /*Start Of Interrupt Initialization*/
- //FL_IWDT_ClearFlag_EnterWindow(IWDT);
- //FL_IWDT_EnableIT_EnterWindow(IWDT);
- /*End Of Interrupt Initialization*/
- }
复制代码- /**
- * @brief LPTIM32 Initialization function
- * @param void
- * @retval None
- */
- void MF_LPTIM32_Init(void)
- {
- /*IO CONFIG*/
- FL_LPTIM32_InitTypeDef defaultInitStruct;
- defaultInitStruct.clockSource = FL_RCC_LPTIM32_CLK_SOURCE_LPOSC; /*<! 32KHz */
- defaultInitStruct.prescalerClockSource = FL_LPTIM32_CLK_SOURCE_INTERNAL;
- defaultInitStruct.prescaler = FL_LPTIM32_PSC_DIV2;
- defaultInitStruct.autoReload = 30000;
- defaultInitStruct.mode = FL_LPTIM32_OPERATION_MODE_NORMAL;
- defaultInitStruct.onePulseMode = FL_LPTIM32_ONE_PULSE_MODE_CONTINUOUS;
- defaultInitStruct.countEdge = FL_LPTIM32_ETR_COUNT_EDGE_RISING;
- defaultInitStruct.triggerEdge = FL_LPTIM32_ETR_TRIGGER_EDGE_RISING;
- FL_LPTIM32_Init(LPTIM32,&defaultInitStruct );
- FL_LPTIM32_EnableIT_Update(LPTIM32 );
- FL_LPTIM32_Enable(LPTIM32);
- }
复制代码- // 休眠程序
- void gotoSleep()
- {
- if (FL_RTC_IsEnabledIT_Second(RTC))
- {
- FL_RTC_DisableIT_Second(RTC);
- //NVIC_DisableIRQ(RTC_IRQn);
- }
-
- EEP_POWER_OFF();
- FL_LCD_Disable(LCD);
- FL_RMU_PDR_Enable(RMU);
- FL_RMU_BORPowerDown_Disable(RMU);
- FL_PMU_SetLowPowerMode(PMU,FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP);
- __WFI();
- if (functionStatus.sleep!=0)
- FL_LCD_Enable(LCD);
- }
复制代码- /**
- * @brief WWDT Initialization function
- * @param void
- * @retval None
- */
- void myWWDTInit()
- {
- FL_WWDT_InitTypeDef myWWDTInitStruc;
- myWWDTInitStruc.overflowPeriod = FL_WWDT_PERIOD_1024CNT;
- FL_WWDT_Init(WWDT,&myWWDTInitStruc);
- }
复制代码
- // 喂狗程序
- void cleanWDT()
- {
- uint32_t dwdtcount;
- dwdtcount = FL_WWDT_ReadCounter(WWDT);
- if (dwdtcount>=512)
- FL_WWDT_ReloadCounter(WWDT);
- dwdtcount = FL_IWDT_ReadCounter(IWDT);
- if (dwdtcount>=512)
- FL_IWDT_ReloadCounter(IWDT);
- }
复制代码
|
|