STM32H7的LPUART基础和唤醒示例

news2024/9/28 9:23:07

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);/* 使能唤醒中断 */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1949087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】栈的实现(数据结构)

前言&#xff1a; 还是举一个生活中的例子&#xff0c;大家都玩过积木&#xff0c;当我们把积木叠起来的时候&#xff0c;如果要拿到最底部的积木&#xff0c;我们必须从顶端一个一个打出&#xff0c;最后才能拿到底部的积木&#xff0c;也就是后进先出&#xff08;先进后出&a…

Python - 开源库 ReportLab 库合并 CVS 和图像生成 PDF 文档

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/140281680 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Report…

[Spring] MyBatis操作数据库(基础)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Elasticsearch概念及ELK安装

1、Elasticsearch是什么 它是elastic技术栈中的一部分。完整的技术栈包括&#xff1a; Elasticsearch&#xff1a;用于数据存储、计算和搜索 Logstash/Beats&#xff1a;用于数据收集 Kibana&#xff1a;用于数据可视化 整套技术栈被称为ELK&#xff0c;经常用来做日志收集…

WPF启动失败报System.Windows.Automation.Peers.AutomationPeer.Initialize()错误解决

问题描述 win10系统上WPF程序启动后就崩溃&#xff0c;通过查看崩溃日志如下&#xff1a; 应用程序: xxx.exe Framework 版本: v4.0.30319 说明: 由于未经处理的异常&#xff0c;进程终止。 异常信息: System.TypeLoadException 在 System.Windows.Automation.Peers.Automatio…

CMake 使用 OpenCV:从库中查找包含头文件

前言 在开发使用 OpenCV 的项目时&#xff0c;正确配置 CMake 是确保项目顺利构建和运行的关键。开发过程经常存在各种各样的意外和偶然, 是困难也是收获. 比如一直好好的项目, include某个头文件, 编译突然出现:No such file or directory CmakeTest/test_opencv.h:4: error:…

一套成熟的实验室信息管理系统源码,.Net 检验系统LIS源码,实现从采集、检测、报告、归档的全程跟踪管理

一套成熟的实验室信息管理系统源码。在长期的医疗信息化实践中&#xff0c;我们分析总结了大量客户实例&#xff0c;建立了以病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标的产品开发思路&#xff0c;将医学检验、科室管理和财务统计等检验科室/实验室…

ControlNet on Stable Diffusion

ControlNet on Stable Diffusion 笔记来源&#xff1a; 1.Adding Conditional Control to Text-to-Image Diffusion Models 2.How to Use OpenPose & ControlNet in Stable Diffusion 3.ControlNet与DreamBooth&#xff1a;生成模型的精细控制与主体保持 4.Introduction t…

【Python实战】Google Chrome的离线小恐龙游戏

文章目录 Google Chrome的离线小恐龙游戏项目结构大纲 &#x1f4ca;&#x1f463;逐步编码过程 &#x1f9e9;&#x1f4a1;第一步&#xff1a;项目初始化与主程序框架第二步&#xff1a;实现T-Rex的跳跃功能第三步&#xff1a;添加障碍物和碰撞检测第四步&#xff1a;添加得分…

Python3网络爬虫开发实战(1)爬虫基础

一、URL 基础 URL也就是网络资源地址&#xff0c;其满足如下格式规范 scheme://[username:password]hostname[:port][/path][;parameters][?query][#fragment] scheme&#xff1a;协议&#xff0c;常用的协议有 Http&#xff0c;https&#xff0c;ftp等等&#xff1b;usern…

正点原子 通用外设配置模型 GPIO配置步骤 NVIC配置

1. 这个是通用外设驱动模式配置 除了初始化是必须的 其他不是必须的 2. gpio配置步骤 1.使能时钟是相当于开电 2.设置工作模式是配置是输出还是输入 是上拉输入还是下拉输入还是浮空 是高速度还是低速度这些 3 和 4小点就是读写io口的状态了 3. 这个图是正点原子 将GPIO 的时…

2024中国大学生算法设计超级联赛(2)

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;彩笔ACMer一枚。 &#x1f3c0;所属专栏&#xff1a;杭电多校集训 本文用于记录回顾总结解题思路便于加深理解。 &#x1f4e2;&#x1f4e2;&#x1f4e2;传送门 A - 鸡爪解题思…

eclipse修改tomcat的Jre运行环境

1.双击tomcat 2.RuntimeEnvironment 3.选择

轨道式智能巡检机器人,助力综合管廊安全运维

1 引言 当前城市综合管廊建设已经成为世界范围内的发展趋势&#xff0c;2017年5月住建部、发改委联合发布《全国城市市政基础设施建设“十三五”规划》&#xff0c;截至2017年4月底国内地下综合管廊试点项目已开工建设687 km&#xff0c;建成廊体260 km&#xff0c;完成投资40…

redis的使用场景-热点数据缓存

1.什么是缓存&#xff1f; 把一些经常访问的数据放入缓存中&#xff0c;减少访问数据库的频率&#xff0c;减少数据库的压力&#xff0c;从而提高程序的性能。【内存中存储】 2.缓存的原理 通过上图可以看出程序首先访问缓存&#xff0c;如果缓存中有访问的数据会直接方会给客…

分布式系统常见软件架构模式

常见的分布式软件架构 Peer-to-Peer (P2P) PatternAPI Gateway PatternPub-Sub (Publish-Subscribe)Request-Response PatternEvent Sourcing PatternETL (Extract, Transform, Load) PatternBatching PatternStreaming Processing PatternOrchestration Pattern总结 先上个图&…

基于Golang+Vue3快速搭建的博客系统

WANLI 博客系统 项目介绍 基于vue3和gin框架开发的前后端分离个人博客系统&#xff0c;包含md格式的文本编辑展示&#xff0c;点赞评论收藏&#xff0c;新闻热点&#xff0c;匿名聊天室&#xff0c;文章搜索等功能。 项目在线访问&#xff1a;http://bloggo.chat/ 或 http:/…

Photos框架 - 自定义媒体资源选择器(数据部分)

引言 在iOS开发中&#xff0c;系统已经为我们提供了多种便捷的媒体资源选择方式&#xff0c;如UIImagePickerController和PHPickerViewController。这些方式不仅使用方便、界面友好&#xff0c;而且我们完全不需要担心性能和稳定性问题&#xff0c;因为它们是由系统提供的&…

基于扩散的生成模型的语音增强和去噪

第二章 目标说话人提取之《Speech Enhancement and Dereverberation with Diffusion-based Generative Models》 文章目录 前言一、任务二、动机三、挑战四、方法1.方法:基于分数的语音增强生成模型(sgmse)2.网络结构 五、实验评价1.数据集2.采样器设置和评价指标3.基线模型4.评…

godot新建项目及设置外部编辑器为vscode

一、新建项目 初次打开界面如下所示&#xff0c;点击取消按钮先关闭掉默认弹出的框 点击①新建弹出中间的弹窗②中填入项目的名称 ③中设置项目的存储路径&#xff0c;点击箭头所指浏览按钮&#xff0c;会弹出如下所示窗口 根据图中所示可以选择或新建自己的游戏存储路径&…