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

STM32L05x系列 STOP模式 GPIO唤醒 待机电流为22uA

[复制链接]
McDong 发布时间:2018-8-27 16:15
今年7月底首次接触的STM32系列,搭环境,调试串口输出"Hello World",遇到了好些个问题,都一一解决了。
期间出差了一周,回来把目前在做的NB项目串口部分调试完成了,接下来开始做低功耗了。
看了许多前人留下的经验,结合自己的工程;
  1.   /* Initialize all configured peripherals */
  2.   MX_GPIO_Init();
  3.   MX_LPUART1_UART_Init();
  4.   MX_TIM2_Init();
  5.   MX_TIM21_Init();
  6.   MX_TIM22_Init();
  7.   /* USER CODE BEGIN 2 */
  8.         __HAL_UART_ENABLE_IT(&hlpuart1,UART_IT_RXNE);       
  9.         __HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);
  10. //        __TS2115M_NB_Init_();                //NB模块初始化入网
  11.        
  12.   /* USER CODE END 2 */

  13.   /* Infinite loop */
  14.   /* USER CODE BEGIN WHILE */
  15.   while (1)
  16.   {

  17.   /* USER CODE END WHILE */

  18.   /* USER CODE BEGIN 3 */
  19.                 if(Menci_Exti){
  20.                         Menci_Exti = 0;
  21.                         HAL_UART_MspInit(&hlpuart1);
  22.                         HAL_UART_Transmit_IT(&hlpuart1,"Wake Up From StopMode",21);
  23.                         HAL_Delay(20);
  24.                         Clear_Mcu_Rec();
  25.                         HAL_Delay(5000);
  26.                         HAL_UART_Transmit_IT(&hlpuart1,"Enter StopMode",14);
  27.                         HAL_Delay(20);
  28.                         /**************************进入停机模式***************************/
  29.                         HAL_UART_MspDeInit(&hlpuart1);                //关闭串口时钟,复位串口引脚
  30.                         HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_SLEEPENTRY_WFI);
  31.                 }
  32.                 if(lpuart_time_over){
  33.                         if((lpuart_buf[0] == 'A')&&(lpuart_buf[1] == 'B')){
  34.                                 HAL_UART_Transmit_IT(&hlpuart1,"Enter StopMode",15);
  35.                                 HAL_Delay(20);
  36.                                 HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
  37.                         }
  38.                         else{
  39.                                 HAL_UART_Transmit_IT(&hlpuart1,lpuart_buf,lpuart_buf_len);
  40.                                 HAL_Delay(20);
  41.                         }
  42.                         Clear_Mcu_Rec();
  43.                 }
  44.   }
  45.   /* USER CODE END 3 */
复制代码
  1. static void MX_GPIO_Init(void)
  2. {

  3.   GPIO_InitTypeDef GPIO_InitStruct;

  4.   /* GPIO Ports Clock Enable */
  5.   __HAL_RCC_GPIOB_CLK_ENABLE();
  6.   /*Configure GPIO pin : PB14 */
  7.   GPIO_InitStruct.Pin = GPIO_PIN_14;
  8.   GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  9.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  10.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  11.   /* EXTI interrupt init*/
  12.   HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
  13.   HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);

  14. }
复制代码
以上是CubeMx生成代码,我以GPIOB_14作为外部中断引脚进行Stop模式的唤醒,程序能顺利进入Stop模式及成功唤醒。但是Stop模式下的电流高达22uA,与预期不大相符。看了网上许多帖子及自己的实践,发现问题出在好多人都讲到的IO端口设置上面,改动如下
  1. static void MX_GPIO_Init(void)
  2. {

  3.   GPIO_InitTypeDef GPIO_InitStruct;

  4.   /* GPIO Ports Clock Enable */
  5.   __HAL_RCC_GPIOA_CLK_ENABLE();
  6.   __HAL_RCC_GPIOB_CLK_ENABLE();
  7.   __HAL_RCC_GPIOC_CLK_ENABLE();
  8.   __HAL_RCC_GPIOH_CLK_ENABLE();

  9.         GPIOA->MODER = 0xFFFFFFFF;
  10.         GPIOC->MODER = 0xFFFFFFFF;
  11.         GPIOH->MODER = 0xFFFFFFFF;
  12.        
  13.   /*Configure GPIO pin : PB14 */
  14.   GPIO_InitStruct.Pin = GPIO_PIN_14;
  15.   GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  16.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  17.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  18.        
  19.         __HAL_RCC_GPIOA_CLK_DISABLE();
  20.         __HAL_RCC_GPIOC_CLK_DISABLE();
  21.         __HAL_RCC_GPIOH_CLK_DISABLE();
  22.        
  23.   /* EXTI interrupt init*/
  24.   HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
  25.   HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);

  26. }
复制代码
改动完成之后,电流顺利的下降到了,Stop模式下2.2uA,虽然离手册上的1uA还有距离,但是已接近预期的功耗了。下面附图:测试Stop模式电流时,为去除不必要的因素,我只焊接了Mcu进行调试的。
IMG_3416[1].JPG
收藏 1 评论10 发布时间:2018-8-27 16:15

举报

10个回答
robin_zhu 回答时间:2018-8-27 17:14:32

谢谢分享。。。
ap0405209 回答时间:2018-8-28 10:51:53
请问楼主能否把唤醒的部分也列出来呢
butterflyspring 回答时间:2018-8-28 15:22:25
进入stop之前没有重新配置管脚?唤醒后没有重新配置sysclk?
McDong 回答时间:2018-8-28 15:37:06
butterflyspring 发表于 2018-8-28 15:22
进入stop之前没有重新配置管脚?唤醒后没有重新配置sysclk?

我是在初始化的时候,把不用的io时钟都关闭了,io管脚设置成AIN。唤醒后,没有重新配置时钟,发现也能正常走程序,所以也没有重新配置
McDong 回答时间:2018-8-28 15:41:54
ap0405209 发表于 2018-8-28 10:51
请问楼主能否把唤醒的部分也列出来呢

IO配置代码,上面有。下面是中断代码
  1. void EXTI4_15_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN EXTI4_15_IRQn 0 */
  4.         if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_14) != RESET){
  5.     __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_14);
  6.                 Menci_Exti = 1;
  7.         }
  8.   /* USER CODE END EXTI4_15_IRQn 0 */
  9. //  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
  10.   /* USER CODE BEGIN EXTI4_15_IRQn 1 */

  11.   /* USER CODE END EXTI4_15_IRQn 1 */
  12. }
复制代码

我就设置了一个PB14的io上升沿中断,进入stop前 除了这个GPIOB 的 时钟没关闭外,其他外设都关闭,正常进入Stop模式后,给PB14一个高电平,Mcu就唤醒了
freeelectron 回答时间:2018-8-28 19:02:36
22uA大了吧
robin_zhu 回答时间:2018-8-31 08:58:41
谢谢分享...
单片机爱好者 回答时间:2019-8-12 16:33:44
测试不严谨,还有串口连接着~~~~~~~~~~~
风过无痕 回答时间:2020-3-10 20:01:28
牛~~~~~~~~~~
radio2radio 回答时间:2020-3-10 20:48:59
DMM的准确度,够不够用。

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版