如果是定时上报温湿度数据的方式,我们可以将这个节点做成低功耗的,这样用电池供电,使用起来就非常方便了。
' b3 I D- l8 r5 z5 s9 M低功耗实现有2个地方:* S$ G1 j3 C0 k
1,MCU本身的低功耗;% C9 c% v& A/ n9 O: `( c
2,DRF169H的低功耗;$ x) U4 o. `+ e5 J0 o
AHT10的功耗非常少,我们这个是采用5号电池供电,基本上就不需要考虑了。
1 J! R# R* Q& r* ]$ z+ x1 @" B( J项目做下来,休眠时大约电流是50UA,如果20秒发送一次,电池用一年基本上是没问题的。
" Q @5 @& H5 K* p5 r9 }+ W0 o下面来分别简述下这2个方面的实现方法:- K# y. T! B' U& U7 X
% _8 {) \0 a5 H2 S, ]9 Y, H7 Z2 c
1,MCU本身的低功耗" c6 ?8 j3 j5 }6 M0 I7 U9 t# b
STM32G0系列的功耗管理函数在这2个文件里面,是ST自带的库函数,实现起来非常方便
! F! K4 h( b7 p! p o0 vstm32g0xx_hal_pwr_ex.c
& T- o- p- d! I: H; Vstm32g0xx_hal_pwr.c. v, w- C2 v6 w2 P7 x+ K9 n
0 L4 O R2 e5 A* N( t2 q具体的实现方法:
% E+ ]8 I! b- w, u o' J0 M1,关闭LED及设定DRF1609H进入休眠,设定DRF1609H进入休眠是串口发送指令给DRF1609H. p5 X8 ^) B4 G2 e
2,设定RTC中断时间,设定MCU进入低功耗1 s' R6 S0 k. H! f+ q' h4 ?
3,RTC中断唤醒MCU休眠
. x2 {0 ?, _* ^; I; x4,唤醒后重新初始化MCU(包括系统时钟、串口、IO口、DMA)3 E4 ~2 @% b6 N7 o8 I1 Y0 N
5,测量一次温湿度数据
' y6 V J9 v# u7 c; ?3 G5 j6,唤醒DRF1609H,下拉DRF1609H的Function按键唤醒1 Z0 V) r& B0 O2 Y1 B8 j( J
7,发送温湿度数据
1 X$ j/ K% y: M- o) i% J8,重复以上1-7$ j. V% P0 S9 T# j
* {4 e+ F+ B; g- // --Enter Low Power Model -- //, u2 w% ^9 Z3 k5 _- j' _% z* K8 Y" P9 i
- LED2_OFF();6 J; ^$ k" L! h9 t$ g2 H1 c
- drf1609h_enterLowPower();
# b; ]" B3 G$ r) J - HAL_Delay(5);
复制代码- //--Set wake up time = 0x500B = 10S ----: u5 M2 m( L9 g% y2 y* S3 w" v7 {8 b
- //--Set wake up time = 0xA017 = 20S ----
8 n9 U; Y* }; U* L - HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x500B, RTC_WAKEUPCLOCK_RTCCLK_DIV16);) o8 h& f' ?; H8 s9 _! T/ I, U
- HAL_PWREx_EnableFlashPowerDown(PWR_FLASHPD_STOP);
6 A' S7 K8 X" i. V! @( H: H W - //HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);% B0 H9 q# f. h& J8 \# e; Q( I" Z
- HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFE);
复制代码- SystemClock_Config();4 h6 p4 F/ Q3 O) }
- MX_GPIO_Init();
. Q# C& p: ~8 ?' J* @" C - MX_DMA_Init(); G% C; D7 X9 v" h8 {
- MX_USART1_UART_Init();! t4 R# j1 q, \0 D# Q
- d& M6 B, U1 X2 o7 w" x& t8 m( t
- LED2_ON();
复制代码- //-------------------' I5 P6 M! |% E" P z9 ^
- read_AHT10_once();
复制代码- //--------------------9 \' ~' g# P+ A: V% c' k6 G
- drf1609h_outLowPower();
' m% h- h& q6 \! D' h6 [) j - HAL_Delay(5);
复制代码- //--Send out the AHT10 Data as point-to-point transfer model -----+ M7 P0 X' P/ D0 d( n( ^3 x. {
- set_lowpowerSendOutData();<div>HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);' u' v) v3 V/ N/ l3 W! d [
- HAL_Delay(5);</div>
复制代码
8 x; s% E* n% ]( N/ x( l4 E2,DRF169H的低功耗实现 z. {% r' Z. l; E
2.1,进入低功耗1 g' }! N0 ~ o" }' a" n( _
DRF1609H只有工作在End Device节点下才有低功耗功能;4 `5 Z- x! C+ p4 P
发送指令,即可以使DRF1609H进入低功耗,发送指令后是有回复的我们可以等待回复,也可以delay 5MS
* D5 ~; {9 X: G2 J: h, v- drf1609h_enterLowPower();
1 c% f( R+ l- i4 S; X - HAL_Delay(5); h( ~$ Y5 c8 l' t
复制代码
& H* H" h; q0 v" n4 R& @0 t1 n具体可以参考DRF1609H的说明书* ~- [5 A/ z& i$ |
- t" Y, z" c' k
$ ?" i' ?( D1 D7 ?
8 k/ F& D% K6 w& j. y# t0 |( D, y* N- j
0 C" p( s6 x% ]% M; m
9 b/ F! \2 I! d
# J n1 P# }* |/ q( s
8 a# F0 Q* V, ~! I5 U I9 w) c2.2,退出低功耗/ x+ N* s7 _0 A" u
退出是模拟下拉Function按键5MS实现4 n; Y- ^: y: u3 k
- drf1609h_outLowPower();
' f+ h7 s" k1 s - HAL_Delay(5);
复制代码- //-----------------------: P( v( |. R0 H, p" w! _
- void drf1609h_outLowPower(void)
6 q4 b1 s/ p: ?7 K6 g - {
9 f5 \8 B" J( r - set_outLowPowerPin_outPut();
+ B- E/ ~: D6 F: s3 R7 d - HAL_Delay(1);& G0 U7 s( G6 e) w/ A9 r
$ ?+ _* l7 W0 U5 u- set_outLowPowerPin_out_1();9 [" V1 {4 B) b
- HAL_Delay(1);, g5 ^# N O( u" @3 K
- ; N* z6 @% V- }( D G
- set_outLowPowerPin_out_0();& L2 {0 N- W# J
- HAL_Delay(5);3 T0 d, m( _$ b D
- : ?" F/ S7 y% ^4 z
- set_outLowPowerPin_out_1();
" i3 y) y7 ~7 R9 k) k p! ?/ X" V - HAL_Delay(1);, V/ k4 \* V7 D' @
( O( N& z+ ~! ?7 F- set_outLowPowerPin_input();
- d$ G8 M, C F+ u$ J - }
复制代码
: H# m, ~. D; s( M' J3 |2.3,退出低功耗以后的数据传输9 m/ W& l4 W! ], }. k" f4 q
DRF1609H进入低功耗以后,将不会自动更新路由路径,所以唤醒后用点对点发送方式,点对点发送方式会自动寻找路由,但是效率比较低,所以一般情况下用透明传输方式。- d7 `# ~8 x: V& w' Z4 l- E" X
Coordinator的短地址永远是0x0000,即采用目标地址为0x0000的点对点方式发送。
! ` K( E. G' A. {点对点发送的官方描述是这样的:
2 c+ R# c4 ]. |$ a: K+ T0 |, t( U/ I3 Q) a' ~' M
1 O- D# i( ^- Q6 a* _& X) p( ?
- Q% y/ V' S+ l& C& l# U* w6 }' l
) Q2 G$ e, U& z! [1 r代码实现为:
0 e5 v3 z0 i! T$ a: x) [
2 t( a5 P, x5 B& T$ w- //--Send out the AHT10 Data as point-to-point transfer model -----
' a0 m! e9 n2 L - set_lowpowerSendOutData();
; L; k: c8 g d& \! [ - HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);# f+ t8 F5 I! ?: h, \; j% }- w
- HAL_Delay(5);
复制代码- //----------------------$ O5 K/ ?; q! j2 `& x
- void set_lowpowerSendOutData(void)8 S0 m- z8 I- d! {
- {
& [0 q6 w" T B" Z' |- ~" g; W6 F, F - lowPowerSendOutData[4] = AHT10_OutData[0];
6 ]8 N) M' d# r& K& g4 { - lowPowerSendOutData[5] = AHT10_OutData[1];
* O5 v; O5 { W' H) { - lowPowerSendOutData[6] = AHT10_OutData[2];4 B% O4 K- N8 `7 g2 \
- lowPowerSendOutData[7] = AHT10_OutData[3];8 t. E5 D% z9 c4 y1 ^& v# q4 d3 u
- }
复制代码- uint8_t lowPowerSendOutData[8]={0xFD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
复制代码
9 F1 k2 k) Y: x# I* ?; E
$ M7 z% x1 Q" |0 a. [; z8 K; ~4 z0 B9 N
: p [& H9 W' \8 O y! e8 G
|