你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

跪求各路大神,STM32L072 睡眠模式、停止模式切换使用报硬...

[复制链接]
nbh520 提问时间:2017-7-21 10:40 /
本帖最后由 nbh520 于 2017-7-27 10:06 编辑

目前在使用STM32L072xx芯片的过程中,在低功耗模式的使用中遇到一些很难缠的问题,我选择了睡眠模式和停止模式两种低功耗模式同时使用的方式。


    当使用按键,不停的触发外部中断时,有时会出现如下问题:
    1、退出停止模式时,初始化外部高速时钟HSE时,初始化失败
    2、退出睡眠模式时,发生硬件错误
    3、使用keil调试时,进入、退出的是睡眠函数,但是调用的内容却是停止函数的内容。



相关配置的代码如下,求大神指教

  1. /**系统时钟配置函数**/
  2. void SystemClock_Config(void)
  3. {
  4.     RCC_ClkInitTypeDef RCC_ClkInitStruct ={0};
  5.     RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  6.     RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct = {0};

  7.     /* Enable Power Control clock */
  8.     __HAL_RCC_PWR_CLK_ENABLE();
  9.    
  10.     /* The voltage scaling allows optimizing the power consumption when the device is
  11.     clocked below the maximum system frequency, to update the voltage scaling value
  12.     regarding system frequency refer to product datasheet.  */
  13.     __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
  14.    
  15.     /* Disable Power Control clock */
  16.     __HAL_RCC_PWR_CLK_DISABLE();

  17.     /* Enable HSE Oscillator */
  18.     RCC_OscInitStruct.OscillatorType  = RCC_OSCILLATORTYPE_HSE;
  19.     RCC_OscInitStruct.HSEState        = RCC_HSE_ON;
  20.     RCC_OscInitStruct.PLL.PLLSource   = RCC_PLLSOURCE_HSE;
  21.     RCC_OscInitStruct.PLL.PLLState    = RCC_PLL_ON;
  22.     RCC_OscInitStruct.PLL.PLLMUL      = RCC_PLLMUL_3;
  23.     RCC_OscInitStruct.PLL.PLLDIV      = RCC_PLLDIV_3;
  24.     if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
  25.     {
  26.         MY_ERROR_CHECK(HAL_RCC_OS_CONFIG_FAILED);
  27.     }
  28.    
  29.     /*Select PLL 48 MHz output as USB clock source */
  30.     PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
  31.     PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL;
  32.     //HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
  33.    
  34.     /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
  35.     clocks dividers */
  36.     RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  37.     RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  38.     RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  39.     RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;  
  40.     RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;  
  41.     if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1)!= HAL_OK)
  42.     {
  43.         MY_ERROR_CHECK(HAL_RCC_CLOCK_CONFIG_FAILED);
  44.     }
  45. }

  46. /**低功耗模式初始化配置函数**/
  47. void low_power_handle_init(void)
  48. {
  49.   /******************************低功耗模式配置*********************************/
  50.   /* Enable Power Control clock */
  51.   __HAL_RCC_PWR_CLK_ENABLE();

  52.   /* Enable Ultra low power mode */
  53.   HAL_PWREx_EnableUltraLowPower();
  54.   
  55.   /* Enable the fast wake up from Ultra low power mode */
  56.   HAL_PWREx_EnableFastWakeUp();

  57.   /* Select MSI as system clock source after Wake Up from Stop mode */
  58.   __HAL_RCC_WAKEUPSTOP_CLK_CONFIG (RCC_STOP_WAKEUPCLOCK_MSI);         

  59.   //í£?1?£ê?£??ú??μ÷ê?
  60.   #if ONLINE_DEBUG_STOP_MODE
  61.   __HAL_RCC_DBGMCU_CLK_ENABLE();
  62.   DBGMCU->CR |= DBGMCU_CR_DBG_STOP;         
  63.   #endif
  64. }

  65. /**进入低功耗模式函数**/
  66. void PreSleepProcessing(uint32_t * ulExpectedIdleTime, uint32_t uncplt_tick, uint32_t low_power_mode)
  67. {
  68.     if(low_power_mode == (uint32_t)SYSTEM_SLEEP_MODE)
  69.     {
  70.         HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

  71.             *ulExpectedIdleTime = 0;                                          
  72.     }
  73.     else if(low_power_mode == (uint32_t)SYSTEM_STOP_MODE)
  74.     {
  75.         u32_t lptim_tick = 0;

  76.         //系统时钟频率16M
  77.         //唤醒启动时间补偿1.48ms,此外补偿1tick中已经执行的时间(如1ms已经执行了300us)
  78.         lptim_tick = (uint64_t)((*ulExpectedIdleTime - 2) *1000 + uncplt_tick - 480) * 32768 / 1000000ul;//(*ulExpectedIdleTime * 32768ul/1000)

  79.         //启动计数器
  80.         if (HAL_LPTIM_Counter_Start_IT(&LptimHandle, lptim_tick) != HAL_OK)
  81.         {
  82.             MY_ERROR_CHECK(HAL_LPTIM_START_FAILED);
  83.         }        
  84.                   
  85.         /* Enter Stop Mode */
  86.         HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);   
  87.         SystemClock_Config();   
  88.     }
  89.    
  90.     *ulExpectedIdleTime = 0;   
  91. }
复制代码



收藏 评论5 发布时间:2017-7-21 10:40

举报

5个回答
Inc_brza 回答时间:2017-7-21 12:31:09
建议楼主把程序格式排版好,不然网友们很难帮到你,建议用<>来装你的代码
nbh520 回答时间:2017-7-21 15:06:43
Inc_brza 发表于 2017-7-21 12:31
建议楼主把程序格式排版好,不然网友们很难帮到你,建议用来装你的代码

非常感谢大哥的提醒,作为论坛的新人,请多多关照。
xmshao 回答时间:2017-7-21 16:29:38
你可以一个个来嘛,比方先调STOP模式,让它正常运作。这个官方都有参考代码的。

另外你提到HSE初始化失败,这个失败或许表明它的起振还未完全正常化,相关元件参数可能还需
进一步调整确认。
nbh520 回答时间:2017-7-21 17:25:31
xmshao 发表于 2017-7-21 16:29
你可以一个个来嘛,比方先调STOP模式,让它正常运作。这个官方都有参考代码的。

另外你提到HSE初始化失败 ...

非常感谢你的意见。

STOP模式和SLEEP模式,最初我是分开调的,调得基本上没有问题,才一起调试的。
HSE初始化失败的原因已经找到了,是因为在进入STOP模式之前,产生了EXTI挂起中断,所以并没有能够给进入STOP模式,自然也就不需要重新配置时钟。
xmshao 回答时间:2017-7-23 17:20:15
nbh520 发表于 2017-7-21 17:25
非常感谢你的意见。

STOP模式和SLEEP模式,最初我是分开调的,调得基本上没有问题,才一起调试的。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版