打印
[其他ST产品]

LPUART 唤醒功能简介

[复制链接]
69|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
过期的塔头|  楼主 | 2024-12-28 00:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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从低功耗模式恢复,执行正常的操作。

使用特权

评论回复
沙发
过期的塔头|  楼主 | 2024-12-28 00:41 | 只看该作者
LPUART 唤醒功能的基本步骤
要使用 LPUART 的唤醒功能,你需要执行以下步骤:

1. 启用 LPUART 外设
在 CubeMX 或手动代码配置中,启用 LPUART 外设,并配置为 接收模式。确保 LPUART 外设的时钟已经启用,并正确配置其引脚。

使用特权

评论回复
板凳
过期的塔头|  楼主 | 2024-12-28 00:41 | 只看该作者
配置 LPUART 中断和唤醒特性
配置唤醒字符:

LPUART 有一个 唤醒字符寄存器,设置唤醒字符值。可以通过该寄存器设置 MCU 唤醒所需要接收的特定字符。
使能 LPUART 中断:

启用 LPUART 接收中断,这样可以在接收到唤醒字符时触发中断,唤醒 MCU。
配置 MCU 进入低功耗模式时的行为:

使能适当的低功耗模式(如 STOP 模式)并确保 LPUART 继续工作。

使用特权

评论回复
地板
过期的塔头|  楼主 | 2024-12-28 01:44 | 只看该作者
在代码中配置 LPUART 唤醒
下面是一个简化的步骤,演示如何配置 STM32U083 LPUART 的唤醒功能。

使用特权

评论回复
5
过期的塔头|  楼主 | 2024-12-28 01:44 | 只看该作者
详细步骤与代码实现
1. CubeMX 配置
在 CubeMX 中,启用 LPUART 外设,配置其为接收模式。
在 Configuration 中选择 LPUART,并启用中断。
在 Low Power 配置中,选择适当的低功耗模式(如 STOP 或 STANDBY)。

使用特权

评论回复
6
过期的塔头|  楼主 | 2024-12-28 01:45 | 只看该作者
初始化代码
在 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)
  {
  }
}

使用特权

评论回复
7
过期的塔头|  楼主 | 2024-12-28 01:46 | 只看该作者
唤醒配置解释
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 唤醒。

使用特权

评论回复
8
过期的塔头|  楼主 | 2024-12-28 01:46 | 只看该作者
使能接收中断
在代码中,__HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_RXNE); 启用了接收中断(RXNE中断)。当 LPUART 接收到数据时,系统会触发中断,并执行 HAL_UART_RxCpltCallback() 回调函数。

使用特权

评论回复
9
过期的塔头|  楼主 | 2024-12-28 01:46 | 只看该作者
调试和测试
验证唤醒功能:当 MCU 处于低功耗模式时,可以通过向 LPUART 发送数据来验证唤醒功能是否正常。接收到数据后,MCU 应该从低功耗模式中恢复,继续执行主程序。

调试:使用调试工具(如 ST-Link)查看系统的行为,确保 LPUART 配置正确且能成功唤醒 MCU。

使用特权

评论回复
10
过期的塔头|  楼主 | 2024-12-28 01:46 | 只看该作者
常见问题与解决方法
LPUART 无法唤醒:

确认 LPUART 时钟已启用。
确认进入低功耗模式时,LPUART 被正确配置为继续工作。
确认唤醒字符设置正确。

使用特权

评论回复
11
过期的塔头|  楼主 | 2024-12-28 01:47 | 只看该作者
中断无法触发:

确认 HAL_UART_RxCpltCallback() 回调函数已正确实现。
检查 NVIC 配置,确保相关的 UART 中断已启用。

使用特权

评论回复
12
过期的塔头|  楼主 | 2024-12-28 01:47 | 只看该作者
功耗不符合预期:

确认除了 LPUART 外,其他外设(如定时器、GPIO)是否被禁用。
使用 STM32 的功耗分析工具,检查是否有额外的功耗来源。

使用特权

评论回复
13
过期的塔头|  楼主 | 2024-12-28 01:47 | 只看该作者
在 STM32U083 上配置 LPUART 的唤醒功能,允许 MCU 在低功耗模式下接收特定的唤醒字符来恢复工作。通过正确配置 LPUART、低功耗模式、唤醒字符和中断,可以实现这一功能。使用 CubeMX 配置时,可以简化硬件和中间件设置,确保唤醒功能能够正常工作。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

966

帖子

0

粉丝