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

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

[复制链接]
McDong 发布时间:2018-8-27 16:15
今年7月底首次接触的STM32系列,搭环境,调试串口输出"Hello World",遇到了好些个问题,都一一解决了。! Q& [1 R5 d& V9 m8 F
期间出差了一周,回来把目前在做的NB项目串口部分调试完成了,接下来开始做低功耗了。
6 s' t- w- p8 j9 K6 g看了许多前人留下的经验,结合自己的工程;' f5 l( L) `( F5 y. D. J7 t' y" l
  1.   /* Initialize all configured peripherals */5 h  V0 K0 S3 l3 u
  2.   MX_GPIO_Init();
    $ V) W3 }* r+ G* A& i: U! H
  3.   MX_LPUART1_UART_Init();$ J) D/ |6 \! H: b0 T; A
  4.   MX_TIM2_Init();
    6 d/ G, k5 d! m. D) K+ L7 s
  5.   MX_TIM21_Init();
    1 Y" X0 Q- |8 i5 p# ?. X
  6.   MX_TIM22_Init();
    2 N( e) X4 D2 u' i
  7.   /* USER CODE BEGIN 2 */' O# ?6 X: B/ Z& X8 ]. X
  8.         __HAL_UART_ENABLE_IT(&hlpuart1,UART_IT_RXNE);        0 E- \* `* b6 h! Y) Q4 L
  9.         __HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);
    / }. _. d( q  S/ ]7 U
  10. //        __TS2115M_NB_Init_();                //NB模块初始化入网  Z+ W7 Y- N6 _+ b3 ^; O( B, c  h
  11.        
    & U* ~- I" z: e% D
  12.   /* USER CODE END 2 */
    . l+ b1 B" p6 z2 G0 T
  13. * ?7 P& x0 S8 O) y, F
  14.   /* Infinite loop */8 D3 o; ^$ [: n: B8 x1 E% ?6 w
  15.   /* USER CODE BEGIN WHILE */
    ) N5 c; v$ r- T2 P, i% s" _
  16.   while (1)' ?) ]9 V' T2 p0 i5 @- b
  17.   {
    3 r; h4 a, I& ^6 R3 `6 c
  18. 3 K  Q; D. Q6 }6 \; n- s
  19.   /* USER CODE END WHILE */
    1 w$ {% C0 U2 A  R2 Z8 D
  20. , o. A6 H" _; \2 x
  21.   /* USER CODE BEGIN 3 */3 P2 u  y4 p# l+ O" K+ G2 _+ D
  22.                 if(Menci_Exti){
    % ]$ d0 G. o- o' ?; r# Y
  23.                         Menci_Exti = 0;
    . R( n2 V9 r4 a, b( r# `5 b- R: R
  24.                         HAL_UART_MspInit(&hlpuart1);% a4 }! b8 f0 J4 Y/ w) ?
  25.                         HAL_UART_Transmit_IT(&hlpuart1,"Wake Up From StopMode",21);0 |3 M0 T/ |( ]; z. |
  26.                         HAL_Delay(20);& N  n. \$ I# U+ C% j, l: V9 @
  27.                         Clear_Mcu_Rec();
    . T1 g2 T# T5 W2 b5 _) D4 P
  28.                         HAL_Delay(5000);
    ) h. ]) k7 Y* U) j
  29.                         HAL_UART_Transmit_IT(&hlpuart1,"Enter StopMode",14);
    , h0 t6 ^0 H+ d/ M% B* D
  30.                         HAL_Delay(20);& y$ Z, o4 C, X# F
  31.                         /**************************进入停机模式***************************/5 v4 ~0 p% C6 G
  32.                         HAL_UART_MspDeInit(&hlpuart1);                //关闭串口时钟,复位串口引脚; f: U& b  S# R' b' m* w
  33.                         HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_SLEEPENTRY_WFI);
    1 G" i" P- W- d) m8 x7 k& }
  34.                 }
    ) e8 A* Z7 {. d0 x3 l
  35.                 if(lpuart_time_over){
    4 c! X- e5 A# i$ c5 Z% P& N
  36.                         if((lpuart_buf[0] == 'A')&&(lpuart_buf[1] == 'B')){
    / r4 i, M2 e: ]1 R5 m: V
  37.                                 HAL_UART_Transmit_IT(&hlpuart1,"Enter StopMode",15);/ b& ]  I. s, [0 i- j- Z; L
  38.                                 HAL_Delay(20);+ x6 T# `7 K2 j: v" P# e
  39.                                 HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);4 J- A# T& r8 ?% E3 m( F- @
  40.                         }
    ) j! p" C) x: F$ w/ T$ \& M" T
  41.                         else{8 [3 A7 E1 \6 b0 g8 S, R
  42.                                 HAL_UART_Transmit_IT(&hlpuart1,lpuart_buf,lpuart_buf_len);3 D- f6 v  D2 b9 K, d
  43.                                 HAL_Delay(20);6 d+ }, C( ~5 q# A: b! C; W
  44.                         }- O9 k" E$ l# {; E! p+ X' x+ d
  45.                         Clear_Mcu_Rec();0 E+ m5 [1 i3 W) O' e& H0 x: `
  46.                 }
    ; J$ ^2 i' Q/ a$ D$ \5 U% I) H
  47.   }
    5 m7 _" H. V9 m0 P
  48.   /* USER CODE END 3 */
    9 }% }4 ~# v+ s3 b/ X- l
