当前位置: 首页 > news >正文

STM32H7的LPUART基础和唤醒示例

STM32H7的LPUART基础知识

  • 硬件框图
  • 低功耗的高级特性
  • 低功耗串口的时钟以及波特率
  • 低功耗串口发送时序
  • 低功耗串口支持的唤醒方式

LPUART 的全称是 Low power universal synchronous asynchronous receiver transmitter,中文意思是低功耗通用异步收发器,简称 LPUART

硬件框图

在这里插入图片描述
IRQ Interface 中断接口
用于实现中断方式的串口唤醒 lpusart_wkup 和串口的相关中断 lpusart_it。
DMA Interface DMA 接口
实现串口发送 lpuart_tx_dma 和接收 lpuart_rx_dma 的 DMA 方式。
COM Contronller 串口控制器
串口相关的寄存器基本都在这部分。
TxFIFO 和 RxFIFO
串口的发送和接收都支持了硬件 FIFO 功能。
TX 和 RX 引脚的互换功能
发送偏移寄存器(TX Shift Reg)和接收偏移寄存器(RX Shift Reg)与 TX 引脚,RX 引脚之间弄了个交叉连接,这里的意思是支持了引脚互换功能,这样大家在设计 PCB 的时候就可以比较随性了,接反了也没有关系。
发送过程经过的寄存器
依次是 LPUART_TDR -> TxFIFO ->Tx Shift Reg 偏移寄存器 –> TX 或者 RX 引脚。
接收经过的寄存器
依次是 TX 或者 RX 引脚-> Rx Shift Reg 偏移寄存器->RxFIFO –>LPUART_RDR。
两个时钟 lpuart_pclk 和 lpuart_ker_ck
这两个时钟是独立的,作用如下:
lpuart_pclk
用于为外设总线提供时钟。
lpuart_ker_ck
串口外设的时钟源。

低功耗的高级特性

数据逻辑电平翻转。
低功耗特性。
RX 和 TX 引脚交换。
MSB 位先发送。
外接 485 的 PHY 芯片时,硬件支持收发切换,无需用户手动控制 DE 引脚。

低功耗串口的时钟以及波特率

在这里插入图片描述
这里我们重点关注 PCLK3(D3PCLK1),HSI 和 LSE。
LPUART 时钟选择 LSE(32768Hz)
最高速度是 10922bps,最低 8bps(计算方法 3x < 32768 < 4096x,x 表示波特率)。
LPUART 时钟选择 HSI(64MHz)
最高值是 21MHz,最小值 15625bps(计算方法 3x < 64MHz < 4096x,x 表示波特率)。
LPUART 时钟选择 D3PCLK1(100MHz)
最大值 33Mbps,最小值 24414bps(计算方法 3x < 100MHz < 4096x,x 表示波特率)。

低功耗串口发送时序

在这里插入图片描述

低功耗串口支持的唤醒方式

检测到起始位唤醒。

/* 使能 LPUART 的停机唤醒 */
HAL_UARTEx_EnableStopMode(&UartHandle); 
/* 确保 LPUART 没有在通信中 */
while(__HAL_UART_GET_FLAG(&UartHandle, USART_ISR_BUSY) == SET){}
while(__HAL_UART_GET_FLAG(&UartHandle, USART_ISR_REACK) == RESET){}
/* 接收起始位唤醒 */
WakeUpSelection.WakeUpEvent = UART_WAKEUP_ON_STARTBIT;if (HAL_UARTEx_StopModeWakeUpSourceConfig(&UartHandle, WakeUpSelection)!= HAL_OK)
{Error_Handler(__FILE__, __LINE__);
}
/* 进入停机模式 */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
/* 退出停机模式要重新配置 HSE 和 PLL*/
SystemClock_Config();
/* 关闭 LPUART 的停机唤醒 */
HAL_UARTEx_DisableStopMode(&UartHandle);

检测到 RXNE 标志唤醒,即接收到数据。

