使用STM32F030F4P6芯片做了一个传感器,使用LORA无线方式将传感器采集的数据发送出去。考虑到功耗,使用了Standby待机模式。
- b" t9 O7 `1 H' a现在是可以进入待机模式,使用RTC唤醒,数据也能发送出来。) q% z* N9 n, s" R+ W% C2 R
现在想让整个传感器初始上电后先进入休眠,然后在RTC唤醒后,再发送数据;但是现在只要上电就直接发送数据,然后才进入休眠。! P4 W+ k4 \: u4 _& ]+ M* S
通过查看PWR->CSR寄存器,看到RM手册中说SBF和WUF位是可以用来判断是否从待机模式中醒来的,但是程序这么做了不起作用,还是上电就发送数据。3 J/ v. g5 n3 n! `0 }: g
请各位大佬给看看可能因为什么导致的。/ R0 Y8 V9 J: V
int main(void)
; G9 | |0 U. x7 b{4 T" _& U0 l' e! ^5 Q5 z
/* MCU Configuration--------------------------------------------------------*/
3 M: d/ w/ t: R8 j3 \! J6 }, O
2 s) S- T* A7 y4 E8 A7 E HAL_Init();
) D9 D* R$ } u( @7 q' B4 a; S8 a3 [! c) f$ }& o9 r7 \
. h5 h, j, K& u+ w" U /* Configure the system clock */" h- H. F" G* T- H5 }
- @& M) I) `6 O. b3 _ SystemClock_Config();2 P. a7 h# h; x) ^- [' P5 }: ^
6 f4 u0 P! Y. c2 Q# {7 x0 k8 A
MX_GPIO_Init();
. `3 L' a; z9 Z% T; R
7 o9 s" v9 n0 S0 H$ ]& S MX_RTC_Init();/ Z9 ] A; f: ?
. v7 y1 G3 p( T5 l3 ^& A+ Q- j5 M# a
RTC_AlarmConfig();
! |: R6 g4 b0 X+ Z& k/ R3 a* e v9 i /* USER CODE BEGIN SysInit */7 Z) i0 c5 j' l8 y- F2 \" C4 b
- V9 N5 }1 j/ a8 I
if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET ) //在此判断SBF标志位,若为1,则表明是被唤醒过
# A5 {% R }0 E7 a //if(__HAL_PWR_GET_FLAG(PWR_FLAG_WU)!= RESET)+ Y6 x) P" ]& ~- K: {9 M0 S. ?
{1 o0 W- z. T; H8 C4 a6 B
__HAL_RCC_GPIOA_CLK_ENABLE();! ^: f& b: b _/ D, ?
MX_SPI1_Init();
' G4 y& _% g8 u9 g Lora_init();
# n5 t `! _' z+ r4 v/ } //HAL_Delay(10000);; k% m; M0 j) w9 ] U" o
Read_Ds18b20();/ N8 ]) M- j: T# J0 k! s& P
Lora_SendTemp1();- I2 O6 F. p4 E
}
3 d" O6 y" ?6 }* \ __HAL_RCC_PWR_CLK_ENABLE();
: L, L( o4 H+ o. o/ @, v
( D, P6 L, ?6 }& H if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)7 F8 a) U O8 O% E* d7 T
{9 P7 \+ i( r& Q- t5 ]8 O
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);$ I* e0 K% o7 n- K$ v# N* n
}
) r6 K# w5 h( j, B $ f N5 j B$ A" a
HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);$ X! M! W' r3 l0 c" E
1 |1 Z+ J0 y* p; k, s: zif (__HAL_PWR_GET_FLAG(PWR_FLAG_WU) != RESET)( ~% E0 D4 K& v! }4 h$ }7 c
{
) J4 r( ^8 o) S- L __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);6 G/ @9 C) L P
}
, ?0 S3 [( l7 ]/ x HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);6 P- \! x- y2 L4 Y* O9 |* z4 V4 G' ^
HAL_PWR_EnterSTANDBYMode();1 ?* n) z% G. s* V+ S+ E
while (1)
; ~1 [# Z/ `' l$ t4 V8 A: [% w/ X {, I0 I$ u: [: T0 |6 }' Z! I1 @
8 ^/ N4 ^4 Z3 _: ]/ J; B: v
8 P; z# [" l# D$ `! q" t4 q
}
# D' H7 S0 ], V. m$ Y: F2 `( @}
* J9 ?" s) d! v( T( c* z z ?( h. K% M/ B* o# y( g( D" c
图片中红框部分,我看字面翻译就是说这2个标志位,一个是用来说明曾进入待机模式;另一个是曾被唤醒过,通过判断这个,认为设备进入过待机模式,那么就可以发送数据;若没进入过,那就先进入待机,不发数据。
7 {* j: ^# o: l
* j7 _, N& A8 U! s. q | , h6 B) {. C! g! d

0 `+ v) |/ K7 E. `6 A4 W
4 y3 B/ E2 h( m3 s! l! H/ d, u( u4 z
" @# d5 z6 n7 G) {+ Z6 u6 `9 r% T |
按照这个思路,我判断if(__HAL_RCC_GET_FLAG(RCC_CSR_LPWRRSTF_BitNumber) == SET),这个标志位会表明是否从低功耗模式复位唤醒的,还是没起作用。难道还有什么寄存器要设置?
我觉得可以直接检测上电复位这个标记。