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

stm32f030f4p6待机唤醒应用问题

[复制链接]
hello_bug 发布时间:2020-5-27 16:40
使用STM32F030F4P6芯片做了一个传感器,使用LORA无线方式将传感器采集的数据发送出去。考虑到功耗,使用了Standby待机模式。8 ^6 H$ \1 `6 i5 Q( o; D
现在是可以进入待机模式,使用RTC唤醒,数据也能发送出来。
* t5 Q& r& }# ~9 e  p现在想让整个传感器初始上电后先进入休眠,然后在RTC唤醒后,再发送数据;但是现在只要上电就直接发送数据,然后才进入休眠。
+ E' e0 P6 k) H9 M% m) O% q通过查看PWR->CSR寄存器,看到RM手册中说SBF和WUF位是可以用来判断是否从待机模式中醒来的,但是程序这么做了不起作用,还是上电就发送数据。
; t5 _- e8 G- o& @请各位大佬给看看可能因为什么导致的。
$ g9 o0 `) Z6 ?; k2 L  Yint main(void)! [% U8 }& D& [2 Y  G
{) v; Q4 b' L# w% S7 \/ [! V
  /* MCU Configuration--------------------------------------------------------*/
2 k' \6 {3 N& f) X1 ?6 e9 U0 p
2 F' E; B1 Q" b; m9 F        HAL_Init();% |6 G6 E  G( J: M+ i- l
5 J8 l4 ]9 i. x9 k0 U  m

0 i, F5 W. q  e3 A" }2 U# n  /* Configure the system clock */4 f) Z# ]9 n5 ~6 v! E

0 D5 h- _5 |" I/ G7 f4 u  SystemClock_Config();
: [2 \, F! y4 y4 o, R" a/ B1 j        
' W- j( p) e" G  O& b) Q6 v8 ]! r; i  MX_GPIO_Init(); / z! ]; e0 X9 c9 m& ]
# v8 X/ w7 N% o8 d' I. d
  MX_RTC_Init();  u( A& e- Q- L. i
        
# W. p* I9 \6 l' A: X  RTC_AlarmConfig();
3 |2 D/ R- M$ n2 f; ]  /* USER CODE BEGIN SysInit */
, ?+ t- `% M' a+ j8 e: F
; D5 H/ P/ j! d" c" l. p7 m  if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET )        //在此判断SBF标志位,若为1,则表明是被唤醒过. M, E1 k& Z; a$ v+ P" `6 X5 r* T
  //if(__HAL_PWR_GET_FLAG(PWR_FLAG_WU)!= RESET)
& T3 C* o9 j9 l+ v7 o9 g' u% N' k{+ R& R7 r0 M  X
        __HAL_RCC_GPIOA_CLK_ENABLE();8 }+ Q' {3 `+ @
        MX_SPI1_Init();" q4 u( _+ R* a) u
        Lora_init();
$ E+ \( s: I% f! G9 D5 `        //HAL_Delay(10000);
3 f4 S9 f% P/ v  t% q        Read_Ds18b20();! j! W' H1 \# V2 i
        Lora_SendTemp1();" Z/ i# Z( H$ q* _% E- W1 \  d
  }# E1 q9 g& l. x4 \* O# j
  __HAL_RCC_PWR_CLK_ENABLE();
& {/ L( ^& r4 B
0 t3 ^! h! ?7 e# e4 @  if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
% S$ X3 t( X$ {( V; y{
% m  e# b: |! o. Y    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
! |7 j* V0 e& M3 k' a& Y  }, V' Q) n' X: t: D9 n
        # J% |8 `! Q8 n! F* J9 Z
  HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);$ [! R5 r4 A( t; ~( |

1 x6 l6 M' x% J3 E, ]if (__HAL_PWR_GET_FLAG(PWR_FLAG_WU) != RESET)
: p3 |3 @$ j; g0 ?( O, K{
# \4 q4 Z) L  @* a    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
7 j; f" b& d  {  }
1 t# y  g3 R% P8 }; `9 y! X# }% |  HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);5 b5 T/ j; U0 y' b! I% ~$ ?
  HAL_PWR_EnterSTANDBYMode();
5 l; S1 K( D) \  C( R  while (1)
4 D! X7 a! c; `8 J  {
1 H+ u8 w& m$ a: N                ( c, V' [& b1 o! u; g
                - G. v0 [; H+ r8 a7 ?
  }+ S& e" `1 Z' i
}
+ e0 J1 {3 K5 J6 f; i; m: Y: X9 I; {; Z% J8 O, E7 |3 [
图片中红框部分,我看字面翻译就是说这2个标志位,一个是用来说明曾进入待机模式;另一个是曾被唤醒过,通过判断这个,认为设备进入过待机模式,那么就可以发送数据;若没进入过,那就先进入待机,不发数据。
$ d' T$ _8 Y3 r0 P: c1 v( }% j$ Y( _+ B
待机唤醒问题.png (165.34 KB, 下载次数: 0)
9 Z) w3 F- Z, ]% q

4 ?2 a) M% v2 _$ `& {
. E3 T& f! B, l9 x

' Y( |, ~7 p" J1 x
收藏 评论3 发布时间:2020-5-27 16:40

举报

3个回答
疯de_恒 回答时间:2020-5-27 16:46:58
那就换一个思路,检测一下是不是上电复位,有一个复位源标志的,如果检测到是上电复位,就执行第一次上电的动作,否则当是唤醒。
hello_bug 回答时间:2020-5-27 22:01:49
す疯Ⅱ恒す 发表于 2020-5-27 16:46
1 I) \. b& R9 H" D# |那就换一个思路,检测一下是不是上电复位,有一个复位源标志的,如果检测到是上电复位,就执行第一次上电的 ...
9 k( o$ U7 b. @" l$ U" T* H# c
按照这个思路,我判断if(__HAL_RCC_GET_FLAG(RCC_CSR_LPWRRSTF_BitNumber) == SET),这个标志位会表明是否从低功耗模式复位唤醒的,还是没起作用。难道还有什么寄存器要设置?
疯de_恒 回答时间:2020-5-28 09:16:45
hello_bug 发表于 2020-5-27 22:018 V' j% `( z! `# P4 \
按照这个思路,我判断if(__HAL_RCC_GET_FLAG(RCC_CSR_LPWRRSTF_BitNumber) == SET),这个标志位会表明是 ...
. q/ X; h1 l8 J) h/ K: [% Q6 ]: H
我觉得可以直接检测上电复位这个标记。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版