STM32U0系列微控制器中的ULP(Ultra Low Power)UART接口设计用于在低功耗应用中实现串行通信。
( q# f0 k0 N4 R硬件特性:
/ G' g) `; l n+ w# Z/ J( Y 超低功耗模式支持:ULP UART具备在低功耗模式下保持唤醒源的能力,允许在微控制器处于低功耗状态下依然能够接收数据或触发中断,从而快速唤醒并处理通信事件,有助于降低系统平均功耗。
/ H5 O! a' w3 @/ `/ M+ H+ X电源管理:ULP UART可能集成电源管理特性,如低电压检测、自动电源关断等,有助于在闲置时减少电流消耗。
: A$ k8 e s1 R0 I6 G专用低功耗引脚:某些型号的STM32U0可能提供专门针对低功耗优化的UART引脚,这些引脚在待机或睡眠模式下具有更低的漏电流,有助于降低整体系统功耗。
, |$ _1 r, b, ]* K4 D# I软件配置:9 I1 @9 G. y; O) `4 r
1 波特率设置:根据实际通信需求选择合适的波特率。ULP UART可能支持较低的波特率选项,有利于在低功耗模式下降低通信时的瞬态电流。8 t' h8 v h! m- t
2 数据格式:配置数据位(通常是8位)、停止位(1或2位)、奇偶校验(无、奇校验、偶校验)等参数,确保与通信伙伴的设置一致。+ d5 v" S3 G, J$ r- D ?
3 中断与DMA:
; n# Z2 _- T1 L7 E+ K2 L8 H 中断:启用接收/发送中断,允许微控制器在数据准备好或传输完成时被唤醒,而非持续轮询,有助于节能。确保在中断服务程序中快速 处理事件并返回低功耗状态。DMA:如果ULP UART支持,可以使用DMA(Direct Memory Access)进行数据传输,无需CPU干预,进一步降低功耗。尤其在批量数据传输时,DMA可以显著减少CPU唤醒次数。9 `: C3 P% c* Y- A: V- p
4 低功耗模式切换:在进入低功耗模式前,确保正确配置UART的唤醒源(如空闲检测、接收数据可用等),并在唤醒后恢复正常的UART操作。1 H8 u8 n v$ A
功耗优化技巧:
$ j M" A( f7 p1 禁用未使用的功能:关闭不需要的UART功能(如硬件流控、校验等)以减少不必要的电流消耗。5 I5 e) F- q: l y
5 K) q6 g; T# S
2 节电模式:利用ULP UART的节电模式(如果支持),在数据传输间隙降低工作频率或电压,减小功耗。
; G1 Z4 e6 {: G4 F3 唤醒阈值调整:某些ULP UART允许设置唤醒阈值,调整阈值可以平衡灵敏度与功耗,避免因噪声引起的误唤醒。
# F# J! I; h* }% G# j9 i4 软件定时器:使用精确的软件定时器代替连续轮询,以定期检查UART状态或处理数据,减少CPU活动时间。1 @2 V! Y; J4 q+ L' W0 D1 z
5 O4 x% @: H1 C6 w6 S5 K) V初始化:调用HAL_UART_Init()函数,设置UART参数(如波特率、数据格式等)。
' ]5 z3 ]) D% f0 g3 x3 V. G% I8 m中断配置:开启相关中断(如接收中断),并编写对应的中断服务程序。
2 Y' B3 _/ h# H1 P9 ~" h1 fDMA配置(如果使用):配置DMA通道,关联到UART,并设置传输参数。
5 S' X7 J, ?0 t8 V发送/接收:使用HAL_UART_Transmit()、HAL_UART_Receive()或DMA相关函数进行数据传输。
4 q3 D3 G3 B- s/ s2 ~3 i+ e调试与测试:2 n) b0 t( }* n8 W U" M% W7 y
* h' T0 x3 H4 P- {& Y( ?, R, k
8 h( O F" I) z5 t' {2 @6 ~) S9 B
MX_LPUART1_UART_Init初始化:" l5 V% I0 E# ~
0 q q1 A' z" Z4 R3 v- static void MX_LPUART1_UART_Init(void)
7 k- X0 y v: m - {& k. |- x7 Z: {2 Z$ V
) U& X3 N% h. q) k: @-
0 P8 U7 X+ j" ^! R - hlpuart1.Instance = LPUART1;
3 T. c" `7 n' f" g5 Q1 @' e( w. d - hlpuart1.Init.BaudRate = 115200;0 K% i) g5 Z" A1 o+ }/ m
- hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
- M! v s+ }# X* ^" }, q - hlpuart1.Init.StopBits = UART_STOPBITS_1;
: h% P) H) E9 R. ?. x F2 r5 t - hlpuart1.Init.Parity = UART_PARITY_NONE;' [- o" S: K2 ]: s, J7 E# i" a" L
- hlpuart1.Init.Mode = UART_MODE_TX_RX;0 Q$ Q0 t, ]; L8 Z5 J0 [
- hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;8 ]- w8 Z5 w+ z: ^5 @
- hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
: p1 i% F6 y- K; Z: n3 Y: z - hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
3 ^9 {3 ^! z4 z+ t- b U# r - hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
- p9 J& I# y4 N - if (HAL_UART_Init(&hlpuart1) != HAL_OK)2 E- S7 T! ?, _) ~) U1 ~
- {
# T- r( p7 s4 ^4 \' e G - Error_Handler();
0 [, E) ~8 G; P0 _+ q9 u1 \ - }
" j8 d- u0 x; ] ^* ]' ~. J! d( y - if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
7 S; H4 G2 [- t$ a- U8 u/ n - {
1 Q5 }' @8 n, i. ^ - Error_Handler();! X( w2 \4 G/ }" g+ U2 D& ?
- }
/ H1 r* b: s: e. B, x# h: c2 R8 M* e* _ - if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
- G6 Q0 ] l! u# j8 y - {
% R% ]3 b2 B- |% D9 U) _4 l - Error_Handler();
+ w( \- d8 v" K; X - }
2 M9 ]8 h9 @/ K& k3 @8 U - if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK)# ~3 S' k- d* |+ `) Q
- { E4 Q$ S' V! K& o! \
- Error_Handler();
, C: l' \7 k: D* [2 @ - }
4 a! G! R' _3 @) C7 ]; N -
1 |- `8 K2 Q: C - }
复制代码 7 j5 b: p5 M( C4 V, X
* a( D: y2 o+ K; \
- static void MX_LPTIM1_Init(void)
, b3 F2 j$ r9 X - {2 i* z0 s3 @6 B7 n5 x6 j
- 2 M/ U. H5 t/ P: B
- /* USER CODE BEGIN LPTIM1_Init 0 */
# P. d- z( ]2 C9 d
; n3 H6 u& A* D+ n0 j( K- /* USER CODE END LPTIM1_Init 0 */7 H1 `) ?2 d9 {* v2 M
- 7 b9 y. Y6 ?3 ]3 i8 G( a
- /* USER CODE BEGIN LPTIM1_Init 1 */. P* N+ B! Z8 Y' j
- 6 N, `4 u. `. e3 f
- /* USER CODE END LPTIM1_Init 1 */
3 F# P0 |1 R# C, X" ] - hlptim1.Instance = LPTIM1;
! K+ y) y8 a$ B7 b) d - hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;
0 e& i6 [& I( D0 G" a. Y3 x - hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1;
9 H( \4 b" X2 K+ g0 ~& @ - hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;+ H/ H6 C& L0 {( g% z
- hlptim1.Init.Period = 65535;$ ]' {# q. I& j! q6 \
- hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;1 T4 L+ R$ e4 W( x
- hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;- o% c0 P# I3 a" q4 D
- hlptim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;% T X& a5 e1 J5 p3 U6 P! J
- hlptim1.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO;
3 F2 R. y( _# I, [: c0 X - hlptim1.Init.RepetitionCounter = 0;
+ q* f' V' J& U& W0 O! d/ m& o - if (HAL_LPTIM_Init(&hlptim1) != HAL_OK). h7 c% B S1 q5 U# T
- {
! e+ s. e& q3 u% _ - Error_Handler();7 S3 j$ M8 E1 Q( ?3 s3 D3 B1 W
- }
8 V% n. h5 P" c# M, T" g - /* USER CODE BEGIN LPTIM1_Init 2 */
, o! j! K; N* R - % t, b2 g, L: j' I, ~
- /* USER CODE END LPTIM1_Init 2 */2 B# `, K1 E; L$ p
- " W3 \& ^0 ~) w+ W1 O' Q
- }
复制代码 ! G! z Y) j# P; w
/ j: H7 [: e# X! E3 F9 g
) ]2 D4 J. X/ L这里可以选在HAL库 LL库( j4 M d4 E; w: L2 C4 n# ?
: B7 \! c O# E) g
7 A: G1 F! m- V8 C" B) a- HAL_UART_Transmit_IT(&hlpuart1, (uint8_t*)aTxBuffer, TXBUFFERSIZE);
2 Q9 T; O8 C' R4 r8 I p1 s$ q
2 R' ?; [: x: ^! m! u3 y" `- HAL_Delay(1000);
复制代码
9 H8 v& U! {, P: q
+ Y# q$ y; U0 f8 l# P/ y: B( z$ [) E1 g
运行如下:8 Q3 }$ y% v- D, f4 T3 [; W. \/ j
$ O2 W3 R9 F3 f% a' R* U" i- f
7 t. }. E; H1 o) l6 Z# ^
/ c& p5 M$ c5 \& C0 C$ \# E) O6 Z/ O! @3 X9 l
|