历史上的今天

今天是:2024年11月12日(星期二)

2019年11月12日 | STM32 休眠模式下,难道 看门狗和低功耗模式没法同时使用

发布者:PeacefulAura 来源: eefocus关键字:STM32  休眠模式  看门狗  低功耗模式 手机看文章 扫描二维码
随时随地手机看文章

在STM32开发中经常会用到独立看门狗(IWDG)和低功耗模式,看门狗是为了检测和解决由软件错误引起的故障,低功耗模式是为了在CPU不需要继续运行时进入到休眠模式用以节省电能。其中独立看门狗的时钟由独立的RC振荡器(STM32F10x一般为40kHz)提供,即使在主时钟出现故障时,也仍然有效,因此可以在停止和待机模式下工作。而且独立看门狗一旦启动,除了系统复位,它不能再被停止。但这样引发的一个问题是当MCU进入到低功耗模式后由于CPU停止运行无法喂狗,会导致系统频繁复位。那如何解决这个问题呢,难道独立看门狗和低功耗模式没法同时使用?


一个很好的方式是在休眠模式下通过RTC定时唤醒来喂狗,喂完够在进入继续进入到休眠模式。比如看门狗复位的时间间隔为10s。那么在进入休眠模式前设置RTC闹钟中断时间为5s。这样每隔5s唤醒一次喂一次狗。便可以很好的解决这个问题。


  1. while(1)

  2.   {

  3.     // 执行任务

  4.         Task1();

  5.         Task2();

  6.         // ..

  7.  

  8.         // 喂狗

  9.         dev_iwdg_feed();

  10.  

  11.         // 进入待机模式开关

  12.         if(m_bEnterStandByMode)

  13.         {        

  14.             // 使能外部中断,GPIOB3,用以MCU从待机模式唤醒

  15.             dev_exti_enable(TRUE);

  16. ENTERSTOPMODE:        

  17.                 // 设置RTC闹钟,5秒钟产生一次RTC闹钟中断*/

  18.                 dev_rtc_setAlarm(5);

  19.         

  20.                 // 进入停止模式(低功耗),直至外部中断触发时被唤醒

  21.                 PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

  22.         

  23.                 // 是否是RTC闹钟中断唤醒

  24.                 if(dev_rtc_isAlarm())

  25.                 {

  26.                         // 喂狗

  27.                         dev_iwdg_feed();

  28.                         // 喂完狗继续进入停止模式

  29.                         goto ENTERSTOPMODE;        

  30.                 }

  31.                 // 禁止外部中断 

  32.                 dev_exti_enable(FALSE);

  33.                 // 从停止模式唤醒后恢复系统时钟

  34.                 dev_clk_restore();

  35.         }                      

  36.   }

