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

stm32f030f4p6待机唤醒应用问题

[复制链接]
hello_bug 发布时间:2020-5-27 16:40
使用STM32F030F4P6芯片做了一个传感器,使用LORA无线方式将传感器采集的数据发送出去。考虑到功耗,使用了Standby待机模式。% b. ~8 y0 K9 P7 K( d
现在是可以进入待机模式,使用RTC唤醒,数据也能发送出来。( W+ s0 j0 A; o6 i; L
现在想让整个传感器初始上电后先进入休眠,然后在RTC唤醒后,再发送数据;但是现在只要上电就直接发送数据,然后才进入休眠。
8 m- ]! }# i- a5 h4 ]6 c- N通过查看PWR->CSR寄存器,看到RM手册中说SBF和WUF位是可以用来判断是否从待机模式中醒来的,但是程序这么做了不起作用,还是上电就发送数据。) ^% M* h! Q- y  d# i
请各位大佬给看看可能因为什么导致的。' ~- x2 |: A0 y7 Q
int main(void)
9 d  z" ]5 X- S/ N8 |2 H& b{& n/ ?1 ]0 {0 R
  /* MCU Configuration--------------------------------------------------------*/
! J  E) R7 l( v2 ]0 x
% C, P, V0 o+ j7 [& L        HAL_Init();
! ?& q* r- V9 l1 ?4 a: c: G
& t0 p) D! G3 F! N8 M% s+ G0 ^1 m# D; `( Q, \7 Z) V
  /* Configure the system clock */0 I+ E  L& k+ J4 M

1 l7 W8 r2 m9 @! |2 ^  SystemClock_Config();
. k2 Z- f4 d9 k" R  U; C* M8 K        / w2 R- R5 j8 ?1 e$ }5 j; D
  MX_GPIO_Init(); : z: O$ B; e3 F* L

' r0 }  q( N2 n; V, W  MX_RTC_Init();) {* \- R# a  w) y% r
        9 D  L' X+ ^# U
  RTC_AlarmConfig();( V- _; E& T8 z! w$ d
  /* USER CODE BEGIN SysInit */* _9 O! N  r* T4 {- L

1 x1 A( |5 R0 s5 d; @  w  g  if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET )        //在此判断SBF标志位,若为1,则表明是被唤醒过& i" w- Q8 a' M. D9 @
  //if(__HAL_PWR_GET_FLAG(PWR_FLAG_WU)!= RESET)7 E$ t" M. O* W- b9 w- j# w+ r7 q: B
{! ^& n' D/ M0 j0 q4 M
        __HAL_RCC_GPIOA_CLK_ENABLE();
1 b/ z1 j6 Q6 F( N0 V; n  R% m        MX_SPI1_Init();! E& |. T4 j+ t% b0 R5 v4 b
        Lora_init();
1 j3 o& p4 R7 H5 S- i0 H/ }        //HAL_Delay(10000);9 U$ i6 m) h! R7 h6 ~4 F
        Read_Ds18b20();
6 e/ B2 j# C# [, e6 f3 _( ]        Lora_SendTemp1();
. r) I. n+ d0 z9 [6 x0 T  }6 n3 u" |1 t4 e% e0 R4 E
  __HAL_RCC_PWR_CLK_ENABLE();
! L  Z3 j1 j% n- G5 }1 w1 {( g0 A( r9 x- ]% W
  if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)1 S; _+ |- \5 v
{8 x4 U# V% t3 A4 h5 V# {+ P/ C( q
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
9 u' u+ M& |& E" {; A4 [0 B  }; G. F* W( Q, J$ I; x$ F
        
# [+ `; z- h+ t" M7 N  HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);
# v% ]# G/ B( V, ]) u, D7 }0 \* V9 K, d, E
if (__HAL_PWR_GET_FLAG(PWR_FLAG_WU) != RESET)
6 X* O  a5 r' l, n2 [+ e. n{
2 x* b# n6 S  p  u6 b9 {8 o( `    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);0 M4 i: _6 C/ [4 S, n$ e
  }8 O* Q) q3 \, c' A
  HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);5 w+ z: }' N7 M$ w! V) [
  HAL_PWR_EnterSTANDBYMode();
) P$ m7 b- s2 K5 A  while (1)
+ r4 a$ ~! a) n) `$ w9 o, q  {5 A& \& X* H8 ~6 r! M0 z5 K
               
. l& O6 }% r7 ]0 r. Z               
* D6 U$ ?* F) d  }' W" R2 s) \1 w# r6 }
}
1 D8 u0 R. ?. _
9 k. K' i1 [" p6 R' V7 @图片中红框部分,我看字面翻译就是说这2个标志位,一个是用来说明曾进入待机模式;另一个是曾被唤醒过,通过判断这个,认为设备进入过待机模式,那么就可以发送数据;若没进入过,那就先进入待机,不发数据。
$ o0 }6 Q9 r- B3 B2 C$ L$ i& L  H, f. r. s
待机唤醒问题.png (165.34 KB, 下载次数: 0)

% R+ k* y  I( o7 l
6 O" e9 d' }* _; D

' I8 T& y" g9 N) @1 g4 U
& h" ]* u5 a! [0 M) b0 ?
收藏 评论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
. Y( \; n, m# e7 X- q# l9 V4 q那就换一个思路,检测一下是不是上电复位,有一个复位源标志的,如果检测到是上电复位,就执行第一次上电的 ...

: B' @# Y1 [6 K5 c, |按照这个思路,我判断if(__HAL_RCC_GET_FLAG(RCC_CSR_LPWRRSTF_BitNumber) == SET),这个标志位会表明是否从低功耗模式复位唤醒的,还是没起作用。难道还有什么寄存器要设置?
疯de_恒 回答时间:2020-5-28 09:16:45
hello_bug 发表于 2020-5-27 22:01
  u8 j) v- M( r. L% I/ x& ?# C6 z/ Y4 M7 \按照这个思路,我判断if(__HAL_RCC_GET_FLAG(RCC_CSR_LPWRRSTF_BitNumber) == SET),这个标志位会表明是 ...
; ~4 k4 ^" K$ R/ @
我觉得可以直接检测上电复位这个标记。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版