❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。⭐️ 专栏主要内容: 主要学习STM32单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v
本学习过程参考:https://space.bilibili.com/383400717
STM3单片机安装软件、各种资料以及源码的路径:
链接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取码:asdf
链接里压缩包的解压密码:32
本大节主要学习USART的相关知识,包含九小节:
第一小节主要学习USART串口协议的理论基础知识
第二小节主要学习USART串口外设的理论基础知识
第三小节是对第一、二小节的内容写一个串口发送程序进行练习
第四小节是对第一、二小节的内容再写一个串口发送+接收的程序进行练习
第五小节主要学习USART串口数据包的理论基础知识
第六小节是对第五小节的内容写一个串口收发HEX数据包程序进行练习
第七小节是对第五小节的内容再写一个串口收发文本数据包程序进行练习
第八小节主要了解MyMcu串口下载的知识
第八小节主要了解STLINK Utility串口下载的知识
最终附上所有的源代码;
本小节主要学习USART串口外设的理论基础知识。
文章目录
- 一、USART简介
- 二、USART框图
- 三、USART基本结构(重要!!!)
- 四、数据帧
- 五、起始位侦测
- 六、数据采样
- 七、波特率发生器
一、USART简介
- USART通用同步/异步收发器;UART通用异步收发器;一般我们串口很少使用同步功能,所以USART和UART使用起来也没什么区别;我们也是主要学习异步通信;
- USART外设,其实就是串口通信的硬件支持电路;
- USART大体可以分为发送和接收两部分;发送部分就是将数据寄存器的一个字节数据自动转换为协议规定的波形,从TX引脚发送出去;接收部分就是自动接收RX引脚的波形,按照协议规定解码为一个字节数据,存放在数据寄存器里;这就是USART电路的功能;当我们配置好了USART电路,
直接读写数据寄存器,就能自动发送和接收数据了
; - 波特率发生器是用来配置波特率的,其实就是一个分频器;比如我们APB2总线给个72MHz的频率,然后波特率发生器进行一个分频,得到我们想要的波特率时钟,最后在这个时钟下进行收发,就是我们指定的通信波特率了;
- 串口参数我们最常用的是:波特率9600或115200;数据位8位;停止位1位;无校验;
二、USART框图
左上角是引脚部分,如下图所示:
- TX和RX是发送和接收引脚,剩下的三个引脚是智能卡和IrDA通信的引脚;
- TX和RX连接的寄存器如下图所示:
串口的数据寄存器如下图所示,
- 发送或者接收的字节数据都存在上图框出来的数据寄存器部分;
- 上面是有两个数据寄存器,一个是发送数据寄存器TDR(Transmit DR),另一个是接收数据寄存器RDR(Receive DR);这两个寄存器占用同一个地址,在程序上,只表现为一个寄存器,就是数据寄存器DR(Data Register);但是实际硬件中是分成了两个寄存器的,一个用于发送TDR,一个用于接收RDR;TDR是只写的,RDR是只读的;当你进行写操作时,数据就写入TDR;当你进行读操作时,就从RDR读出数据;
- 下面是两个移位寄存器,一个用于发送,一个用于接收;发送移位寄存器的作用是把一个字节的数据一位一位地移出去,正好对应串口协议的波形的数据位;只要数据从TDR转移到发送移位寄存器,
TXE标志位
就会被置1,我们就可以写入新的数据了;然后发送移位寄存器就会在发送器控制的驱动下,向右移位,然后一位一位地把数据输出到TX引脚;当接收寄存器接收完一个数据,这一个数据就会一下子转移到接收数据寄存器RDR里,在转移过程中,也会置一个标志位,叫RXNE
(RX Not Empty),接收数据寄存器非空;当我们检测到RXNE置1后,就可以把数据读走了;
三、USART基本结构(重要!!!)
- 上图是USART最主要、最基本的结构
- 最左边是
波特率发生器
,用于产生约定的通信速率;时钟来源是PCLK2或1;经过波特率发生器分频后,产生的时钟通向发送控制器和接收控制器; 发送控制器
和接收控制器
用来控制发送移位和接收移位;- 之后,由
发送数据寄存器
和发送移位寄存器
这两个寄存器的配合,将数据一位一位的移出去,通过GPIO的复用输出,输出到TX引脚;产生串口协议规定的波形;图中在发送移位寄存器那里画了移位的符号>>
,代表这个移位寄存器是往右移的,是低位先行;当数据由移位寄存器转到移位寄存器时,TXE
(TX Empty)标志位被置1;我们判断这个TXE标志位
就可以知道是不是可以写下一个数据了; - 接收部分也类似,RX引脚的波形通过GPIO口输入,在接收控制器的控制下,一位一位地移入
接收移位寄存器
,这里画了右移的符号>>
,也是右移的,因为是低位先行,所以要从左边开始移进来,移完一帧数据后,数据就会统一运转到接收数据寄存器
;在转移的同时,置一个RXNE
(RX Not Empty)标志位;我们检查这个标志位,就可以直到是不是接收到数据了;同时这个标志位也可以去申请中断,这样就可以在收到数据时,直接进入中断函数,然后快速的读取和保存数据; - 如下图所示,其实是有4个寄存器,但是在软件层面,只有一个DR寄存器可以供我们读写,写入DR时,数据走上面TX这条路进行发送;读取DR时,数组走RX这条路进行接收;
- 以上就是USART进行串口数据收发的过程;
四、数据帧
- 对于字长设置,我们一般选择9位字长的有校验或者8位字长的无校验;
- 停止位的长度可以配置为
0.5
、1
、1.5
、2
这四种,这四种参数的区别就是停止位的时长不一样;各自对应的波形如上图所示;我们一般选择1个长度;