大家好,这里是大话硬件。
最近在项目中遇到了STM32串口的问题,复习一下这块的知识点。
UART模块的内部框图如下:
学习串口的时候,主要有以下几点核心内容。
- 寄存器的分类
串口模块内部的寄存器可以分为三种类型,分别是控制寄存器,状态寄存器,数据寄存器。
控制寄存器:Control register
状态寄存器:Status register
数据寄存器:Data register
这个三个寄存器,不仅仅是在串口模块中存在,可以同步迁移到很多硬件控制器里面。
控制寄存器控制硬件模块的功能,模块能正常工作,必须要正确配置控制寄存器。配置好控制寄存器后,如何判断模块工作状态,比如是否完成一次工作,现在完成度多少,都可以通过状态寄存器中的标志位来获取。最后就是数据寄存器,这个寄存器是CPU和外界进行数据交换的转运站。
- 数据寄存器
STM32内部没有单独配置接收数据寄存器和发送数据寄存器的方法,而是通过操作数据寄存器DR来控制接收和发送寄存器。
文档上可以看出,这个DR寄存器内部包含两个寄存器TDR和RDR。
如果CPU读数据寄存器,DR内部的RDR寄存器会和CPU建立通道,数据被读出来;如果CPU写数据给数据寄存器,DR内部的TDR回合CPU建立通道,数据被写进来。
- 接收过程
第一步:外面数据一位一位的传输到接收移位寄存器,当接收移位寄存器满了后,硬件会自动把这里面的数据搬运到RDR寄存器中;
第二步:当硬件把数据到搬到RDR中后,RDR会产生一个标注位,CPU通过持续检测这个标志位,检测到数据满了后,将数据读出。读出后,这个标志位不需要单独去操作给它清零,内部的硬件在会自动将RXNE置0,这样接收移位寄存器就能进行第二个字节的接收。
实现代码:
- 发送过程
第一步:上电后,TDR寄存器内部是空的,标志为上电默认就是1。CPU开始对这个寄存器写入数据,写完数据后,TDR寄存器会被硬件置为零。
第二步:此时TDR寄存器被写满了数据,状态位也被置为零,硬件开始搬运TDR内部的数据到发送移位寄存器,当搬运完以后,TDR寄存器内部的TXNE=1,说明可以进行第二次数据的写入;
实现代码:
以上即是UART模块接收和发送寄存器的关键点。
关注我,让我成为你的专属小太阳吧
515