STM32U0系列微控制器中的ULP(Ultra Low Power)UART接口设计用于在低功耗应用中实现串行通信。
3 b) V4 E- V6 e7 Y) H' a# F; o# H$ Y硬件特性:
0 F: X; i+ F# c- F) ` 超低功耗模式支持:ULP UART具备在低功耗模式下保持唤醒源的能力,允许在微控制器处于低功耗状态下依然能够接收数据或触发中断,从而快速唤醒并处理通信事件,有助于降低系统平均功耗。
9 r& u( S% l! v4 `- i电源管理:ULP UART可能集成电源管理特性,如低电压检测、自动电源关断等,有助于在闲置时减少电流消耗。5 ~$ R/ E8 V( Y! `6 u% I
专用低功耗引脚:某些型号的STM32U0可能提供专门针对低功耗优化的UART引脚,这些引脚在待机或睡眠模式下具有更低的漏电流,有助于降低整体系统功耗。
) O# O! N) n. T软件配置:9 I9 A3 k1 h2 ?# X
1 波特率设置:根据实际通信需求选择合适的波特率。ULP UART可能支持较低的波特率选项,有利于在低功耗模式下降低通信时的瞬态电流。
1 `7 [' x: l9 c; i$ P2 数据格式:配置数据位(通常是8位)、停止位(1或2位)、奇偶校验(无、奇校验、偶校验)等参数,确保与通信伙伴的设置一致。
1 E% F5 v0 s3 T* c a, K8 |3 中断与DMA:
# @# P5 F. S. K0 T+ {& ?/ ~; j' A( F 中断:启用接收/发送中断,允许微控制器在数据准备好或传输完成时被唤醒,而非持续轮询,有助于节能。确保在中断服务程序中快速 处理事件并返回低功耗状态。DMA:如果ULP UART支持,可以使用DMA(Direct Memory Access)进行数据传输,无需CPU干预,进一步降低功耗。尤其在批量数据传输时,DMA可以显著减少CPU唤醒次数。+ c/ ~3 S4 s$ r# J0 q! O5 o
4 低功耗模式切换:在进入低功耗模式前,确保正确配置UART的唤醒源(如空闲检测、接收数据可用等),并在唤醒后恢复正常的UART操作。
+ L0 s& I0 Q- c9 i: ?0 U4 m: c) C* r功耗优化技巧:
9 y& |: P9 T( W2 ^6 d+ {) K: r& U1 禁用未使用的功能:关闭不需要的UART功能(如硬件流控、校验等)以减少不必要的电流消耗。
, _3 _1 t+ Z1 ]/ D( G/ G! Z/ ]
8 l3 N+ C' G3 C2 节电模式:利用ULP UART的节电模式(如果支持),在数据传输间隙降低工作频率或电压,减小功耗。5 F& R. d+ d( A8 Z6 x
3 唤醒阈值调整:某些ULP UART允许设置唤醒阈值,调整阈值可以平衡灵敏度与功耗,避免因噪声引起的误唤醒。! i- B, b& F) y" w: v. t
4 软件定时器:使用精确的软件定时器代替连续轮询,以定期检查UART状态或处理数据,减少CPU活动时间。
3 b$ |; Y3 l0 u5 _* `
* \% e3 M6 v2 z5 K' s" ~0 }初始化:调用HAL_UART_Init()函数,设置UART参数(如波特率、数据格式等)。. z2 u! s1 q9 K5 h
中断配置:开启相关中断(如接收中断),并编写对应的中断服务程序。
( D( G+ g; x( |DMA配置(如果使用):配置DMA通道,关联到UART,并设置传输参数。; c# n1 E! j8 p! t' w( S* v
发送/接收:使用HAL_UART_Transmit()、HAL_UART_Receive()或DMA相关函数进行数据传输。
~6 a5 h |3 W+ o调试与测试:
$ f x. ` v7 T# G U' p% U# u
" k6 i( H; E- p2 D
( ]% M* D' O9 A: ?
: g" {0 r" {: b# m8 ] MX_LPUART1_UART_Init初始化:4 h5 @6 V$ `) J( J
* [2 O6 D" D4 t/ h6 F6 v3 ]3 B
- static void MX_LPUART1_UART_Init(void)
- G/ _* n4 G( _ - {
8 `; u/ `) A- A; K9 R" t) E - 2 Y6 d, q4 t( ?! K
- 6 ]* w9 n4 D2 g- N) G7 X0 y* ~3 H& F
- hlpuart1.Instance = LPUART1;
$ w; h! ~. H; d; G, D - hlpuart1.Init.BaudRate = 115200;9 ^$ E: q0 U& a# S# h
- hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
, P! r9 z8 u) [+ w" A8 F4 B - hlpuart1.Init.StopBits = UART_STOPBITS_1;
7 v2 }; D8 l$ {0 j; A7 ] - hlpuart1.Init.Parity = UART_PARITY_NONE;
3 a" Y1 z, j' d6 m - hlpuart1.Init.Mode = UART_MODE_TX_RX;
$ ~1 S# ?) I0 D( N - hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;, k G& w/ h9 M
- hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
9 r/ G0 g: X c I6 k; N9 j) c - hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
( ^1 U; B" D2 W$ z( c - hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
) u5 G+ ]- G* M: ?8 t; T$ n - if (HAL_UART_Init(&hlpuart1) != HAL_OK)) {! E; e0 M E! }' b. f0 J% |! D
- {' a$ H( a6 c0 v/ u# u- P8 \1 J
- Error_Handler();
7 p2 C* X }0 e, {/ ^) T - }
" X @$ P! o, `. H7 n* p) E - if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
2 i) e; v# S) t8 a6 { - {
7 `/ @1 g: \1 E - Error_Handler();2 C$ f) d% _# }/ ~6 D
- }
! _8 b8 u/ O& ]% b% I, }* Q - if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
3 i& g, v& k6 v: _& D( ^. ]4 ~7 ]5 X - {, h6 Y- F- q3 W# Z
- Error_Handler();' I# h, H7 t* j& S5 i, H- f
- }) h& I! U$ }5 {* k- h* i3 @: I& _
- if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK)9 s5 `# B. x+ O% y7 p; m* {- f/ {
- {
( G, ^! d+ D" z4 c1 O$ M$ Q - Error_Handler();" }4 J( i7 l# `$ s
- }/ |& M+ e3 ~, Z
-
" j" K: k: C: @5 y6 h) o - }
复制代码
% c' _4 v7 I1 A, W, q) H1 ^- p
) L6 R% c+ j% ]- static void MX_LPTIM1_Init(void)
$ e4 Y! ~7 y. Y$ J* I4 G - {1 o6 B5 s& Z3 a" Z& a
- # D' x1 z. i; ~! r' u$ P4 E
- /* USER CODE BEGIN LPTIM1_Init 0 */
9 \- I# U; a, p3 J - " r# U- ~# G. C0 X3 j* k/ n! C
- /* USER CODE END LPTIM1_Init 0 */- W5 h, w7 c# H: d: f% V; t. @
, x( @( {3 K3 f- /* USER CODE BEGIN LPTIM1_Init 1 */
: z" \6 Q& V$ g- h - X4 U" c) q& [/ Y
- /* USER CODE END LPTIM1_Init 1 */
+ i7 I5 }/ _( t4 A. R) B7 }6 b - hlptim1.Instance = LPTIM1;, A n5 _3 W( F2 d
- hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;$ c f1 y# }, q* s0 X2 x
- hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1;8 f& X& }- r: ~) x
- hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;/ D. ^2 v- b/ R+ Q m' Y8 @
- hlptim1.Init.Period = 65535;/ m" I& l3 C3 ?' e
- hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
7 K2 e- N- p. y7 S( @ - hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
; Q ~2 E$ K0 ?7 |/ \ - hlptim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;
1 s1 l& Q1 s6 u% ^$ K$ C! B - hlptim1.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO;
6 t, r5 \. h2 U, w& L; E - hlptim1.Init.RepetitionCounter = 0;
; ~& c: x9 y; E! A - if (HAL_LPTIM_Init(&hlptim1) != HAL_OK), s) @- X( O6 e/ k" z
- {" t7 s2 Q2 j# |8 J/ [ Z) A
- Error_Handler();' {! R8 e6 K3 N) K9 L8 T' {
- }
( [- z9 G$ b8 r( | Q" c0 N# d - /* USER CODE BEGIN LPTIM1_Init 2 *// A4 \- u! r7 A& m- _
8 |* O2 J; H4 y ?, J/ _- /* USER CODE END LPTIM1_Init 2 */
$ B; ]1 ?2 g& T! S1 l8 v
' O. P* E* D2 U- }
复制代码 5 [! j( e( O1 g8 {
! L+ @2 _- ]0 u! X) ]' c3 [5 v3 L% r0 ]$ t6 X
这里可以选在HAL库 LL库
& |' A+ J- J A2 V6 I
! x; d! N9 ]9 Z! K" s
# a7 J: s- g% m2 p- B- HAL_UART_Transmit_IT(&hlpuart1, (uint8_t*)aTxBuffer, TXBUFFERSIZE);4 U0 |* b0 `) c4 U4 z' U
: I1 ]0 F% T6 J$ Z- HAL_Delay(1000);
复制代码
2 e5 z9 d; O# d
( N2 T5 l" |3 @. Y0 A# B4 [" R/ W# M y
运行如下:
0 d- n; Y4 h2 v9 j; P* C: J
& ^2 T) X" j) S6 p/ {( E
T$ i* f0 }) [& Q4 s! F3 n8 G
5 M2 L; g8 p$ T7 n7 j1 i1 v) P+ q# a1 ~
|