复制代码
  1. static void MX_GPIO_Init(void)
    * o; e5 t1 h( @  {1 c0 {! G3 ]
  2. {5 `! M- x5 U$ G& [! t. ~! V
  3. 8 y- ^" p+ M$ q9 @9 p6 x- g) q4 p! e- ^1 |% N
  4.   GPIO_InitTypeDef GPIO_InitStruct;
    % s+ b: j, Y% P, M

  5. * [  I9 S5 r1 A* D# @2 Z5 P
  6.   /* GPIO Ports Clock Enable */
    9 T5 j' R6 w6 l) p7 t/ }
  7.   __HAL_RCC_GPIOB_CLK_ENABLE();: p: k2 G# k  A: v- D4 e
  8.   /*Configure GPIO pin : PB14 */
    + G! x% e" t) W" S
  9.   GPIO_InitStruct.Pin = GPIO_PIN_14;! [* k; N" s( N, \5 x1 Q- u
  10.   GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;+ r5 l( W4 G* f9 {4 o) S
  11.   GPIO_InitStruct.Pull = GPIO_NOPULL;8 k% ^2 X# p4 i3 h6 E4 z9 L7 C8 h3 p
  12.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    # A# Z0 u3 c4 r) n: r
  13.   /* EXTI interrupt init*// a- O* k, y) V  x
  14.   HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);0 ~. l! y' Z( R
  15.   HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
    0 ~! f2 }8 c4 n0 g& R  a$ S5 j2 J

  16. 3 K- h5 U9 [+ h
  17. }
    9 K0 E4 T* U/ D8 U6 l6 G( p* O
复制代码
以上是CubeMx生成代码,我以GPIOB_14作为外部中断引脚进行Stop模式的唤醒,程序能顺利进入Stop模式及成功唤醒。但是Stop模式下的电流高达22uA,与预期不大相符。看了网上许多帖子及自己的实践,发现问题出在好多人都讲到的IO端口设置上面,改动如下
  1. static void MX_GPIO_Init(void)
    # ~( M: P% S8 y" j. U
  2. {! S6 t" [* e7 b& x& z: A7 O6 j

  3. 5 H0 e( i8 B/ z; d6 X9 }
  4.   GPIO_InitTypeDef GPIO_InitStruct;
    # u. Q4 T, y0 M8 y
  5. , F8 b9 [1 ]6 d  }- a% s% Z
  6.   /* GPIO Ports Clock Enable */
    8 e1 A# z# Y1 y1 u- T
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();3 X2 C6 j& l* @: Z, V7 b
  8.   __HAL_RCC_GPIOB_CLK_ENABLE();
      m! Y* M& y) e' {
  9.   __HAL_RCC_GPIOC_CLK_ENABLE();* q; Y2 Y' ]& w9 @7 X) V
  10.   __HAL_RCC_GPIOH_CLK_ENABLE();
    / M2 E! S6 a1 l0 o6 A/ }! @4 W
  11. " {* l0 s) b; `5 ]' ^4 P
  12.         GPIOA->MODER = 0xFFFFFFFF;
    8 ]0 j/ ~7 a7 q
  13.         GPIOC->MODER = 0xFFFFFFFF;
    7 R3 o" I8 w4 t# ^0 E  x
  14.         GPIOH->MODER = 0xFFFFFFFF;- [7 K, @5 s& T3 K! D) k2 ^) V
  15.         - @1 r8 F8 W! V4 z
  16.   /*Configure GPIO pin : PB14 */1 M$ G( I0 q0 E+ K
  17.   GPIO_InitStruct.Pin = GPIO_PIN_14;
    9 u' F( T! N: s! V3 \% U4 I
  18.   GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;  z4 v2 B- i( j8 ^
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    7 k; K' u+ c& a, f8 L. }% r
  20.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);  y' j4 {0 ~" ]9 g/ K, @
  21.         4 k$ K5 N$ _; f, |% `
  22.         __HAL_RCC_GPIOA_CLK_DISABLE();7 R/ v/ a! j. K" t- ?. O
  23.         __HAL_RCC_GPIOC_CLK_DISABLE();
    7 u( W, G/ u1 U9 J
  24.         __HAL_RCC_GPIOH_CLK_DISABLE();# F7 h( d9 e& C% [
  25.         * W& ?, t* S# e8 T7 D
  26.   /* EXTI interrupt init*/
    1 g, w( Z: [' \$ i8 X
  27.   HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);9 x$ N- B) `0 F0 q) ]4 `# a
  28.   HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
    1 }, C0 F* C' M1 E6 v0 ~4 M7 v/ G) Q
  29. + J, x( g; |5 j1 E0 s
  30. }
    5 R' N+ q( W/ p0 ]
复制代码
改动完成之后,电流顺利的下降到了,Stop模式下2.2uA,虽然离手册上的1uA还有距离,但是已接近预期的功耗了。下面附图:测试Stop模式电流时,为去除不必要的因素,我只焊接了Mcu进行调试的。
" Q2 p" \% Y: t' e. M
IMG_3416[1].JPG
赞 收藏 1 评论10 发布时间:2018-8-27 16:15

举报

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

  O, ~) A6 @$ e  `( _' f6 p谢谢分享。。。
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& v7 Y5 c8 Y! r2 B& `5 k/ h
进入stop之前没有重新配置管脚?唤醒后没有重新配置sysclk?

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

2 l" C1 K/ C$ r6 s* j& s  ~IO配置代码,上面有。下面是中断代码( ]  l* J; A2 W5 L: d
  1. void EXTI4_15_IRQHandler(void)
    , g9 }4 @( k" i) T; ~
  2. {
    0 e+ U- h$ s) |) ^; b- s' b( n! R1 ?
  3.   /* USER CODE BEGIN EXTI4_15_IRQn 0 */
    & F" m/ K/ `2 m% ?; x8 O
  4.         if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_14) != RESET){
    9 o9 e5 w( x1 |! o% a0 [6 g
  5.     __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_14);
    2 T: ?1 u( n/ c3 {
  6.                 Menci_Exti = 1;
    & Q. J7 X) i/ W* j9 l
  7.         }4 m! N1 J. @* D% E: i
  8.   /* USER CODE END EXTI4_15_IRQn 0 */) C4 H/ A3 s& R1 Q! w
  9. //  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
    2 g- i0 j* K/ o2 }  P& `0 O
  10.   /* USER CODE BEGIN EXTI4_15_IRQn 1 */' f$ h' A: T, G$ {3 `/ t) r
  11. * q" |% O# k/ t- f3 K! }
  12.   /* USER CODE END EXTI4_15_IRQn 1 */; V* U6 k, ^. O* m- B
  13. }
复制代码
, W7 b" X& F. B- T0 O
我就设置了一个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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版