STM32之USART(串口)通信学习

1.通信接口

在开始通信之前,我们要了解什么是通信,通信就是将一个设备的数据传送到另一个设备

同时按照双方规定的协议即通信协议,指定通信规则通信双方按照规则进行数据的收发。

应用场景:单片机的串口可以使单片机与单片机、(单片机与电脑)、单片机与各式各样的模块互相通信。底下为单片机串口转USB接口,USB端口连接电脑,串口连接STM32.

2.USART通信电路模型

TX为发送数据,RX为接受数据。UART属于全双工可以同时进行收发数据,同时又属于异步,因为它们没有时钟线,通信双方约定好速率发送接受。

3.串口参数及时序

波特率:串口通信的速度。

起始位:数据帧的开始,固定为低电平。

数据位:有效的数据载荷,1为高电平,0为低电平,低位先行

校验位:用于数据验证,根据数据位计算得来。常见的有奇校验,偶校验,无校验。

停止位:数据停止,固定为高电平。

如下图所示左边:起始位-数据位-停止位

如下图所示右边:起始位-数据位-校验位-停止位

4.USART简介

USART为同步收发器,UART为异步收发器。要了解的是USART是STM32内部集成的一个硬件外设,可根据数据寄存器的一个字节自动生成数据帧时序,从TX引脚发送出去,同时自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里。

自带波特率发生器,最高达4.5Mbits/s 可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2) 可选校验位(无校验/奇校验/偶校验)

支持同步模式、硬件流控制(控制数据帧速度)、DMA(数据搬运)、智能卡、IrDA、LIN

STM32F103C8T6 USART资源: USART1(APB2)、 USART2(APB1)、 USART3(APB1).

下图为STM32中UART内部框图:主要的几个模块为发送数据寄存器TDR,发送移位寄存器,接受数据寄存器,接受移位寄存器,TX端口,RX端口,发送控制器,接受控制器,波特率发生器

5.USART基本结构

USART代码配置流程:

(1)开启时钟,把需要的USART和GPIO时钟打开。

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

(2)GPIO初始化,把TX端口配置成复用推挽输出(USART为STM32外设),RX配置为输入。

     GPIO_InitTypeDef GPIO_InitStructure;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//引脚9为TX发送端
     GPIO_Init(GPIOB, &GPIO_InitStructure);

(3)配置USART直接使用一个结构体。

  //USART配置9600波特率 8位字长 1位停止位 无校验位 无硬件流控制 只有发送模式
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate=9600;//波特率
    USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制选择无
    USART_InitStructure.USART_Mode= USART_Mode_Tx ;//模式为发送信息
    USART_InitStructure.USART_Parity=USART_Parity_No;//无校验位
    USART_InitStructure.USART_StopBits=USART_StopBits_1 ;//停止位占一位
    USART_InitStructure.USART_WordLength=USART_WordLength_8b ;//发送字长为8bit
    USART_Init(USART1,&USART_InitStructure);
    

(4)开启USART

    USART_Cmd(USART1,ENABLE);

6.波特率发生器

发送器和接收器的波特率由波特率寄存器BRR里的DIV确定

计算公式:波特率 = fPCLK2/1 / (16 * DIV)

7.发送数据帧

发送数据帧包含:起始位-数据位-校验位(可省略)-停止位

8.发送HEX数据包

HEX数据包(将多个数据打包)

数据包的任务:将属于同一批的数据进行打包和分割,方便接收方识别。

避免载荷数据与包头包尾重复的方法:(1)限幅:限制载荷数据的长度。(2)增加包头包尾的长度。

可变包长意味着载荷数据长度不一。

如下图所示:HEX数据包以0xFF开头,0xFE结尾。

9.发送文本数据包

文本数据意味着对发送的原始数据进行了编码译码

可变包长意味着载荷数据长度不一。

如下图所示:数据包以@开头,'\r'  '\n'结尾。

10.HEX数据包接受

对于串口接收数据来说可以使用查询和中断两种方式。

在本次实验中使用查询的方式:在主函数中不断判断RXNE标志位,置1表明接收到了数据,再调用ReceiveData,读取DR寄存器。

HEX数据包接收用到了状态机思路:(1)根据项目要求定义状态画几个圈(2)考虑好各个状态在什么情况下转移,如何转移画好线和转移条件(3)最后根据图来编程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件架构设计属性之5:可维护性属性分析与应用

文章目录 引言一、可维护性定义和重要性1.1 定义1.2 重要性 二、可维护性关键要素2.1 模块化2.2 单一职责2.3 低耦合2.4 高内聚2.5 抽象和封装2.6 实践建议 三、设计原则3.1 开闭原则3.2 依赖倒置原则3.3 评估方法3.4 挑战与解决方案 四、实战应用总结 引言 在当今数字化飞速发…

利用GNSS IMU集成提高车道级定位精度

准确的定位对于很多不同的事情都是至关重要的。导航系统可以引导我们去某个地方,自动驾驶汽车可以利用这些数据在道路上安全行驶。尽管全球导航卫星系统(GNSS)在定位方面非常出色,但它们可能并不总是提供最准确的车道水平事实。解决这个问题的一个有希望…

大模型对齐方法笔记四:针对领域问答来进行知识对齐方法KnowPAT

KnowPAT KnowPAT(Knowledgeable Preference AlignmenT) 出自2023年11月的论文《Knowledgeable Preference Alignment for LLMs in Domain-specific Question Answering》,主要针对领域问答来进行知识对齐。 在领域问答有两个挑战:希望输出满足用户的要…

