使用STM32F030F4P6芯片做了一个传感器,使用LORA无线方式将传感器采集的数据发送出去。考虑到功耗,使用了Standby待机模式。4 b: Z$ Q: p. }0 V, o
现在是可以进入待机模式,使用RTC唤醒,数据也能发送出来。
3 t3 ]+ \4 y+ u) H1 y# r, m现在想让整个传感器初始上电后先进入休眠,然后在RTC唤醒后,再发送数据;但是现在只要上电就直接发送数据,然后才进入休眠。3 i5 E1 g2 x5 ^
通过查看PWR->CSR寄存器,看到RM手册中说SBF和WUF位是可以用来判断是否从待机模式中醒来的,但是程序这么做了不起作用,还是上电就发送数据。
% m5 A( }* e" A0 w- h+ U! h0 }5 J请各位大佬给看看可能因为什么导致的。3 R0 W" Y) A: n
int main(void)
! ^$ L- T$ m5 r1 h+ A{
- ^5 m" J* n# _9 d+ f- j /* MCU Configuration--------------------------------------------------------*/; m2 x" ~: m3 P3 c6 o
2 V7 R2 V b# Z) m5 l
HAL_Init();
( M1 {: E8 l2 h) r& _3 ?5 }# y: X# ~5 z* V. n# X9 x
1 k9 U9 E8 ~7 I6 u$ a
/* Configure the system clock */
0 D' ?6 I, w6 b7 N2 n$ E+ w3 | S. _! r$ E" d) B" O0 _5 P) u
SystemClock_Config();, ^. V P9 h4 A" D; q/ N
% j" }# [4 W. r2 ]. c1 S' h0 k l/ s
MX_GPIO_Init();
1 Y' }" q. T' x2 h- d- B7 w4 T3 B0 C' r1 f/ L% U
MX_RTC_Init();
- K4 W9 s9 c1 ]6 s8 C; ~) f7 g 6 m3 v% ^* Y; x! \, R. b6 Z+ O+ R* h
RTC_AlarmConfig();
* v* y, F1 i; N+ |; J6 j2 Q /* USER CODE BEGIN SysInit */+ e! W0 C5 j3 W5 f% R! U) Z
5 K& l& O2 F1 ?( ^# n* g( _ if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET ) //在此判断SBF标志位,若为1,则表明是被唤醒过1 E7 o( w8 I- i8 b: R' g
//if(__HAL_PWR_GET_FLAG(PWR_FLAG_WU)!= RESET)6 z; u J7 I2 a0 C
{
2 j6 j$ Y( E! o- |, [( ^: q/ W3 G __HAL_RCC_GPIOA_CLK_ENABLE();
& Q. r! R: t) r* y- v: V# _ MX_SPI1_Init();; L5 f. `/ F5 Y. K4 o0 z
Lora_init();
$ K9 K1 j5 w% l/ z, N$ l //HAL_Delay(10000);
5 l( r+ B- I: x9 w) o4 r Read_Ds18b20();# f* w- t u# g5 X- T; n. }6 s( d
Lora_SendTemp1();
) E% y9 {5 G8 w# ]+ S; t& f }
+ t x! Z& b) u8 h4 D2 {0 X __HAL_RCC_PWR_CLK_ENABLE();. g& R4 G. A, y: c7 b
1 ], c/ b' x- m. G! t if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
- q- Q: I ]5 |* g3 C{
+ V4 h. [0 L: S __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);* g3 P' n" x; A( f% E
}
% s1 a& i8 d% r6 | 6 T# q! s) X( a0 A; X" h& a# c k
HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);
6 _7 m$ V' @7 h- W8 _
+ }" Z0 t# w+ I. r5 `: E& V# {% Lif (__HAL_PWR_GET_FLAG(PWR_FLAG_WU) != RESET)
G' [5 T7 s! Q{
; C! y6 l, `" S6 O __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);% G; I7 e5 E- t, c$ X k+ @2 j
}! o3 X8 Z* M& X0 f5 i
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
, S" R3 Q7 S) N5 k& }8 \& ? HAL_PWR_EnterSTANDBYMode();
+ H& L4 I/ R* e while (1)- A$ B- O; h! v: |
{
5 i! n! R I6 \# B2 I x/ T$ K n% s( d6 H& k D. p$ k
) ]( D4 `) Y3 e* u' ~ }
$ r' N2 f: U/ `* ~2 \- Y9 c}
; o3 H8 L1 j* I8 C; N: `% ]' J
! y( }. ]8 \+ I* {1 A) J图片中红框部分,我看字面翻译就是说这2个标志位,一个是用来说明曾进入待机模式;另一个是曾被唤醒过,通过判断这个,认为设备进入过待机模式,那么就可以发送数据;若没进入过,那就先进入待机,不发数据。
# `. O# f1 G6 n5 |( E) L/ m. V0 u; L7 D. p; L' _. Z7 e
| 5 S: }" T) H1 K! k3 {, z
% c4 n* B- m! s- H
9 W) b5 G: q4 W) _
# H1 ?2 _+ [# _2 v4 B; C ]
|
按照这个思路,我判断if(__HAL_RCC_GET_FLAG(RCC_CSR_LPWRRSTF_BitNumber) == SET),这个标志位会表明是否从低功耗模式复位唤醒的,还是没起作用。难道还有什么寄存器要设置?
我觉得可以直接检测上电复位这个标记。