使用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
| 9 Z) w3 F- Z, ]% q
4 ?2 a) M% v2 _$ `& {. E3 T& f! B, l9 x
' Y( |, ~7 p" J1 x |
按照这个思路,我判断if(__HAL_RCC_GET_FLAG(RCC_CSR_LPWRRSTF_BitNumber) == SET),这个标志位会表明是否从低功耗模式复位唤醒的,还是没起作用。难道还有什么寄存器要设置?
我觉得可以直接检测上电复位这个标记。