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

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

[复制链接]
McDong 发布时间:2018-8-27 16:15
今年7月底首次接触的STM32系列,搭环境,调试串口输出"Hello World",遇到了好些个问题,都一一解决了。
9 s, X4 [+ r, }. ]" h' e期间出差了一周,回来把目前在做的NB项目串口部分调试完成了,接下来开始做低功耗了。
; _) i7 t/ ^" s+ Y! p8 s' E4 `2 `看了许多前人留下的经验,结合自己的工程;
9 d/ i0 q) M% v, N; z
  1.   /* Initialize all configured peripherals */" W2 o6 U- M9 p# F6 p" P
  2.   MX_GPIO_Init();5 R1 j7 b/ Y/ s4 c) t
  3.   MX_LPUART1_UART_Init();( E7 J, v1 p7 W9 c0 H
  4.   MX_TIM2_Init();
    % {, j: L) a$ L( H, l# z1 e
  5.   MX_TIM21_Init();
    + N6 b4 x9 @9 T! O
  6.   MX_TIM22_Init();
      f$ t) H! \4 P! @$ Z( S  C! [
  7.   /* USER CODE BEGIN 2 */! w7 N; _# o" r8 u3 B, e' \3 l+ c& Z
  8.         __HAL_UART_ENABLE_IT(&hlpuart1,UART_IT_RXNE);       
    ) Q% x, b0 W) }# J" Q0 c& A0 i' Y& o
  9.         __HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);
    ) Y% L; L: }6 B3 ^# q& {
  10. //        __TS2115M_NB_Init_();                //NB模块初始化入网$ E9 ?7 I2 X1 O% ?0 C6 N/ R! q( T5 L
  11.         9 A$ C2 V: U9 n+ U+ U3 ^: a
  12.   /* USER CODE END 2 */, c; t7 }! x+ F0 N; E
  13. 7 N0 E3 @5 U  r7 S/ s: g0 v
  14.   /* Infinite loop */7 p1 |) @, X5 X9 o7 j, E0 B
  15.   /* USER CODE BEGIN WHILE */
    ) \0 X, B. T: Z: X8 V& x6 d
  16.   while (1); N% }4 v# J* G- i5 P( u$ z+ A
  17.   {
    7 K& k. ^( \- ~& |+ ]' j" A# Y1 `. d
  18. 4 S* k: z* q, q: h% L0 U
  19.   /* USER CODE END WHILE */* [7 ?7 z3 I9 D: E" C
  20. " w4 m4 N' O9 e  u# Y! I2 v# e/ u
  21.   /* USER CODE BEGIN 3 */; ~3 h) z7 V$ G1 ?( i& d2 Z) q
  22.                 if(Menci_Exti){6 V$ c. j7 X9 L# M
  23.                         Menci_Exti = 0;
    1 l( B+ s; n4 o) c
  24.                         HAL_UART_MspInit(&hlpuart1);
    ; c: U2 _2 J  f, w5 L9 w2 m
  25.                         HAL_UART_Transmit_IT(&hlpuart1,"Wake Up From StopMode",21);
    : T. Y6 c  T4 E- a7 |5 w& ~% z
  26.                         HAL_Delay(20);
    4 v6 w! U4 B8 v4 S. B% j
  27.                         Clear_Mcu_Rec();
    6 T$ D! n2 S+ J* Q( n
  28.                         HAL_Delay(5000);
    % R- B6 Y4 y/ D" s0 O8 b
  29.                         HAL_UART_Transmit_IT(&hlpuart1,"Enter StopMode",14);
      i/ C$ ?, ^8 N- b$ m* P; w( L
  30.                         HAL_Delay(20);+ d9 T' f8 g( s- E6 }
  31.                         /**************************进入停机模式***************************/3 Y4 x+ [+ g# i( D5 A
  32.                         HAL_UART_MspDeInit(&hlpuart1);                //关闭串口时钟,复位串口引脚
    8 |( G& j  p& l( J  V/ F( b
  33.                         HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_SLEEPENTRY_WFI);
    ; I2 m; c3 K, f1 }; G
  34.                 }
    & Z$ P3 ^: _7 |, q
  35.                 if(lpuart_time_over){6 O) u/ y+ Y: G$ W5 l" k! L* |
  36.                         if((lpuart_buf[0] == 'A')&&(lpuart_buf[1] == 'B')){
    1 i. g3 W, w- k, u3 n6 x
  37.                                 HAL_UART_Transmit_IT(&hlpuart1,"Enter StopMode",15);6 Y( e2 s8 E# Q. h$ x3 z
  38.                                 HAL_Delay(20);
    + R7 \3 w% u/ x7 B
  39.                                 HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);4 k3 ]% G) M; o& l
  40.                         }/ X0 M$ a, g/ H  n% `& l. F4 m
  41.                         else{5 F, ]  o- F$ O/ l9 }
  42.                                 HAL_UART_Transmit_IT(&hlpuart1,lpuart_buf,lpuart_buf_len);9 }! x4 g! v4 H4 a
  43.                                 HAL_Delay(20);8 b9 I4 m  K! B% p
  44.                         }8 k& F4 |2 T5 W- h& f
  45.                         Clear_Mcu_Rec();
    # \  v. R9 m7 q# \6 i+ c
  46.                 }0 O5 t, o0 R0 J0 V( ~0 F
  47.   }- m- f) f% j' Q! n/ Q
  48.   /* USER CODE END 3 */
      o1 A: }: \! N" c- e2 `
复制代码
  1. static void MX_GPIO_Init(void)( Y5 M0 Z* N% V, V
  2. {
    : I3 W! I% m. h+ [* f
  3. 9 b5 A6 V. @9 Q" ?) g& ~
  4.   GPIO_InitTypeDef GPIO_InitStruct;, Y1 i6 ?/ g6 R3 u

  5. + x  b: h1 K$ I4 u3 [
  6.   /* GPIO Ports Clock Enable */
    , E/ A* j5 x6 D3 U4 x
  7.   __HAL_RCC_GPIOB_CLK_ENABLE();
    8 L* m1 ]6 ^. _* F' {4 C
  8.   /*Configure GPIO pin : PB14 */% r& W# l7 D5 u0 [
  9.   GPIO_InitStruct.Pin = GPIO_PIN_14;
    ) [: N* }& `2 H$ a% Y- ~
  10.   GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;( P, g' m0 K) [
  11.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    1 q2 u" o; Y% j, L
  12.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);$ e# B& o# m" E6 Z1 i
  13.   /* EXTI interrupt init*/
    * C' h. j* g0 @  p
  14.   HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);! r4 L) B% n( Q7 E' Z
  15.   HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
    8 b  \' Z" W9 O2 p
  16. , F! N" e; U' x5 u+ b
  17. }# k7 q; J2 x, |- R: |
复制代码
以上是CubeMx生成代码,我以GPIOB_14作为外部中断引脚进行Stop模式的唤醒,程序能顺利进入Stop模式及成功唤醒。但是Stop模式下的电流高达22uA,与预期不大相符。看了网上许多帖子及自己的实践,发现问题出在好多人都讲到的IO端口设置上面,改动如下
  1. static void MX_GPIO_Init(void)+ E$ Y7 _/ K9 e! Z
  2. {
    ) l2 k  w- b( M. f' I, P

  3. % G, f) s# L# T6 l
  4.   GPIO_InitTypeDef GPIO_InitStruct;' D. k0 c- L" j: w0 g' N! k1 ~* v
  5. % d2 ~" S2 m, A7 g: @. [# Y; [2 g& t/ d
  6.   /* GPIO Ports Clock Enable */
    - I3 ?) q- \7 f# d% U. Z
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();
    3 O/ _# ~; _8 }' L( k/ h
  8.   __HAL_RCC_GPIOB_CLK_ENABLE();
    + i2 G3 x8 m: J# \
  9.   __HAL_RCC_GPIOC_CLK_ENABLE();! M6 q" m0 v' J2 b/ ^( w
  10.   __HAL_RCC_GPIOH_CLK_ENABLE();$ O) s  s; \) p, q+ c& d# G+ j2 |

  11. , c6 r/ E/ J5 b3 K) o
  12.         GPIOA->MODER = 0xFFFFFFFF;
    / t) M* O8 v  |7 Z# _2 l
  13.         GPIOC->MODER = 0xFFFFFFFF;% q0 v4 V3 h$ D( [5 ]; E5 X
  14.         GPIOH->MODER = 0xFFFFFFFF;& _' X3 J8 t4 w/ H( G. P2 o
  15.         2 q" g4 {" g5 Z, }+ n) p4 W
  16.   /*Configure GPIO pin : PB14 */  e' l2 A5 |6 Q4 T
  17.   GPIO_InitStruct.Pin = GPIO_PIN_14;
    ( _( K: t- E, ]9 S$ o3 r
  18.   GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
    6 x( ]0 B) k0 M7 z) o' `/ y
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    % ?2 b5 u  @; f  O9 e5 b4 O
  20.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    ! |% [2 z% q- r3 X9 w
  21.         + E4 j, c: V0 [5 M( _" {: V
  22.         __HAL_RCC_GPIOA_CLK_DISABLE();/ ~: ]# _% H+ J. x; M
  23.         __HAL_RCC_GPIOC_CLK_DISABLE();7 p3 Y7 R, w, }
  24.         __HAL_RCC_GPIOH_CLK_DISABLE();. L6 }$ R4 B. i* A
  25.         3 s* H1 y- Q1 c% u- j& S( M
  26.   /* EXTI interrupt init*/& f; Z5 C0 r& u3 K
  27.   HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);4 ?. G- s2 z: v
  28.   HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);9 T$ \3 ^8 x" |4 f
  29. ' W& m: A; a/ E4 v, f" }
  30. }9 k0 s- f, ?3 ^2 ^7 ?+ w
复制代码
改动完成之后,电流顺利的下降到了,Stop模式下2.2uA,虽然离手册上的1uA还有距离,但是已接近预期的功耗了。下面附图:测试Stop模式电流时,为去除不必要的因素,我只焊接了Mcu进行调试的。  z& O( K( U0 F4 I5 L
IMG_3416[1].JPG
赞 收藏 1 评论10 发布时间:2018-8-27 16:15

举报

10个回答
robin_zhu 回答时间:2018-8-27 17:14:32
, E; @, h1 [* {* \
谢谢分享。。。
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+ Q5 j6 n4 b) t+ j! q4 e9 K
进入stop之前没有重新配置管脚?唤醒后没有重新配置sysclk?
  F( ^5 N8 X# O9 j
我是在初始化的时候,把不用的io时钟都关闭了,io管脚设置成AIN。唤醒后,没有重新配置时钟,发现也能正常走程序,所以也没有重新配置
McDong 回答时间:2018-8-28 15:41:54
ap0405209 发表于 2018-8-28 10:51
7 ?9 i: e0 r) ], {请问楼主能否把唤醒的部分也列出来呢
3 J2 }, [0 n% i' Q) r: @& C. d, `$ S
IO配置代码,上面有。下面是中断代码
: p1 _  ~* I8 v- P9 s/ ^
  1. void EXTI4_15_IRQHandler(void)$ C. F% Q+ O" L  q8 d
  2. {7 |( H, F7 `/ \+ B6 V& `3 e/ k1 K4 T
  3.   /* USER CODE BEGIN EXTI4_15_IRQn 0 */, O: u  ?3 _  @& P
  4.         if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_14) != RESET){
    % e. e* n, g" F7 c
  5.     __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_14);. Z2 v3 U  i! W& E% W
  6.                 Menci_Exti = 1;
    " T, q0 ?3 V/ B4 ~! H
  7.         }
    ; r8 j1 \0 u: F  c: w% a
  8.   /* USER CODE END EXTI4_15_IRQn 0 */
    7 y6 \, }" u- j, G
  9. //  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);  j2 ~- O( b4 z9 v! {
  10.   /* USER CODE BEGIN EXTI4_15_IRQn 1 */
    5 P9 a$ S/ ~5 P# `* `" m7 Y

  11. ( N% J1 E. ~) b4 r: }% P  [  F
  12.   /* USER CODE END EXTI4_15_IRQn 1 */
    + d) R1 M5 |$ f( [6 P
  13. }
复制代码
4 s2 y  F. k5 k  p+ T2 ]- e
我就设置了一个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 手机版