/* 使能 LPUART 的停机唤醒 */
HAL_UARTEx_EnableStopMode(&UartHandle); 
/* 确保 LPUART 没有在通信中 */
while(__HAL_UART_GET_FLAG(&UartHandle, USART_ISR_BUSY) == SET){}
while(__HAL_UART_GET_FLAG(&UartHandle, USART_ISR_REACK) == RESET){}
/* 接收到数据唤醒,即 RXNE 标志置位 */
WakeUpSelection.WakeUpEvent = UART_WAKEUP_ON_READDATA_NONEMPTY;
if (HAL_UARTEx_StopModeWakeUpSourceConfig(&UartHandle, WakeUpSelection)!= HAL_OK)
{Error_Handler(__FILE__, __LINE__);
}
/* 进入停机模式 */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
/* 退出停机模式要重新配置 HSE 和 PLL*/
SystemClock_Config();
/* 关闭 LPUART 的停机唤醒 */
HAL_UARTEx_DisableStopMode(&UartHandle);

检测到匹配地址时唤醒。
匹配地址支持 7bit 和 4bit 匹配两种方式,比如我们采用 7bit 匹配,设置地址是 0x19,那么用户唤
醒的时候要将最高 bit 设置为 1,即发送地址 0x99(0b1001 1001)才可以唤醒。

/* 使能 LPUART 的停机唤醒 */
HAL_UARTEx_EnableStopMode(&UartHandle); 
/* 确保 LPUART 没有在通信中 */
while(__HAL_UART_GET_FLAG(&UartHandle, USART_ISR_BUSY) == SET){}
while(__HAL_UART_GET_FLAG(&UartHandle, USART_ISR_REACK) == RESET){}
/* 接收地址 0x99(发送的数据 MSB 位要为 1),可以唤醒 */
WakeUpSelection.WakeUpEvent = UART_WAKEUP_ON_ADDRESS;
WakeUpSelection.AddressLength = UART_ADDRESS_DETECT_7B;
WakeUpSelection.Address = 0x19;
if (HAL_UARTEx_StopModeWakeUpSourceConfig(&UartHandle, WakeUpSelection)!= HAL_OK)
{Error_Handler(__FILE__, __LINE__);
}
CLEAR_BIT(LPUART1->CR1, USART_CR1_RXNEIE); /* 关闭串口接收中断 */
/* 进入停机模式 */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
/* 退出停机模式要重新配置 HSE 和 PLL*/
SystemClock_Config();
SET_BIT(LPUART1->CR1, USART_CR1_RXNEIE); /* 使能串口接收中断 */
/* 关闭 LPUART 的停机唤醒 */
HAL_UARTEx_DisableStopMode(&UartHandle);

程序启动之后,调用下面两个函数:

__HAL_RCC_LPUART1_CLKAM_ENABLE(); /* 激活 LPUART 的自主模式,即停机状态下可以继续接收消息 */
__HAL_UART_ENABLE_IT(&UartHandle, UART_IT_WUF);/* 使能唤醒中断 */

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Kylin Cube资源使用限制:优化大数据查询性能的策略
  • 人工智能:大语言模型提示注入攻击安全风险分析报告下载
  • 【多线程】单例模式
  • leetcode-114. 二叉树展开为链表
  • javaEE-02-servlet
  • 科普文:Linux系统安全加固指南
  • js 数组常用函数总结
  • [M模拟] lc2844. 生成特殊数字的最少操作(简单易错+分类讨论+代码优化技巧)
  • QtCMake工程提升类后找不到头文件
  • docker拉取错误解决
  • 【网络】socket和udp协议
  • Istio_01_Istio初识
  • Git、Gitlab以及分支管理
  • Spring Data Redis 报错 WRONGPASS invalid username-password pair问题解决
  • vue 进入页面自动刷新并且只刷新一次
  • __proto__ 和 prototype的关系
  • 【347天】每日项目总结系列085(2018.01.18)
  • 2017 前端面试准备 - 收藏集 - 掘金
  • 77. Combinations
  • C语言笔记(第一章:C语言编程)
  • laravel 用artisan创建自己的模板
  • ng6--错误信息小结(持续更新)
  • opencv python Meanshift 和 Camshift
  • text-decoration与color属性
  • Vim 折腾记
  • 多线程事务回滚
  • 给Prometheus造假数据的方法
  • 实现简单的正则表达式引擎
  • 微信公众号开发小记——5.python微信红包
  • 在Unity中实现一个简单的消息管理器
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • #define、const、typedef的差别
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (2)STL算法之元素计数
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C语言)球球大作战
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (回溯) LeetCode 78. 子集
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (三十五)大数据实战——Superset可视化平台搭建
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • . NET自动找可写目录
  • .Net 8.0 新的变化
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET delegate 委托 、 Event 事件
  • .Net FrameWork总结
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • [ A*实现 ] C++,矩阵地图