使用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
|
% 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 ? |
按照这个思路,我判断if(__HAL_RCC_GET_FLAG(RCC_CSR_LPWRRSTF_BitNumber) == SET),这个标志位会表明是否从低功耗模式复位唤醒的,还是没起作用。难道还有什么寄存器要设置?
我觉得可以直接检测上电复位这个标记。