STM32L4系列的单片机,在stop模式或是standby模式下可以停止看门狗计数器,唤醒后,看门狗继续计数。这样,在单片机休眠期间,就可以不用喂狗,避免单片机频繁唤醒,可以节约更多能耗。
配置需要读写芯片内部的OptionBytes,STM32L4的HAL库提供了操作选项字节的方法。
以下代码配置了两个功能:(1)、配置stop模式停止看门狗计数;(2)、配置启用硬件看门狗(芯片上电后会自动开启看门狗)
注意:慎重使用硬件看门狗功能。如果开机没有配置看门狗计时器,而又打开了硬件看门狗功能,因为芯片默认的看门狗复位计时器值很小,所以系统会一直重启。
切记要配置了看门狗计时器以后再去开硬件看门狗功能。
/* USER CODE BEGIN 0 */void Config_Option_Bytes(){ FLASH_OBProgramInitTypeDef OptionsBytesStruct; //改写option时,芯片首先会自动擦写掉flash里所有option值,然后再写入。 //所以要先把当前值读出来,改变某一位后,再写进去 HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct); if ((OptionsBytesStruct.USERConfig & (FLASH_OPTR_IWDG_STOP | FLASH_OPTR_IWDG_SW)) != 0) { //没有配置过就配置一次,有必要判断一下是否配置过,因为每次配置完都会导致重启,不能每次上电都无条件配置一次 OptionsBytesStruct.OptionType = OPTIONBYTE_USER; OptionsBytesStruct.USERType = OB_USER_IWDG_STOP | OB_USER_IWDG_SW; OptionsBytesStruct.USERConfig &= (~(FLASH_OPTR_IWDG_STOP | FLASH_OPTR_IWDG_SW)); //STOP模式下停止看门狗计数 //使用硬件看门狗(芯片上电后会自动开启看门狗) HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR); HAL_FLASH_OB_Unlock(); if (HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK) { //配置失败,都说重启大法好,我就重启下试试。。。 NVIC_SystemReset(); } HAL_FLASH_OB_Launch(); //加载flash配置,这里会导致重启 // HAL_FLASH_OB_Lock(); // HAL_FLASH_Lock(); }}/* USER CODE END 0 */
注意:
(1)、配置完成后,执行HAL_FLASH_OB_Launch() 时,会导致单片机重启,所以单片机上电时,有必要先判断一下是否配置过,不能每次上电都无条件配置一次,否则单片机会不断重启,程序会跑不起来。
(2)、改写option时,芯片首先会自动擦写掉flash里所有option值,然后再写入。所以要先把当前值读出来,改变某一位后,再写进去。
STM32L4系列的单片机,在stop模式或是standby模式下可以停止看门狗计数器,唤醒后,看门狗继续计数。这样,在单片机休眠期间,就可以不用喂狗,避免单片机频繁唤醒,可以节约更多能耗。
配置需要读写芯片内部的OptionBytes,STM32L4的HAL库提供了操作选项字节的方法。
以下代码配置了两个功能:(1)、配置stop模式停止看门狗计数;(2)、配置启用硬件看门狗(芯片上电后会自动开启看门狗)
注意:慎重使用硬件看门狗功能。如果开机没有配置看门狗计时器,而又打开了硬件看门狗功能,因为芯片默认的看门狗复位计时器值很小,所以系统会一直重启。
切记要配置了看门狗计时器以后再去开硬件看门狗功能。
/* USER CODE BEGIN 0 */void Config_Option_Bytes(){ FLASH_OBProgramInitTypeDef OptionsBytesStruct; //改写option时,芯片首先会自动擦写掉flash里所有option值,然后再写入。 //所以要先把当前值读出来,改变某一位后,再写进去 HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct); if ((OptionsBytesStruct.USERConfig & (FLASH_OPTR_IWDG_STOP | FLASH_OPTR_IWDG_SW)) != 0) { //没有配置过就配置一次,有必要判断一下是否配置过,因为每次配置完都会导致重启,不能每次上电都无条件配置一次 OptionsBytesStruct.OptionType = OPTIONBYTE_USER; OptionsBytesStruct.USERType = OB_USER_IWDG_STOP | OB_USER_IWDG_SW; OptionsBytesStruct.USERConfig &= (~(FLASH_OPTR_IWDG_STOP | FLASH_OPTR_IWDG_SW)); //STOP模式下停止看门狗计数 //使用硬件看门狗(芯片上电后会自动开启看门狗) HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR); HAL_FLASH_OB_Unlock(); if (HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK) { //配置失败,都说重启大法好,我就重启下试试。。。 NVIC_SystemReset(); } HAL_FLASH_OB_Launch(); //加载flash配置,这里会导致重启 // HAL_FLASH_OB_Lock(); // HAL_FLASH_Lock(); }}/* USER CODE END 0 */
注意:
(1)、配置完成后,执行HAL_FLASH_OB_Launch() 时,会导致单片机重启,所以单片机上电时,有必要先判断一下是否配置过,不能每次上电都无条件配置一次,否则单片机会不断重启,程序会跑不起来。
(2)、改写option时,芯片首先会自动擦写掉flash里所有option值,然后再写入。所以要先把当前值读出来,改变某一位后,再写进去。
举报