STM32快速入门(串口传输之USART)

STM32快速入门(串口传输之USART)

前言

USART串口传输能实现信息在设备之间的点对点传输,支持单工、半双工、全全双工,一般是有三个引脚:TX、RX、SW_RX(共地)。不需要一根线来同步时钟。最大优点是可以和电脑通信,实现程序调试的功能。

导航

图248 USART框图:

整体框图

图片引自STM32 F1XX系列的中文参考手册。

USART发送和接收的实现细节

第一部分

首先,对于图248的1号矩形框部分。该部分负责数据的发送和接收。(类似人体的四肢

截取了中文手册有关USART的一幅时序图,如下:

时序图1

首先解释一下空闲帧和断开帧:

从图中可以看到,空闲帧包括了停止位。而断开帧是10位低电平,后跟停止位(当m=0时);或者11位低电平,后跟停止位(m=1时)。不可能传输更长的断开帧(长度大于10或者11位)。

发送流程:

  1. 引脚处于空闲状态时,一般是高电平状态。发送使能位被使能:USART_CR1.TE[3] 位被置为1。

  2. (由用户)数据写到发送数据寄存器。在写之前,用户会等待 USART_SR.TXE[7] 被硬件置位,只有该位被置为才说明发送数据寄存器为空,此时写入数据就是安全的,不会造成覆盖的问题。

  3. (以下步骤都是由硬件完成)将发送数据寄存器的内容移到发送移位寄存器,同时将USART_SR.TXE[7] 置位。以示发送数据寄存器为空。

  4. 发送一个起始位。(低电平)

  5. 从最低位开始,左移位将发送移位寄存器的值按位发送到TX引脚(对发送方)。

  6. 如果用户使能了 USART_CR1.PCE[10] ,会根据 USART_CR1.PS[9] 发送一个校验位。

  7. 最后,根据 USART_CR2.STOP[13:12] 的配置发送若干个停止位。(高电平)

  8. 将状态寄存器 USART_SR.TC[6] 置位,表示数据的一帧发送完成。

接收流程:

  1. 接收使能位被使能:USART_CR1.RE[2]

  2. (以下未特别说明,都是由硬件完成)从RX引脚(对接收方)检测到起始位,接收移位寄存器准备接收数据。

  3. 接收移位寄存器从最高位开始,左移位依次按位从RX引脚(对接收方)接收数据。

  4. 接收到停止位。

  5. 如果使能了校验位的话,根据配置进行数据校验。

  6. 校验合格的话,就将接收移位寄存器的值移到接收数据寄存器。

  7. USART_SR.RXNE[5] 置位,表示接收数据寄存器非空,提醒用户接收到数据了。

  8. (由用户)读取接收数据寄存器的数据。

注意:

  • 虽然用户可以操作的寄存器只有一个USART_DR,但是实际上发送和接收数据寄存器在硬件上是各自一个!这样的设计也是双缓冲的实践。

  • 在发送和接收数据之前,用户必须统一设置两端的波特率、校验方式、停止位的数量、字长。否则这四项数据不一致,一定会造成传输错误,导致传输无法进行。其原因从上面的传输流程很容易推断。

有关状态寄存器的位的解释如下:

状态寄存器图1

状态寄存器图2

上面对过载错误位做了一个特写。这是因为我再编码的过程中遇到的一个BUG。排查了半天,原因是当RXNEIE接收中断位使能时,发送方的ORE标志位和RXNE标志位的置位都会触发RXNE事件的中断,当中断处理函数在处理完毕后,只复位RXNE标志,而不管ORE,后续还是会不断的产生中断。所以根据手册(手册其实是有误的),我们需要先读USART_SR,在读USART_DR将ORE标志位清除。(注意!库函数Clear类函数不能清楚ORE位!),这

这里放一张中断请求对应的事件表:

中断事件表

第二部分

对于图248的2号矩形框部分。该部分负责接收和发送的控制,(类似人体大脑。

图中可以看到有很多的控制器、控制寄存器、标志寄存器等。我们可以设置相应的寄存器从而控制收发来实现一些功能。具体寄存器的功能可以参考中文手册,这里不过多赘述。

第三部分

对于图248的3号矩形框部分。该部分负责控制接收和发送的时钟。接收和发送的时钟也称之为波特率,通过波特率,通信双方就能协调其收发的频率(类似人体心脏。

从图248的3号矩形框部分,可知,发送和接受器时钟是相等的。而时钟最开始是来自F_PCLK,送和接受器的时钟是对F_PCLK进行了一个 (16 * USARTDIV) 分频,USARTDIV是一个可调的定点小数。

波特率生成

波特率寄存器

这里解释一下中文手册里面“如何从USART_BRR寄存器值得到USARTDIV”的示例一。 最开始看到这个例子我也是很懵的,什么是定点小数?这是怎么用整数来表示小数的?为什么 <Fraction (USARTDIV) = 12/16 = 0.75> 这里要除以16?原理是这样的:

USART_BRR寄存器里面按定点小数的方式存放USARTDIV的值。只使用了16位,高12位存放小数的整数部分,低4位存放的是小数部分。整数部分很好说,直接存放进去就好了。而小数部分呢,因为小数部分一定是小于1的,所以,它根据低4位所能代表的值,将1划分成了2^4份,也就是16份,每一份占1/16,所以我们要将小数部分表示成4位整数就将小数乘以16并向上取整即可。溢出的话就向整数部分进一。反之,要从4位整数还原小数,就用4位整数乘以1/16。

中文手册总结了一个公式:

波特率 = F_PCLK / (16 * USARTDIV)

通信必须维持相同的波特率。双方各自通过调节USARTDIV,就可以在不同环境下将双方但的波特率调成一样的。

此外,还应该说明的是,公式中,有一个乘以 1 / 16 的操作,这么做的目的是发送接收控制器里面有一个比波特率大16倍的采样频率。采样频率起到很好的滤波效果,它会对每一位进行16次采样。采样对于起始位的探测非常的精妙。并且,对于数据位,中间的8、9、10位会起到决定性作用。

起始位探测:

起始帧探测

首先,我们称对第3、5、7位的采样为第一阶段采样,对第8、9、10的采样为第二阶段采样。

  1. 如果该序列不完整,那么接收端将退出起始位侦测并回到空闲状态(不设置标志位)等待下降沿。

  2. 两个阶段检测的全是0,则确认收到起始位,这时设置RXNE标志位,如果RXNEIE=1,则产生中断。

  3. 如果两阶段中3个采样点上仅有2个是0,那么起始位仍然是有效的,但是会设置NE噪声标志位。如果不能满足这个条件,则中止起始位的侦测过程,接收器会回到空闲状态(不设置标志位)。

  4. 如果两个阶段只有一个阶段中3个采样点上仅有2个是’0’,那么起始位仍然是有效的,但是会设置NE噪声标志位。

数据位噪声探测:

数据采样

对数据位的采样只有一个阶段采样有效,即对8、9、10次采样。

上方图片的下面的表格已经规定了采样的值和状态的映射。读者可以好好的品味一下。

最后,注意因为定点数表示小数是有精度的,所以波特率的计算是存在误差的,具体误差可以查阅中文手册。此外通过中文手册可知F_PCLK有两种情况:

  • PCLK1用于USART2、3、4、5。

  • PCLK2用于USART1

USART发送和接收的配置步骤

USART的配置步骤比较简单。

  1. 通信双方确定好波特率、停止位数、校验方式、字长。

  2. 通过 USART_SR.RXNE[5] 产生的中断(接收数据寄存器非空),去异步接收数据。

  3. 通过直接读写USART_DR寄存器可以实现数据的接收和发送。

  4. 需要的话,可以等待 USART_SR.TC[6] 被硬件置位,来确保发送完成。

  5. 处理中断后,一定要注意彻底清除中断相应的标志位!防止中断假触发!

USART发送和接收的代码

我的开发板硬件连接图如下,所以本实验使用USART1进行串口通信。

硬件图

并且,将PA9、PA10分别配置成推挽复用输出、浮空输入或带上拉输入。

IO复用

GPIO的配置

代码如下:

int fputc(int ch,FILE *p) {//函数默认的,在使用printf函数时自动调用USART_SendData(USART1,(u8)ch);	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);return ch;
}void LunarNVICInit(){NVIC_InitTypeDef NVIC_Cfg;// 配置系统中断分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// CPU上开启USART的中断NVIC_Cfg.NVIC_IRQChannel = USART1_IRQn;NVIC_Cfg.NVIC_IRQChannelCmd = ENABLE;NVIC_Cfg.NVIC_IRQChannelPreemptionPriority = 2;NVIC_Cfg.NVIC_IRQChannelSubPriority = 2;NVIC_Init(&NVIC_Cfg);}void LunarInitUSART1() {GPIO_InitTypeDef GPIOA9_Cfg, GPIOA10_Cfg;USART_InitTypeDef USART1_Cfg;// PARCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 初始化GPIOA9为复用 (发送GPIOA9_Cfg.GPIO_Mode = GPIO_Mode_AF_PP;GPIOA9_Cfg.GPIO_Pin = GPIO_Pin_9;GPIOA9_Cfg.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIOA9_Cfg);// 初始化GPIOA10为复用 (接收GPIOA10_Cfg.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIOA10_Cfg.GPIO_Pin = GPIO_Pin_10;GPIO_Init(GPIOA, &GPIOA10_Cfg);// USART1RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);USART1_Cfg.USART_BaudRate = 115200;USART1_Cfg.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART1_Cfg.USART_Parity = USART_Parity_No;USART1_Cfg.USART_StopBits = USART_StopBits_1;USART1_Cfg.USART_WordLength = USART_WordLength_8b;USART1_Cfg.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_Init(USART1, &USART1_Cfg);// 接收中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 打开usartUSART_Cmd(USART1, ENABLE);
}// 中断处理程序
void USART1_IRQHandler(void) {if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {	// 接收数据中断uint16_t data = USART_ReceiveData(USART1);USART_SendData(USART1, data);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);USART_ClearFlag(USART1, USART_FLAG_TXE);} else {// 其他中断不做处理}// 顺序去读SR和DR清楚ORE位if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET){USART_ReceiveData(USART1);// USART_ClearFlag(USART1, USART_FLAG_ORE); // 函数USART_ClearFlag清楚不了USART_FLAG_ORE!!!}
}int main() {// 初始化usartLunarInitUSART1();LunarNVICInit();printf("stm32 启动\n");while(1) {}return 0;}

实验结果就是上位机通过给串口发送字符串,上位机接收框出现回显的效果。


本章完结

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

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

相关文章

停车场收费管理系统winfrom

停车场收费管理系统winfrom 管理员登陆后可以费用设置 修改密码 开户 充值 注销 入库 出库 退出 本项目通过dat文件格式存储数据 public static void Load() { string path Application.StartupPath "\data\data2.dat"; if (File.Exists(path)) …

4diacIDE同时编译不同版本踩坑记录

4diac不同版本依赖插件版本及jdk版本是不同的&#xff0c;当你需要搭建不同版本4diacIDE开发环境时&#xff0c;就会出现各种问题。最近一个月github上项目提交记录比较多&#xff0c;出现了不少坑。以下记录下此背景下的解决方法&#xff1a; 1、首先由于.target依赖的eclipse…

探索大语言模型在信息提取中的应用与前景

随着人工智能技术的快速发展&#xff0c;大语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域取得了显著的进展。特别是在信息提取&#xff08;IE&#xff09;任务中&#xff0c;LLMs展现出了前所未有的潜力和优势。信息提取是从非结构化文本…

【Linux】网络接口绑定和组合的操作实例

网络接口绑定和组合的操作实例 &#xff08;一&#xff09;网卡1. 增2. 查3. 激活——设置网络接口 &#xff08;二&#xff09;网络接口绑定1. 概述2. 实验操作3. 删除绑定 &#xff08;三&#xff09;网络接口组合1. 概述2. 实验操作 &#xff08;一&#xff09;网卡 1. 增 …

122. Kafka问题与解决实践

文章目录 前言顺序问题1. 为什么要保证消息的顺序&#xff1f;2.如何保证消息顺序&#xff1f;3.出现意外4.解决过程 消息积压1. 消息体过大2. 路由规则不合理3. 批量操作引起的连锁反应4. 表过大 主键冲突数据库主从延迟重复消费多环境消费问题后记 前言 假如有家公司是做餐饮…

web安全day03

MYSQL注入&#xff1a; SQL 注入的原理、危害及防御措施 SQL 注入的原理&#xff1a;原本的 SQL 语句在与用户可控的参数经过了如拼接、替换等字符串操作后&#xff0c;得到一个新的 SQL 语句并被数据库解析执行&#xff0c;从而达到非预期的效果。 SQL 注入的危害&#xff…

docker安装elasticsearch:7.17.21

docker安装elasticsearch:7.17.21 下载对应版本的docker镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.21启动容器 docker run --name elasticsearch-test -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -t docker.elastic.…

字节跳动(社招)四面算法原题

TikTok 进展 又是一期定时汇报 TikTok 进展的推文。 上周&#xff0c;美国总统拜登签署了价值 950 亿美元的一揽子对外援助法案。 该法案涉及强制字节跳动剥离旗下应用 TikTok 美国业务&#xff0c;即 针对 TikTok 非卖即禁的"强抢行为"开始进入九个月&#xff08;27…

如何使用Excel生成柱状图

一、先把数据表格填好 二、选择数据区域&#xff0c;点击插入→选择柱状图 三、选择好图表类型→插入预设图表 四、添加数据标签 单击柱状图→右击选择添加数据标签 五、效果如下

AI大模型探索之路-训练篇17:大语言模型预训练-微调技术之QLoRA

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

HKT x Microsoft 365 Copilot 助力企业提升工作效率

人工智能&#xff08;AI&#xff09;在工作场所的应用和整合日益增多&#xff0c;更成为塑造未来工作模式的革新趋势之一。AI不仅简化和改进了许多任务和流程&#xff0c;还为协作、沟通和创新开辟了新的机遇。不久前&#xff0c;微软新推出AI驱动的生成式生产力工具— Microso…

移除链表元素题目讲解

一&#xff1a;题目 二&#xff1a;思路讲解 方法一&#xff1a; 1&#xff1a;创建两个指针prev和cur&#xff0c;初识位置cur为head&#xff0c;prev为NULL&#xff0c;然后两个指针往后移动开始去寻找与val值吻合的节点&#xff0c;最后找到节点的时候&#xff0c;cur指向…

基于springboot实现体育馆管理系统项目【项目源码+论文说明】

基于springboot实现体育馆管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理…

delphi6直连redis服务(用lua脚本redis模块)

一、创建一个exe程序 创建一个exe程序,引用LuaRedis.pas单元(此单元自己封装的代码,目前主要封装了获取key和设置key/value功能),代码如下: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;type…

Watchdog,一双专为 Python 而生的守护者之眼

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;关注我&#xff0c;收看每期的编程干货。 一个简单的库&#xff0c;也许能够开启我们的智慧之门&#xff0c; 一个普通的方法&#xff0c;也许能在危急时刻挽救我们于水深火热&#xff0c; 一个新颖的思维方式&#xff0c;也许能…

自动驾驶 | 仿真测试-HiL测试全解析

1.HiL 的定义 HiL&#xff08;Hardware-in-the-Loop&#xff09;硬件在环是计算机专业术语&#xff0c;也即是硬件在回路。通过使用 “硬件在环”(HiL) &#xff0c;可以显著降低开发时间和成本。在过去&#xff0c;开发电气机械元件或系统时,使用计算机仿真和实际的实验就已经…

antd vue pro (vue 2.x) 多页签详细操作

antd vue pro 多页签配置操作&#xff0c;具体操作如下。 1.引入 tagviews文件 在 store/modules 中创建 tagviews.js &#xff0c;复制一下代码到文件中保存 const state {visitedViews: [],cachedViews: [] }const mutations {ADD_VISITED_VIEW: (state, view) > {if …

Element-ui-vue3-前端界面开发-配置-编辑main.js-nodejs基础语法-vue3-html模板语法-vue文件编译

前端配置 1.下载nodejs 18 lts2.配置nodejs和安装vue3.vue调试技巧3.1.debugger3.2.vue devtools4.编辑main.js5.nodejs基础语法5.1.import5.1.1.导入单个模块或组件5.1.2.导入整个模块或库5.1.3.导入默认导出5.1.4.导入 css文件5.1.5.导入模块和组件5.2.export5.2.1.命名导出5…

数学建模资料|历年数维杯数学建模竞赛真题及获奖论文汇总

2024年第九届数维杯大学生数学建模挑战赛:2024年5月10日08:00-5月13日09:00举行,为了更好的帮助参赛同学了解竞赛的赛制及赛题特点,数乐君今天给大家整理了历年数维杯国赛真题及优秀论文,方便同学们赛前巩固训练,掌握解题方法,提高获奖率。 2023年数维杯国赛真题(ABC题…

如何在没有备份的情况下恢复 Mac 上丢失的数据

如果您因意外删除、错误格式化硬盘或文件损坏而丢失了重要的、感伤的文件、照片或音乐&#xff0c;那么这可能会令人非常痛苦。幸运的是&#xff0c;您有几个选择。 您的 Mac 位于数字宇宙的中心。您可能会在上面留下照片和视频形式的记忆&#xff0c;以及来自您不再见面的朋友…