15-通过JS代码处理窗口滚动条

selenium并不是万能的,页面上有些操作无法实现时,就需要借助JS代码来完成了。selenium提供了一个方法:execute_script(),可以执行JS脚本代码。 比如:当页面上的元素超过一屏后,想操作屏幕下方的元素&#x…

git报错prohibited by Gerrit: not permitted: update

git push报错: Push to refs/for/[branch] to create a review, or get Push rights to update the branch. Contact an administrator to fix the permissions (prohibited by Gerrit: not permitted: update)原因: 使用Gerrit代码审核时,本…

IsoBench:多模态基础模型性能的基准测试与优化

随着多模态基础模型的快速发展,如何准确评估这些模型在不同输入模态下的性能成为了一个重要课题。本文提出了IsoBench,一个基准数据集,旨在通过提供多种同构(isomorphic)表示形式的问题,来测试和评估多模态…

React-表单受控绑定

概念:使用React组件的状态(useState)控制表单的状态 1.准备一个React状态值 2.通过value属性绑定状态,通过onChange属性绑定状态同步的函数

Web自动化测试-掌握selenium工具用法,使用WebDriver测试Chrome/FireFox网页(Java

目录 一、在Eclipse中构建Maven项目 1.全局配置Maven 2.配置JDK路径 3.创建Maven项目 4.引入selenium-java依赖 二、Chrome自动化脚本编写 1.创建一个ChromeTest类 2.测试ChromeDriver 3.下载chromedriver驱动 4.在脚本中通过System.setProperty方法指定chromedriver的…

《软件方法(下)》8.3.4.5和《设计模式》中用语的区别

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.3 建模步骤C-2 识别类的关系 8.3.4 识别关联关系 8.3.4.4 类关系再整理 有了前面的知识,我们需要再整理一下类的关系。用类图表示类的关系如图8-134。 图8-134 “类的…

NextJs 数据篇 - 数据获取 | 缓存 | Server Actions

NextJs 数据篇 - 数据获取 | 缓存 | Server Actions 前言一. 数据获取 fetch1.1 缓存 caching① 服务端组件使用fetch② 路由处理器 GET 请求使用fetch 1.2 重新验证 revalidating① 基于时间的重新验证② 按需重新验证revalidatePathrevalidateTag 1.3 缓存的退出方式 二. Ser…

录制gif 强推LICEcap

LICEcap 官网:https://www.cockos.com/licecap/ 即按即用,录制好的gif可直接插入博客,yyds~

算法练习第25天|491. 非递减子序列

491. 非递减子序列 491. 非递减子序列https://leetcode.cn/problems/non-decreasing-subsequences/ 题目描述: 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案…

文件IO(三)

文件IO(三) 左移右移Linux的man 手册文件IO打开文件操作文件关闭文件 caps lock开灯关灯读取按键文件IO操作目录文件打开目录文件操作目录文件 库动态库和静态库的优缺点创建静态库创建动态库 按下右ctrl键 亮灭灯 左移右移 Linux的man 手册 文件IO 打开…

知网AI查重:AI工具如何助力通过检测?

论文降重一直是困扰各界毕业生的“拦路虎”,还不容易熬过修改的苦,又要迎来降重的痛。 其实想要给论文降重达标,我有一些独家秘诀。话不多说直接上干货! 1、同义词改写(针对整段整句重复) 这是最靠谱也是…

旅游门票预订系统小程序源码购票源码

功能介绍: 景点项目 支持发布多个景点项目、景点门票等。 在线支付 支持整合微信支付功能 一款基于ThinkPHP Uniapp开发的旅游i ]票预订系 统 支持景点]票、导游产品便捷预订、美食打卡、景点分 享、旅游笔记分享等综合系统,提供前后台无加密源码,支…

JS脚本打包成一个 Chrome 扩展(CRX 插件)

受这篇博客 如何把CSDN的文章导出为PDF_csdn文章怎么导出-CSDN博客 启发,将 JavaScript 代码打包成一个 Chrome 扩展(CRX 插件)。 步骤: 1.创建必要的文件结构和文件: manifest.jsonbackground.jscontent.js 2.编写…

汇编:调用Win32 API

在32位汇编程序中使用 Win32 API 是很常见的,特别是在开发 Windows 应用程序时调用的频率很高,Win32 API 提供了访问 Windows 操作系统功能的接口,包括窗口、消息处理、文件操作、网络通信等等。以下是使用 Win32 API 的一般步骤:…

Controller类明明写了@CrossOrigin跨域注解,但还是有跨域问题

可能是写的过滤器干扰到了跨域处理。如: 此时,先注释掉过滤器注解,让其不生效,就可以避免干扰跨域处理了 不过,这只能暂时解决该问题,毕竟过滤器还是要用的,后续我再探索一下。。。。。。。

springboot实现文件上传功能,整合云服务

文章目录 这是springboot案例的,文件上传功能的拆分,本篇将带大家彻底了解文件上传功能,先从本地存储再到云存储,全网最详细版本,保证可以学会,可以了解文件上传功能的开发文件上传功能剖析进行书写一个小的文件上传文件上传的文件三要素首先表单提交的方式要是 post方式,第二个…

艾体宝洞察 | Redis Enterprise对比ElastiCache

选择缓存数据库时,如何在Amazon ElastiCache和Redis Enterprise之间做出选择,应当考虑哪些标准? ElastiCache 通常可以满足基本的缓存需求,因此是一种适合初始阶段的解决方案。但随着使用量的增加,ElastiCache很快会变…