LPUART 唤醒功能简介
STM32U083 是 STM32U 系列中的一款低功耗 MCU,支持 LPUART(Low Power Universal Asynchronous Receiver/Transmitter)和多种低功耗模式(如 Sleep、Stop、Standby 等)。LPUART 的唤醒功能是 STM32U083 低功耗应用中的一个关键特性。通过 LPUART,你可以让 MCU 在低功耗模式下保持一定的通信能力,当收到特定的 UART 数据时可以唤醒 MCU。1. LPUART 唤醒功能简介
LPUART 的唤醒功能允许在 MCU 进入低功耗模式(如 STOP 或 STANDBY)时,仍然可以通过 LPUART 接收特定的唤醒字符(如一个字节或一串字符),从而唤醒 MCU。
工作流程:
MCU 进入低功耗模式(如 STOP 模式)。
LPUART 在后台持续监听 UART 接口。
当接收到特定的字符(称为唤醒字符)时,LPUART 会触发中断或事件,唤醒 MCU。
唤醒后,MCU从低功耗模式恢复,执行正常的操作。
LPUART 唤醒功能的基本步骤
要使用 LPUART 的唤醒功能,你需要执行以下步骤:
1. 启用 LPUART 外设
在 CubeMX 或手动代码配置中,启用 LPUART 外设,并配置为 接收模式。确保 LPUART 外设的时钟已经启用,并正确配置其引脚。 配置 LPUART 中断和唤醒特性
配置唤醒字符:
LPUART 有一个 唤醒字符寄存器,设置唤醒字符值。可以通过该寄存器设置 MCU 唤醒所需要接收的特定字符。
使能 LPUART 中断:
启用 LPUART 接收中断,这样可以在接收到唤醒字符时触发中断,唤醒 MCU。
配置 MCU 进入低功耗模式时的行为:
使能适当的低功耗模式(如 STOP 模式)并确保 LPUART 继续工作。 在代码中配置 LPUART 唤醒
下面是一个简化的步骤,演示如何配置 STM32U083 LPUART 的唤醒功能。 LPUART 的唤醒功能可以用于在设备处于低功耗模式时,通过接收到特定的数据或字符来唤醒系统。 通过配置 STM32U083 的 LPUART 唤醒功能,STM32 可以在接收到特定的字符时唤醒系统,这对于需要在低功耗模式下长时间待机并仅在有数据到达时才唤醒的应用非常有效。 详细步骤与代码实现
1. CubeMX 配置
在 CubeMX 中,启用 LPUART 外设,配置其为接收模式。
在 Configuration 中选择 LPUART,并启用中断。
在 Low Power 配置中,选择适当的低功耗模式(如 STOP 或 STANDBY)。 初始化代码
在 main.c 文件中,可以使用如下代码来配置 LPUART 的唤醒功能:
c
复制代码
#include "main.h"
// 声明 LPUART 句柄
UART_HandleTypeDef hlpuart1;
void SystemClock_Config(void);
static void MX_LPUART1_UART_Init(void);
static void MX_GPIO_Init(void);
int main(void)
{
// 初始化 HAL 库
HAL_Init();
// 配置系统时钟
SystemClock_Config();
// 初始化 LPUART1
MX_LPUART1_UART_Init();
// 初始化 GPIO
MX_GPIO_Init();
// 启用 LPUART 的唤醒功能
HAL_UARTEx_EnableWakeUp(&hlpuart1, UART_WAKEUP_IDLELINE);
// 使能中断并启用低功耗模式
__HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_RXNE);// 启用接收中断
// 进入低功耗模式(例如 STOP 模式)
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
// MCU 唤醒后恢复执行
while (1)
{
// 可以在此处执行其他任务
}
}
// LPUART1 初始化函数
static void MX_LPUART1_UART_Init(void)
{
hlpuart1.Instance = LPUART1;
hlpuart1.Init.BaudRate = 9600;
hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
hlpuart1.Init.StopBits = UART_STOPBITS_1;
hlpuart1.Init.Parity = UART_PARITY_NONE;
hlpuart1.Init.Mode = UART_MODE_RX;
hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
hlpuart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&hlpuart1) != HAL_OK)
{
Error_Handler();
}
}
// GPIO 初始化(根据需要配置)
static void MX_GPIO_Init(void)
{
// 初始化 GPIO,通常包括配置 LPUART 的 TX/RX 引脚
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; // LPUART TX/RX 引脚
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// LPUART 中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
// 在这里可以处理接收到的数据
if (huart->Instance == LPUART1)
{
// 收到数据后,处理数据
}
}
// 错误处理函数
void Error_Handler(void)
{
// 用户可以根据需要编写自己的错误处理逻辑
__disable_irq();
while (1)
{
}
} 配置步骤包括启用 LPUART 外设时钟、配置引脚、初始化 LPUART 外设、启用唤醒功能并配置唤醒字符以及处理中断。 唤醒配置解释
HAL_UARTEx_EnableWakeUp(&hlpuart1, UART_WAKEUP_IDLELINE);
这行代码启用了 LPUART 的唤醒功能。在 UART_WAKEUP_IDLELINE 模式下,LPUART 会在收到 空闲线(即没有接收数据一段时间)时触发唤醒。
你可以选择其他唤醒方式,例如:UART_WAKEUP_STARTBIT,这表示通过接收到数据帧的起始位来唤醒。
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
这行代码让 MCU 进入 STOP 模式,并等待 WFI(Wait For Interrupt)事件来唤醒。在接收到指定的唤醒字符时,LPUART 会触发中断,并将 MCU 唤醒。 使能接收中断
在代码中,__HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_RXNE); 启用了接收中断(RXNE中断)。当 LPUART 接收到数据时,系统会触发中断,并执行 HAL_UART_RxCpltCallback() 回调函数。 调试和测试
验证唤醒功能:当 MCU 处于低功耗模式时,可以通过向 LPUART 发送数据来验证唤醒功能是否正常。接收到数据后,MCU 应该从低功耗模式中恢复,继续执行主程序。
调试:使用调试工具(如 ST-Link)查看系统的行为,确保 LPUART 配置正确且能成功唤醒 MCU。 常见问题与解决方法
LPUART 无法唤醒:
确认 LPUART 时钟已启用。
确认进入低功耗模式时,LPUART 被正确配置为继续工作。
确认唤醒字符设置正确。 中断无法触发:
确认 HAL_UART_RxCpltCallback() 回调函数已正确实现。
检查 NVIC 配置,确保相关的 UART 中断已启用。 功耗不符合预期:
确认除了 LPUART 外,其他外设(如定时器、GPIO)是否被禁用。
使用 STM32 的功耗分析工具,检查是否有额外的功耗来源。 在 STM32U083 上配置 LPUART 的唤醒功能,允许 MCU 在低功耗模式下接收特定的唤醒字符来恢复工作。通过正确配置 LPUART、低功耗模式、唤醒字符和中断,可以实现这一功能。使用 CubeMX 配置时,可以简化硬件和中间件设置,确保唤醒功能能够正常工作。 这是串口唤醒的吗? 可用于串口的低功耗项目中。没有串口信号的时候就休眠,感谢分享使用方法。 感谢分享,学习一下 LPUART这个功能挺实用的,低功耗项目还能保持通信,特别适合做无线传感器节点。
页:
[1]
2