复制代码以下是完整的参考代码:

  1. //**********************************************************************************************     

  2. //  STM32F10x StopMode RTC Feed Dog 

  3. //  compiler: Keil UV3     

  4. //  2013-01-04 , By friehood     

  5. //**********************************************************************************************  

  6. #include "stm32f10x_lib.h"

  7. #include "platform_config.h"

  8. static Boolean g_bRTCAlarm = FALSE;

  9.  

  10. /*******************************************************************************

  11. * Function Name  : RCC_Configuration

  12. * Description    : Configures the different system clocks.

  13. * Input          : None

  14. * Output         : None

  15. * Return         : None

  16. *******************************************************************************/

  17. void RCC_Configuration(void)

  18. {

  19.         /* RCC system reset(for debug purpose) */

  20.         RCC_DeInit();

  21.  

  22.         /* Enable HSE */

  23.         RCC_HSEConfig(RCC_HSE_ON);

  24.  

  25.         /* Wait till HSE is ready */

  26.         if(RCC_WaitForHSEStartUp() == SUCCESS)

  27.         {

  28.                 /* Enable Prefetch Buffer */

  29.                 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  30.  

  31.                 //FLASH时序控制 

  32.         //推荐值:SYSCLK = 0~24MHz   Latency=0 

  33.         //        SYSCLK = 24~48MHz  Latency=1 

  34.         //        SYSCLK = 48~72MHz  Latency=2

  35.                 //FLASH_SetLatency(FLASH_Latency_1);                   //警告:修改为1会对DMA值有影响(如ADC采集值会错位)

  36.                 FLASH_SetLatency(FLASH_Latency_2);

  37.  

  38.                 /* HCLK = SYSCLK */

  39.                 RCC_HCLKConfig(RCC_SYSCLK_Div1); 

  40.  

  41.                 /* PCLK2 = HCLK */

  42.                 RCC_PCLK2Config(RCC_HCLK_Div1); 

  43.  

  44.                 /* PCLK1 = HCLK/2 */

  45.                 RCC_PCLK1Config(RCC_HCLK_Div2);

  46.  

  47.                 /* PLLCLK = 12MHz * 3 = 36 MHz */

  48.                 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_3);

  49.  

  50.                 /* Enable PLL */ 

  51.                 RCC_PLLCmd(ENABLE);

  52.  

  53.                 /* Wait till PLL is ready */

  54.                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

  55.                 {

  56.                 }

  57.  

  58.                 /* Select PLL as system clock source */

  59.                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  60.  

  61.                 /* Wait till PLL is used as system clock source */

  62.                 while(RCC_GetSYSCLKSource() != 0x08)

  63.                 {

  64.                 }

  65.         }

  66.         /* Enable PWR and BKP clock */

  67.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  68.  

  69.         /* Enable AFIO clock */

  70.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

  71. }

  72.  

  73. /*******************************************************************************

  74. * Function Name  : NVIC_Configuration

  75. * Description    : Configures the nested vectored interrupt controller.

  76. * Input          : None

  77. * Output         : None

  78. * Return         : None

  79. *******************************************************************************/

  80. void NVIC_Configuration(void)

  81. {

  82.   NVIC_InitTypeDef NVIC_InitStructure;

  83.  

  84. #ifdef  VECT_TAB_RAM

  85.   /* Set the Vector Table base location at 0x20000000 */

  86.   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

  87. #else  /* VECT_TAB_FLASH  */

  88.   /* Set the Vector Table base location at 0x08000000 */

  89.   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

  90. #endif

  91.  

  92.   /* Configure one bit for preemption priority */

  93.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  94. }

  95.  

  96. /*******************************************************************************

  97. * Function Name  : SysTick_Configuration

  98. * Description    : Configures the SysTick to generate an interrupt each 1 millisecond.

  99. * Input          : None

  100. * Output         : None

  101. * Return         : None

  102. *******************************************************************************/

  103. void SysTick_Configuration(void)

  104. {

  105.   /* Select AHB clock(HCLK) as SysTick clock source */

  106.   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);

  107.  

  108.   /* Set SysTick Priority to 3 */

  109.   NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 0);

  110.    

  111.   /* SysTick interrupt each 1ms with HCLK equal to 72MHz */

  112.   SysTick_SetReload(72000);

  113.  

  114.   /* Enable the SysTick Interrupt */

  115.   SysTick_ITConfig(ENABLE);

  116. }

  117.  

  118. /*******************************************************************************

  119. * Function Name  : Delay

  120. * Description    : Inserts a delay time.

  121. * Input          : nTime: specifies the delay time length, in milliseconds.

  122. * Output         : None

  123. * Return         : None

  124. *******************************************************************************/

  125. void Delay(u32 nTime)

  126. {

  127.   /* Enable the SysTick Counter */

  128.   SysTick_CounterCmd(SysTick_Counter_Enable);

  129.   

  130.   TimingDelay = nTime;

  131.  

  132.   while(TimingDelay != 0);

  133.  

  134.   /* Disable the SysTick Counter */

  135.   SysTick_CounterCmd(SysTick_Counter_Disable);

  136.   /* Clear the SysTick Counter */

  137.   SysTick_CounterCmd(SysTick_Counter_Clear);

  138. }

  139.  

  140.  

  141. /*******************************************************************************

  142. * Function Name  : RTC_Configuration

  143. * Description    : Configures RTC clock source and prescaler.

  144. * Input          : None

  145. * Output         : None

  146. * Return         : None

  147. *******************************************************************************/

[1] [2] [3]
关键字:STM32  休眠模式  看门狗  低功耗模式 引用地址:STM32 休眠模式下,难道 看门狗和低功耗模式没法同时使用

上一篇:stm32 低功耗下使用看门狗(不喂狗)
下一篇:STM32 芯片 IWDG 关闭 停用 方法

