使用STM32F030F4P6芯片做了一个传感器,使用LORA无线方式将传感器采集的数据发送出去。考虑到功耗,使用了Standby待机模式。
5 }! S+ g; V" b) \+ J现在是可以进入待机模式,使用RTC唤醒,数据也能发送出来。) C9 J7 k& t! S; s
现在想让整个传感器初始上电后先进入休眠,然后在RTC唤醒后,再发送数据;但是现在只要上电就直接发送数据,然后才进入休眠。
0 t/ V5 ?1 E( q8 `通过查看PWR->CSR寄存器,看到RM手册中说SBF和WUF位是可以用来判断是否从待机模式中醒来的,但是程序这么做了不起作用,还是上电就发送数据。
' o$ ]0 \* E* U6 k6 n请各位大佬给看看可能因为什么导致的。; c9 U' G$ G* T, A) F
int main(void)
& u( R+ E( A0 Z6 E$ l( [# o" M{' w7 _1 i+ [+ _: p d
/* MCU Configuration--------------------------------------------------------*/
[ v- R6 `8 l5 N" R9 f* M; t, R3 G& a
HAL_Init();1 R- n& i# `3 u; v7 N; O
4 w. B' P( k, ^0 l1 O2 }
! z9 \6 b+ h7 s# n /* Configure the system clock */
$ s9 E/ A/ d. Q! }! C$ {1 S# s. e' f% T$ R* B' m
SystemClock_Config();0 ^3 p, ~5 `; H) R
8 z- f) B* ?. H MX_GPIO_Init(); / M) E8 A) x- M# \
; @4 Y- z6 s7 u+ g
MX_RTC_Init();
( r/ y' A' a9 l$ n9 X 9 H& d) R* {! Q
RTC_AlarmConfig();
3 V5 P- m- R1 X: V; R1 l /* USER CODE BEGIN SysInit */9 o1 m/ B" K/ Q- y# p
& ?( p, T D4 B& b8 E& N4 U+ ?
if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET ) //在此判断SBF标志位,若为1,则表明是被唤醒过- o% s' O" I+ K7 a! T8 r. W1 U
//if(__HAL_PWR_GET_FLAG(PWR_FLAG_WU)!= RESET)$ W) k/ Q& ?4 V
{
# x) a) o. I. D/ n" A5 Y0 W __HAL_RCC_GPIOA_CLK_ENABLE();
7 K" E8 X# J1 {' g! B MX_SPI1_Init();
/ t; `0 k' c7 G! j5 @& f8 v Lora_init();
) r+ H0 _8 y: i+ H6 a //HAL_Delay(10000);
, `+ w* H0 k, d' }" p" H Read_Ds18b20();
; N2 W0 ~! y2 _* c Lora_SendTemp1();6 ]3 R/ c% ]' G" _. k, N8 P
}+ H, j5 U+ O/ ?$ O
__HAL_RCC_PWR_CLK_ENABLE();
/ U( v% z: x" J! ^% j# ^% u1 i1 p, m [0 W
if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
; @( C* p& |4 T+ x) |. {, m{
; O+ D R, w; k3 [; p __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
+ h# Y( b c* [ P* F1 e. G: R }9 d8 @, L ~) r5 z" n
* s# u( s l& f- K# |
HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);
5 c( U0 D, ^' S( A. C
) p) D, |$ u1 xif (__HAL_PWR_GET_FLAG(PWR_FLAG_WU) != RESET)
2 p" O( t6 M8 I/ X! j2 v{ K1 |9 _4 H; O+ {
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);$ o9 \8 F) ]# X" U& C Y
}
) [* X& n* b. F4 d0 l9 F0 _ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
2 ?" p% t8 ?! p1 r5 s( G- l$ X& \ HAL_PWR_EnterSTANDBYMode();. W* ?( y5 B+ a. f2 P8 g
while (1)
+ s+ O# E& G9 x/ A p {
( H4 o4 `% G; r
- L& ^3 C4 k) j2 }" h; x5 ` 9 S a& m! x8 E! j
}
N) a; H! U/ a6 D! V7 n5 O2 j1 [}
6 v) Z" U: b. O" k* l0 C+ G0 l& I" {1 v4 f% o" X3 [
图片中红框部分,我看字面翻译就是说这2个标志位,一个是用来说明曾进入待机模式;另一个是曾被唤醒过,通过判断这个,认为设备进入过待机模式,那么就可以发送数据;若没进入过,那就先进入待机,不发数据。) o) V" G3 v; F E" t
: @9 \; s9 M# L7 U* H1 C0 R2 \. X6 O
|
+ c# [/ L1 m9 N; O ! v) @6 r# e- x# g% M' Q; j
h. p, T% d( D9 f: O3 A4 M) T( [' ^3 z
1 b5 y& j/ j8 {/ q9 V8 s3 x6 E
|
按照这个思路,我判断if(__HAL_RCC_GET_FLAG(RCC_CSR_LPWRRSTF_BitNumber) == SET),这个标志位会表明是否从低功耗模式复位唤醒的,还是没起作用。难道还有什么寄存器要设置?
我觉得可以直接检测上电复位这个标记。