STM32(十三):通信协议——USART串口协议

news2024/12/29 10:45:27

通信接口

        通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。

        通信协议:制定通信的规则,通信双方按照协议规则进行数据收发。

 TX (Transmit exchange) 数据发送角     RX (Receive exchange) 数据接收角

SCL (Serial Clock) 时钟      SDA (Serial Data)数据

SCLK (Serial Clock) 时钟    MOSI (Master Output Slave Input)主机输出数据脚 

MISO (Master Input Slave Output)主机输入数据角 CS (Select Chip)片选

CAN_H、CAN_L 差分数据脚   DP、DM 差分数据脚

串口通信

        串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。

        单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力。

硬件电路

        简单双向串口通信有两根通信线(发送端TX和接收端RX)

        TX与RX要交叉连接

        当只需单向的数据传输时,可以只接一根通信线

        当电平标准不一致时,需要加电平转换芯片

电平标准

        电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

        TTL电平:+3.3V或+5V表示1,0V表示0

        RS232电平:-3~-15V表示1,+3~+15V表示0

        RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)串口参数及时 

 串口参数和时序

        波特率:串口通信的速率

        起始位:标志一个数据帧的开始,固定为低电平

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

        校验位:用于数据验证,根据数据位计算得来

        停止位:用于数据帧间隔,固定为高电平

         空闲时刻是高电平,起始位是低电平

USART外设

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器

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

        自带波特率发生器,最高达4.5Mbits/s

        可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)

        可选校验位(无校验/奇校验/偶校验)

        支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN

        STM32F103C8T6 USART资源: USART1、 USART2、 USART3

USART框图:

        当数据从TDR移动到移位寄存器时候,置标志位TXE(TX Empty),发送器空,检查TXE为1,就可以在TDR写入下一个数据了。 发送移位寄存器在发送器控制的控制下,向右移位,一位一位的把数据输出到TX引脚。

        接收移位寄存将数据移动到RDR中后,会置RXNE(RX Not Empty)为1,检测到该位为1时,就可以把数据读走了。

        nRTS(Request To Send) 请求发送,是输出脚,告诉别人能不能接收。

        nCTS(Clear To Send) 清除发送,是输入脚,用于接收别人nRTS的信号。n的意思是低电平有效。

        一个支持流控的串口,它的TX接到我的RX。我的RTS要输出一个能不能接收的反馈信号,接到对方的CTS,当我能接收,RTS就置低电平,请求对方发送。对方CTS接收到后就可以一直发。当我处理不过来时,RTS就会置高电平,对方CTS收到后就会暂停发送。

        SCLK用于产生同步的时钟信号,配合发送移位寄存器进行输出。发送寄存器每移位一次,同步时钟电平跳变一个周期。只支持输出。用途:1. 兼容别的协议,例如串口+时钟和SPI很像。2. 自适应波特率。

        唤醒单元,实现串口挂载多设备。串口点对点,只支持两个设备回想通信。多设备可以在一条总线上接多个从设备。每个设备分配一个地址,想根某个设备通信,就进行寻址,确定通信对象,再进行数据收发。唤醒单元可以实现多设备的功能。

        

        空闲帧和断开帧是局域网的相关配置,这里先不管。 

   

        采样时钟会以波特率的16倍频率进行采样,在一位的时间里, 可以进行16次采样。最开始,空闲状态高电平,那采样就一直是1。突然采集到一个0,那么就说明在这两次采样之间,出现了下降沿,如果没有任何噪声,那之后就是起始位,会采集到16个0。但是在实际过程中,肯定会存在噪声。系统在采集到第一个0之后,然后会在地3、5、7      8、9、10个时钟,且每三位里面至少有两个0;如果有噪声,系统会置NE位,提示有噪声,使用时候请考虑。

波特率发生器

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

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

使用步骤:

第一步 RCC开启USART和GPIO时钟。

第二步 GPIO初始化,把TX配置成复用输出,RX配置成输入。

第三步 配置USART,直接使用一个结构体。

        接收功能还需要配置中断,在开启USART之前,再加上ITConfig和NVIC的代码就可以了。

第四步 开启USART

部分函数详解:

void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct);
void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct);

这两个函数是用来配置同步时钟输出的,包括时钟要不要输出,时钟的极性,相位等参数。

void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState); 开启USART到DMA的触发通道。

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 发送数据
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);  接收数据

printf函数移植方法:

        使用printf之前,打开工程选项,勾选UseMicroLIB,这个Keil为嵌入式平台优化的一个精简库。

        然后堆printf进行重定向,将打印的东西输出到串口。因为printf函数默认是输出到屏幕,我们单片机没有屏幕,所以要进行重定向。
 

int fputc(int ch,FILE *f){
    Serial_SendByte(ch);
    return ch;
}

fputs是printf的底层,printf函数在打印时候就是调用fputc来一个一个打印的,把fputc函数重定向到串口,printf就输出到串口了。

如果这个改写,只有只有串口1可以用,可以采用sprintf 这样所有都能用。

        char String[100];
        sprintf(String,"Num=%d\r\n",666);
        Serial_SendString(String);

printf(“你好世界”)编译器无法编一

在C/C++设置里加上如下指令

--no-multibyte-chars

串口接收可以使用查询和中断

        查询的流程是,在主函数里不断判断RXNE标志位。 如果置1,则收到数据了。

while(1)
	{
		if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)
		{
			RxData =USART_ReceiveData(USART1);
			OLED_ShowHexNum(1,1,RxData,2);
		}
	}

        中断       

void USART1_IRQHandler(void){
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET){
	
		Serial_RxData =USART_ReceiveData(USART1);
		Serial_RxFlag=1;
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
	}

}

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

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

相关文章

GIS在线监测SF6密度微水传感器免焊接格兰头航插插头

概述 GIS(气体绝缘金属封闭开关设备)中的SF6(六氟化硫)气体密度微水传感器航插技术是指在GIS设备中安装SF6气体密度和微水传感器,以实现对SF6气体状态的在线监测。这些传感器能够实时监测SF6气体的密度、微水含量以及其…

通过SQL语句判断奇偶数的几种方法

文章目录 1. 准备数据2. 使用 % 判断奇偶数3. 使用 MOD 判断奇偶数4. 使用按位与运算符 & 1. 准备数据 假设我们有一张测试表test_numbers -- 创建测试表 CREATE TABLE test_numbers (number_value INT );-- 插入测试数据 INSERT INTO test_numbers (number_value) VALUE…

效率神器来了:AI工具手把手教你快速提升工作效能

随着科技的进步,AI工具已经成为提升工作效率的关键手段。本文将介绍一些实用的AI工具和方法,帮助你自动化繁琐的重复性任务、优化数据管理、促进团队协作与沟通,并提升决策质量。 背景:OOP AI-免费问答学习交流-GPT 自动化重复性任…

数论-快速幂

快速幂 模板代码推导过程 求 A^B mod C,时间复杂度 O(logB) 模板代码 using ll long long; // 可以在头文件中添加这行ll qmi(ll a, ll b, ll c) {ll ans 1; // 初始化结果为 1a % c; // 将 a 取模 c,确保 a 小于 cwhile (b) …

【chrony安装】安装chrony服务作为NTP客户端(linux版)

文章目录 前言一、介绍chrony二、安装前准备三、安装chrony3.1. 在线安装chrony3.2. 离线安装chrony 四、服务端配置4.1. 配置服务端4.1.1. 服务端4.1.2. 客户端 4.2. 设置开机自启 五、常用命令六、安装验证七、国内常用NTP服务器总结 前言 本文章主要介绍在Centos系统&#…

高通Linux 交叉编译应用程序

1. 前提条件 Ubuntu 20.04 系统 高通RB3 Gen2开发板 2.下载并安装 eSDK 平台 1.从高通发布存档平台下载 eSDK。 wget https://artifacts.codelinaro.org/artifactory/qli-ci/flashable-binaries/qimpsdk/qcm6490/x86/qcom-6.6.28-QLI.1.1-Ver.1.1_qim-product-sdk-1.1.3.z…

各类元器件调试记录-E+H

一、EH压力传感器 适用型号为: Cerabar S PMC71, PMP71/75 Deltabar S FMD76/77/78, PMD70/75 Deltapilot S FMB70 调试过程:(后续补上图片) 一、湿标(湿调) 1、前提条件:罐体可以灌满和实际水箱水位高度 2、调试步骤: A、调节语…

电信网络携手大模型:AI赋能网络运维的新范式

当电信网络用上大模型,会带来怎样的体验? 过去,网络出现问题时,运维人员需要依赖经验反复排查,找到“病根”后再“对症下药”。但在大模型的加持下,问题的解决方式发生了颠覆性的改变。 如今,…

java中,怎么使用反射?

在Java中,反射(Reflection)是指在运行时能够获取类、方法、字段、构造函数等信息,并且能够在运行时动态调用类的方法、创建对象或访问字段。Java中的反射机制主要通过java.lang.reflect包中的类来实现。反射可以为开发者提供强大的…

上海泗博EtherNet/IP转PROFIBUS DP网关EPS-320IP成都地铁项目应用案例

背景: 地铁,作为城市的活力脉搏,不仅是衔接城市生活的关键纽带,更是现代城市交通体系中不可或缺的核心组成部分。因此,确保地铁的稳定运行对任何一座城市都至关重要。 上海泗博自动化,作为与成都地铁项目合…

C语言自定义类型结构体(24)

文章目录 前言一、结构体类型的声明结构体回顾结构体的特殊声明结构体的自引用 二、结构体的内存对齐对齐规则为什么存在内存对齐?修改默认对齐数 三、结构体传参四、结构体实现位段什么是位段位段的内存分配位段的跨平台问题位段的应用位段使用的注意事项 总结 前言…

安全区域边界等保测评

1.边界防护 应保证跨越边界的访问和数据流通过边界设备提供的受控接口进行通信。 [测评方法] 1)应核查在网络边界处是否部署访问控制设备;网闸和防火墙2)应核查设备配置信息是否指定端口进行跨越边界的网络通信,指定端口是否配置并启用了安全策略acl 3)应采用其他技术手…

C盘垃圾一个你不能忽视的问题!电脑小白学用这方法最简单好用!

C盘垃圾一个你不能忽视的问题!电脑小白学用这方法最简单好用!大家的电脑有没经常看到下图这样?C盘变成红色的了,这个因为是太多的垃圾文件堆积,而你又不经常清理这些垃圾。 所以就直接的导致了这些垃圾的堆积&#xff…

FloodFill算法(DFS+BFS)【上】

文章目录 FloodFill算法733. 图像渲染题目解析算法原理代码实现 200. 岛屿数量题目解析算法原理代码实现 695. 岛屿的最大面积题目解析算法原理代码实现 130. 被围绕的区域题目解析算法原理代码实现 FloodFill算法 FloodFill算法,中文名叫洪水灌溉 这些模拟一块区域…

SQL进阶技巧:火车票相邻座位预定一起可能情况查询算法 ?

目录 0 场景描述 1 数据准备 2 问题分析 2.1 分析函数法 2.2 自关联求解 3 小结 如果觉得本文对你有帮助,那么不妨也可以选择去看看我的数字化建设通关指南博客专栏 ,或许对你更有用。专栏原价99,现在活动价29.9,按照阶梯…

深圳前海港湾学校天桥下的免费停车点探寻

​最近开车去桂湾公园停车场的路上,看到有个天桥下有很多车停着,关键是这个地方离我搬砖的前海卓越写字楼还近,要是有时候桂湾公园停车位满了,停不进去的时候,是不是可以去这个天气下薅免费停车的羊毛?哈哈…

基于YOLO深度学习和百度AI接口的手势识别与控制项目

基于YOLO深度学习和百度AI接口的手势识别与控制项目 项目描述 本项目旨在开发一个手势识别与控制系统,该系统能够通过摄像头捕捉用户的手势,并通过YOLO深度学习模型或调用百度AI接口进行手势识别。识别到的手势可以用来控制计算机界面的操作&#xff0…

【OJ刷题】双指针问题4

这里是阿川的博客,祝您变得更强 ✨ 个人主页:在线OJ的阿川 💖文章专栏:OJ刷题入门到进阶 🌏代码仓库: 写在开头 现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论 目录 1…

Google宣布所有英语语种的Gemini Live用户现可免费使用

谷歌在Pixel 9系列手机的发布会上,同步推出了Gemini Live,该服务提供了一种移动对话体验,让用户和Gemini展开自由流畅的对话。Google现在宣布,所有使用英语的Gemini Live用户,可免费使用,此前为需要Advance…

RockyLinux-软件实现RAID5

一、背景 RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)是一种将多个物理硬盘驱动器组合成单一逻辑单元的技术,目的是提高存储性能、可靠性和/或数据冗余度。虽然早期的名字中包含“独立”(Independen…