历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-11-12 来源:eefocus

在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. *******************************************************************************/

推荐阅读

史海拾趣

德旭电子(DEXU)公司的发展小趣事

在德旭电子的发展历程中,供应链管理和成本控制一直是公司关注的重点。为了降低生产成本和提高产品质量,公司不断优化供应链管理流程和技术手段。

德旭电子与多家优质供应商建立了长期稳定的合作关系,并通过引入先进的供应链管理软件和系统实现了供应链的数字化和信息化管理。这些措施有效提高了供应链的响应速度和灵活性,降低了库存和运营成本。

在成本控制方面,德旭电子注重精细化管理和持续改进。公司通过优化生产流程、提高生产效率、降低能耗和原材料成本等措施不断降低生产成本。同时,公司还建立了完善的成本管理体系和考核机制确保成本控制工作的有效实施。

All Sensors公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,All Sensors面临着越来越多的挑战。然而,公司始终保持着敏锐的市场洞察力和创新精神。通过与客户紧密合作,仔细聆听客户需求,All Sensors不断开发出适应市场变化的新产品和技术。同时,公司还注重提升产品质量和服务水平,赢得了客户的广泛认可和信赖。

这些故事只是All Sensors在电子行业发展历程中的一部分缩影。作为一家全球领先的传感器技术领军企业,All Sensors将继续秉承创新精神,不断推动电子行业的发展和进步。

FCI connector [富加宜连接器]公司的发展小趣事

FCI Connector的前身可以追溯到1937年成立的费城绝缘体公司(Philadelphia Insulation Company)。这家公司最初专注于电子零件的制造和销售。随着时间的推移,公司在1976年被德州仪器(Texas Instruments)收购,并更名为TI Electronic Components(TIEC)。然而,TIEC在1981年做出了一个重大的战略决策:将连接器业务剥离出来,成立了FCI Connector公司。这一决策让FCI能够更专注于电子连接器的研发、生产和销售,为其后续的快速发展奠定了基础。

恒连电子(EVERCOM)公司的发展小趣事

在恒连电子的发展历程中,技术突破和产品创新始终是公司发展的核心动力。公司投入大量资金和资源进行技术研发,不断推出具有竞争力的新产品。其中,一款具有自主知识产权的智能芯片成为了公司的明星产品,不仅提升了产品的整体性能,还为公司带来了可观的利润。此外,恒连电子还注重产品的多元化发展,不断拓展产品线,满足市场的多样化需求。

Elite Enterprises (H K) Co Ltd公司的发展小趣事

Elite Enterprises (H K) Co Ltd成立于2002年,当时正值LED技术快速发展的时期。公司创始人凭借对LED市场的敏锐洞察,决定专注于LED产品的研发和生产。初期,公司面临资金、技术和市场等多重挑战,但通过不懈努力和持续创新,逐步在LED照明市场崭露头角。

Hoffman_Enclosures__Inc.公司的发展小趣事

Hoffman始终将技术创新视为企业发展的核心驱动力。公司不断投入研发资源,致力于开发更加高效、节能、环保的电气机柜和温控产品。其中,数据中心液体冷却技术的推出,更是引领了行业潮流。Hoffman还积极参与国际标准的制定工作,通过遵循和践行全球行业标准,确保产品的通用性和高质量。这些努力不仅提升了公司的技术实力,也进一步巩固了其在行业内的领先地位。

问答坊 | AI 解惑

关于嵌入式系统--献给热爱此道的初学者们

如何学习嵌入式系统(基于ARM平台) 前言    网上看到众多网友都问了关于嵌入式系统方面的很多问题,很多都可在这里找到答案,希望我的这篇文章能给他们以启发。也请大家不要轻易转载。 一、嵌入式系统的概念     &n ...…

查看全部问答>

热招进行中- LSI 上海研发中心

Please submit your Resume to China.Recruiting@lsi.com 1)  Analog Design Engineer                               D ...…

查看全部问答>

GPRS问题

GPRS通信: S3C2410+ucos-ii操作系统+lwip协议,实现通过GPRS网络将数据传送到远程控制终端,请问由于我要将数据通过GPRS模块MC35I上传到GPRS网络,在经过INTERNET网传输到远程主机,那么我还需要初始化网卡CS8900A吗?…

查看全部问答>

3D电视:赤裸的商业利益诉求?

本帖最后由 jameswangsynnex 于 2015-3-3 20:03 编辑 几年来,我已经从一个技术至上主义者变成技术节制主义者。面对最近轮番炒作的3D电影、3D电视时,我没有任何激动。虽然调研机构DisplaySearch说,2008年3D电视出货70 万台,10年后是这样的:3D ...…

查看全部问答>

ucos系统综合讨论

1:你认为系统最难的是哪个部分2:你是怎么划分任务的3:任务间的同步你是怎么处理的 ucos大家都很熟悉,那么在使用过程中你遇到什么问题了,那么在这里大家可以一同讨论一下!基本上大多数人前期会把精力放到移植上,我认为在开始学习的时候不要 ...…

查看全部问答>

关于KEIL的问题

我在运行一个程序时  出现了下面的情况: The specified DLL was not found: C:\\Keil\\C51\\BIN\\ledkey Continuing without specified peripheral... 请问下要怎么解决啊?…

查看全部问答>

申请LPC1114FP48/301

我来报个名 公司:郑州弘毅电子技术有限公司 徐金荣 地址:郑州高新技术产业开发区玉兰街5号>邮编:450001电话:+86 (0371) 67998610传真:+86 (0371) 67998602网址:www.hongyiinc.com Email:MSN686@hotmail.com…

查看全部问答>

MSP430学习笔记之四:看门狗

看门狗定时器实际上是一个特殊的定时器,它的的功能是当程序运行发生故障时序时能使系统从新启动。其原理就是发生的故障的时间满足规定的定时时间后,产生一个非屏蔽中断,使系统的复位。这样当在调试程序或预计程序运行在某段内部可能瞬时发生时序 ...…

查看全部问答>

提高开关电源带负载能力

自制了一个简单的开关电源,可是带负载能力不行,加上负载电压就掉很多,哪位指点一下。如何提高带负载能力?…

查看全部问答>

内存分配

用ARM处理器     边采集视频边显示,分配一个缓存可以实现吗?…

查看全部问答>