STM32学习笔记(9_1)- USART串口协议

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。

最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com

本期开始学习STM32的通信接口,在STM32中,集成了很多用于通信的外设模块,比如这个表里,USART、I2C、SPI、CAN和USB,C8T6芯片是全部都支持的。

本期先学习USART串口。因为有些功能是STM32内部是没有的,比如我们想要蓝牙无线遥控的功能、想要陀螺仪加速度计测量姿态的功能,需要外挂芯片。而外挂芯片的数据都在外面,STM32如何获取这些数据呢?这就需要我们在这两个设备之间,连接上一根或多根通信线。通过通信线路发送或者接收数据,完成数据交换,从而实现控制外挂模块和读取外挂模块数据的目的。

通信接口

第一个USART串口,它的脚是TX和RX,有的地方也叫TXD和RXD,这两种名称是一个意思。

CAN通信,引脚是CAN_H和CAN_L,这两个是差分数据脚,用两个引脚表示一个差分数据。

USB通信,引l脚是DP(Data Positive)和DM(Data Minus),或者叫D+和D-,也是一对差分数据脚。

异步:没有SCL,所以需要双方约定一个采样频率,并目还需要加一些帧头帧尾等,进行采样位置的对齐。

串口和USB是点对点的通信。

串口通信

可以接电脑屏幕,非常适合调试程序,打印信息。像I2C和SPI这些,一般都是芯片之间的通信,不会接在电脑上。

左边的是USB转串口模块,上面有个芯片,型号是CH340。这个芯片可以把串口协议转换为USB协议。中间这个图是一个陀螺仪传感器的模块,可以测量角速度、加速度这些姿态参数,左右各有四个引脚,一边是串口的引脚,另一边是I2C的引脚。右边这个图是蓝牙串口模块,下面4个脚是串口通信的引脚,中间的芯片可以和手机互联,实现手机遥控单片机的功能。

串口硬件电路

TX和RX是单端信号,它们的高低电平都是相对于GND的。所以,串口通信的TX、RX是必须要接的。像下图这种,直接从控制器里出来的信号,一般都是TTL电平,相同的电平才能互相通信

串口常用的几种电平标准

RS232电平一般在大型的机器上使用,由手环境可能比较恶劣,静电干扰比较大。所以这里电平的电压都比较大,而目允许波动的范围也很大。

RS485电平,这里电平参考是两线压差,所以RS485的电平是差分信号。差分信号抗干扰能力非常强,使用RS485电平标准,通信距离可以达到上干米。而上面这两种电平,最远只能达到几十米,
再远就传不了了。

像单片机这种低压小型设备,使用的都是TTL电平,我们之后的内容,他都是基于TTL电平来讲解的。如果你做设备需要其他的电平,那就再加电平转换芯片就行了。在软件层面,它们都属于串口,所以程序并不会有什么变化。

串口参数及时序

还可在数据饿的最后加一个奇偶检验位,这样数据位就由8位变为9位。

首先,串口的空闲状态是高电平,也就是没有数据传输的时候。然后需要传输的时候,必须要先发送一个起始位,这个起始位必须是低电平,即通信开始前必须有个下降沿。同理,在一个字节数据发送完成后,必须要有一个停止位,同时这个停止位也是为了下一个起始位做准备。

串口通信是低位先行,也就是说低位的数据先发送。

奇偶校验可以判断数据传输是不是出错了,如果数据出错了,可以选择丢弃或者要求重传。校验可以选择3种方式,无校验、奇校验和偶校验。需要校验时,数据分为四个部分,起始位、数据位、校验位、停止位。如果使用了奇校验,那么包括校验位在内的9位数据会出现奇数个1。比如如果你传输00001111,目前总共4个1,是偶数个,奇校验时,校验位就需要再补一个1。如果想要更高的检错率,可以了解一下CRC校验,STM32中也有这个外设。

串口时序

最后,看几个串口的波形直观了解时序。

下图的波特率是9600,所以每一位的时间就是1/9600,大概是104us。 没发送数据的时候,是空闲状态高电平,数据开始先发送起始位,产生下降沿,代表数据帧开始。数据0x55转为二进制,低位先行,就是依次发送10101010。然后,这个参数是8位数据,1位停止,无校验,没有校验位,所以之后就是停止位,把引脚置回高电平,这样一个数据帧就完成了。

在STM32中,这个根据字节数据翻转高低电平,是由USART外设自动完成的,不用我们操心。当然,你也可以软件模拟产生这样的波形,那就是定时器定一个104us的时间,时间到之后,按照数据帧要求,调用GPIO_WriteBit置高低电平,产生一个和这一模一样的波形,这样也是可以完成串口通信的。TX引脚发送, 就是置高低电平,那在RX引脚接收,显然就是读取高低电平了,这也可以由USART外设自动来完成,不用我们操心。如果想软件模拟的话,那就是定时调用GPIO_ReadInputDataBit来读取每一位,最终拼成每一位,当然接收的时候,应该还需要一个外部中断,在起始位的下降沿触发,进入接收状态,并且对齐采样时钟,然后依次采样8次,这就是接收的逻辑。

 串口发送接收总结

总结一下就是,TX引脚输出定时翻转的高低电平,RX引脚定时读取引脚的高低电平。每个字节的数据加上起始位、停上位、可选的校验位,打包为数据帧,依次输出在TX写引脚,另一端RX引脚依次接收,这样就完成了字节数据的传递。在STM32中,这个根据字节数据翻转高低电平,是由USART外设自动完成的,如果想用软件模拟也可以,参考上面串口时序。

两个程序现象

串口发送

我们可以写一个串口的模块,通过串口通信,把一些数据发送到电脑上的串口助手来显示。

程序里先串口初始化,然后我们会写一些功能函数,比如串口发送一个字节,字节数据是0x41;串口发送一个数组,把这个MyArray数组一起发送出去;还有串口发送字符串、发送数字这些函数。

最后给出3种实现printf函数的方法,printf函数它是一个非常强大的格式化打印字符串函数,在这里,我们也可以把printf函数移植到串口这里来,用于向电脑的串口助手打印消息。

	/*下述3种方法可实现printf的效果*//*方法1:直接重定向printf,但printf函数只有一个,此方法不能在多处使用*/printf("\r\nNum2=%d", 222);			//串口发送printf打印的格式化字符串//需要重定向fputc函数,并在工程选项里勾选Use MicroLIB/*方法2:使用sprintf打印到字符数组,再用串口发送字符数组,此方法打印到字符数组,之后想怎么处理都可以,可在多处使用*/char String[100];					//定义字符数组sprintf(String, "\r\nNum3=%d", 333);//使用sprintf,把格式化字符串打印到字符数组Serial_SendString(String);			//串口发送字符数组(字符串)/*方法3:将sprintf函数封装起来,实现专用的printf,此方法就是把方法2封装起来,更加简洁实用,可在多处使用*/Serial_Printf("\r\nNum4=%d", 444);	//串口打印字符串,使用自己封装的函数实现printf的效果Serial_Printf("\r\n");

这里我们通过这个USB转串口模块,把STM32的串口引脚,接到电脑上来。之后电脑端可以打开串口助手的软件,选择一下串口号,其他参数也根据STM32程序的配置来,最后打开串口,按一下STM32的复位键。我们的程序在每次上电之后会通过串口发送一批数据,当切换模式为文本模式时,再按一下复位键,这时,软件就会对刚才的数据进行文本映射,找到每个数据对应的字符,以字符串的形式显示出来。这样,电脑上就能显示Num1=111、Num2=222等等这些文本了。

串口发送+接受

这里程序的主体部分是,先判断是否收到数据,如果收到数据,则读取数据,并将数据回传电脑,并且也在OLED上显示一下。实际上在串口中,只能发送二进制数,也就是十六进制的最直接的数据,如果想发送字符,那我们就需要一个数据到字符的映射表,最简单最常用的映射表,就是ASCII码表。在ASCII码表里,0x41这个数,就映射为字符A。所以发送0x41,如果以HEX模式显示,就是数据本身;如果以文本模式显示,它就会先去找一下映射表,最终发现,0x41对应的是字符A,所以就是显示A了。这就是HEX模式和文本模式的区别。

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

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

相关文章

Vue生命周期,从听说到深入理解(全面分析)

每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂载实例到 DOM,以及在数据改变时更新 DOM。在此过程中,它也会运行被称为生命周期钩子的函数,让开发者有机会在特定阶…

jmeter中参数加密

加密接口常用的方式有: MD5,SHA,HmacSHA RSA AES,DES,Base64 压测中有些参数需要进行加密,加密方式已接口文档为主。 MD5加密 比如MD5加密的接口文档: 请求URL:http://101.34.221…

2004-3-29-freeRTOS作业

1.总结keil5下载代码和编译代码需要注意的事项 1> 先编译看是否出错、 2> 点击“魔术棒”->Debug->Settings->查看是否成功安装驱动->下载 3> 编写代码记得写在CODE BEGIN和CODE END中间。 2.总结STM32Cubemx的使用方法和需要注意的事项 1> 选择对应…

大数据做「AI大模型」数据清洗调优基础篇

关于本文 近期一直在协助做AI大模型数据清洗调优的工作,主要就是使用大数据计算引擎Spark做一些原始数据的清洗工作,整体数据量大约6PB-8PB之间,那么对于整个大数据量的处理性能将是一个重大的挑战,关于具体的调优参数配置项暂时不…

Go打造REST Server【二】:用路由的三方库来实现

前言 在之前的文章中,我们用Go的标准库来实现了服务器,JSON渲染重构为辅助函数,使特定的路由处理程序相当简洁。 我们剩下的问题是路径路由逻辑,这是所有编写无依赖HTTP服务器的人都会遇到的问题,除非服务器只处理一到…

【八股】泛型

泛型存在的意义&#xff1f; 为了使相同的代码适用于多种数据类型&#xff0c;也就是代码复用。 参数类型上下限限制 <?> 无限制 <? extends E> 声明了类型的上界&#xff0c;表示参数类型可以是他或他的子类。 <? super E> 声明了类型的下界&#xf…

STM32之HAL开发——串口配置(源码)

串口收发原理框图&#xff08;F1系列&#xff09; 注意&#xff1a;数据寄存器有俩个一个是收一个是发&#xff0c;但是在标准库或者HAL库中没有特别区分开来是俩个寄存器&#xff01; USART 初始化结构体详解 HAL 库函数对每个外设都建立了一个初始化结构体&#xff0c;比如 …

2024年妈妈杯数学建模思路B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

ethers.js:sign(签名)

Signers 在ethers中Signer是以太坊账户的抽象&#xff0c;可以用来签名消息和交易&#xff0c;如将签名的交易发送到以太坊网络以执行状态更改的操作。 npm install ethers5.4.0// 引入 import { ethers } from ethers签名 this.provider new ethers.providers.Web3Provider(…

Docker安装xxl-job并整合到SpringBoot项目

1. 创建数据库 执行如下SQL语句创建相关表 CREATE database if NOT EXISTS xxl_job default character set utf8mb4 collate utf8mb4_general_ci; use xxl_job;SET NAMES utf8mb4; CREATE TABLE xxl_job_info (id int(11) NOT NULL AUTO_INCREMENT,job_group int(11) NOT NUL…

基于java+springcloud的分布式架构网上商城

开发语言&#xff1a;Java 框架&#xff1a;springcloud JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mave…

Python 垃圾回收和弱引用(Weakref)

Python中的赋值语句是建立变量名与对象的引用关系&#xff0c;多个变量可以引用同一个对象&#xff0c;当对象的引用数归零时&#xff0c;可能会被当作垃圾回收。而弱引用即可以引用对象&#xff0c;又不会阻止对象被当作垃圾回收&#xff0c;因此这个特性非常适合用在缓存场景…