推荐阅读

        集微网消息,工信部IMT-2020(5G)无线技术工作组组长粟欣透露6G概念研究将在今年启动。        早在今年4月工业和信息化部部长苗圩在接受媒体采访时表示我国已着手研究6G。明年将会是5G技术的元年,中国三大通信运营商都已全力加快推动5G商用,开展5G相关部署工作。按照移动通讯技术约每10年演进一次,那么2030年将会进入6G时代。...
前些时间,根据路透社报道丰田将采购 5 万套松下的圆柱电池来做 PHEV,主要是卡罗拉(Corolla)和雷凌(Levin)的 PHEV 上。由于这款车的信息不多,现在网上有比较细节的信息发布出来,我做一些整理。这款电池系统确实是基于 18650 的电芯来做的,15 个电芯并联,然后 4 组串联形成一个模组。一共分成了 20 个模组,分成四个区块分总成。 60...
Microchip公司MCU16市场工程师Harsha Jagadish在接受BIS Niloy的专访时表示,随着越来越多的设备连接到互联网上,主要的云提供商鼓励使用安全认证来保护私钥。各国政府也在制定标准和即将出台的立法,要求使用安全的设计。Microchip在物联网领域的专长是什么?嵌入式应用越来越需要连接,对于微控制器的需求也在不断增加,它要求更灵活,并提供适当的智...
一、硬件上的连接问题如果使用内部RC振荡器而不使用外部晶振,请按照如下方法处理:1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。2)对于少于100脚的产品,有2种接法: i)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。 ii)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。此方法可以减...

史海拾趣

问答坊 | AI 解惑

LDO和DC-DC器件的区别

DCDC的意思是直流变(到)直流(不同直流电源值的转换),只要符合这个定义都可以叫DCDC转换器,包括LDO。但是一般的说法是把直流变(到)直流由开关方式实现的器件叫DCDC。     LDO是低压降的意思,这有一段说明:低压降(LDO ...…

查看全部问答∨

一个LED的N种玩法

 欢迎讨论     一个LED的N种玩法(一)——让LED闪起来https://bbs.eeworld.com.cn/viewthread.php?tid=103121   一个LED的N种玩法(二)——渐变https://bbs.eeworld.com.cn/viewthread.php?tid=103168   一个LED的 ...…

查看全部问答∨

工程师们看过来——电气测量时,聪明人所做的10件糊涂事

本人搜集到的一篇很好的文章,因此转载给各位大虾,希望对工程师们有所帮助: 何靠与电打交道来谋生的人很快都会对任何“带电”的物体生出理性的敬意,哪怕是“带电”的机会很小。然而,需要按时完成一项工作或者使某个关键设备恢复联机的紧迫压力 ...…

查看全部问答∨

usb声卡枚举问题求助

我在调一块usb声卡,枚举的时候set config之后为什么会set idle,然后stall pid,哪位帮忙看一下问题出在哪儿好吗,多谢。下面是用bus hound抓的包。 21.0  CTL    21 01 00 02  00 08 02 00     & ...…

查看全部问答∨

关于WINCE系统兼容性求助!

小弟刚接触WINCE系统想知道在Xp操作系统下面用C#开发的程序打包安装到WINCE下有什么问题吗.兼容性有要求吗?  比如说我用的SQL SERVER数据库和C#来开发的程序,可以安装到WINCE里面吗?是不是在WINCE里面也要安装Sql ...…

查看全部问答∨

请高手帮忙~~~在EVC下的2个函数没定义.

error C2065: \'GetRunningObjectTable\' : undeclared identifier error C2065: \'CreateItemMoniker\' : undeclared identifier 我用的是EVC 4.0+SP4…

查看全部问答∨

【求助】【原创】关于写片。求教!

今天开始搭了个板子,板子是电源板,上面有高频变压器2个,瓷珠和电感8个。调试OK,给板子写程序,总是不顺,报错现象如: An error occoured: "Could not write target memory" Messages: Mass Erase... Program... 还有滴:联接不了目标 ...…

查看全部问答∨

基于STM32的485通讯

void UART3Init(void){        GPIO_InitTypeDef GPIO_InitStructure;        USART_InitTypeDef USART_InitStructure;         RC ...…

查看全部问答∨

智能家居成品

请问这个智能家居现在有做出成品的了吗,一套大概要多少钱?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved