| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 嵌入式 -> STM32—串口协议、串口外设 -> 正文阅读 |
|
|
[嵌入式]STM32—串口协议、串口外设 |
STM32—串口协议、串口外设 |
| 名称 | 引脚 | 双工 | 时钟 | 电平 | 设备 |
|---|---|---|---|---|---|
| USART | TX、RX | 全双工 | 异步 | 单端 | 点对点 |
| I2C | SCL、SDA | 半双工 | 同步 | 单端 | 多设备 |
| SPI | SCLK、MOSI、MISO、CS | 全双工 | 同步 | 单端 | 多设备 |
| CAN | CAN_H、CAN_L | 半双工 | 异步 | 差分 | 多设备 |
| USB | DP、DM | 半双工 | 异步 | 差分 | 点对点 |
| … | … | … | … | … | … |
串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信
单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力

简单双向串口通信有两根通信线(发送端TX和接收端RX)
TX与RX要交叉连接
当只需单向的数据传输时,可以只接一根通信线
当电平标准不一致时,需要加电平转换芯片

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



引脚:
TX RX: 发送和接收
SW-_RX :用于智能卡模式(很少用)
IRDA_OUT IRDA_IN: 红外通信数据的输出和输入
nRTS nCTS: 硬件流控(了解即可)
SCLK 同步时钟(同步模式下使用)
USART的引脚分配如下表,注意,只有USART1挂载到APB2高速总线上,其他的串口都是在APB1总线。

数据寄存器:USART_DR,是一个对应两个寄存器(USART_TDR和USART_RDR),寄存器的低9位[0:8]位数据有效,由USART_CR1的M位设置,当M = 0时,表示8个数据位(最常用),M = 1时表示9个数据位(很少用)。因为有两个寄存器,所以TX和RX可以同时收发。
接下来是发送和接收的具体流程:
USART_CR1寄存器
USART_CR1:UE USART使能 TE 发送使能 RE 接收使能

发送具体过程:
USART_SR: TXE 发送数据寄存器空,当TDR寄存器中的数据被硬件转移到移位寄存器中时,该位置1;当为0时,表示数据还没有转移到移位寄存器,这时DMA不能再往里传数据了。
USART_CR1:TXEIE 发送缓冲区空中断使能,当为1时,TDR为空(TXE = 1)就会产生中断。
USART_SR: TC 发送完成,此时移位寄存器为空,全部数据已通过移位寄存器发送完成,这里判断的是移位寄存器。
USART_CR1:TCIE 发送完成使能,当发送完成TC = 1时,产生USART1中断。
数据由CPU从内存中读取,或DMA传送,然后放到数据寄存器TDR中(寄存器USART_SR的TXE位置0),然后放到发送移位寄存器中(此时发送数据寄存器为空,TXE = 1),然后当发送移位寄存器把全部数据移位发出去后,

接收具体过程:
USART_SR: RXNE 读寄存器非空
USART_CR1:RXNEIE 接收缓冲区非空中断使能
数据一位一位的从RX转移到移位寄存器,然后移位寄存器八数据传送到接受数据寄存器RDR,此时RXNE标志位置1,如果我们检测到RXNE为1,就可以从RDR中读数据。读取USART_DR数据寄存器,RXNE位会清零。
波特率
BSART_BRR寄存器,分频器分为整数部分+小数部分

波特率如何产生?

计算方式如下:
目标波特率115200,使用USART1(72M),计算过程如下,整数部分很好计算,主要是小数部分。可以想象,小数的最大值为1,用4位二进制描述,则分为16′,每份1/16,我们的 小数部分 / (1 / 16) = 小数部分 * 16,就能知道占据了多少份。
USARTDIV(分频因子) = 72 000 000 / 16 / 115200 = 39.0625
整数部分DIV_Mantissa = 39 = 0X27,小数部分 = 0.0625 * 16 = 0X01,则应设置为0x271

串口空闲检测(非常有用):


字长

停止位



发送器和接收器的波特率由波特率寄存器BRR里的DIV确定
计算公式:波特率 = fPCLK2/1 / (16 * DIV)
例如配置9600的波特率:9600=72M / (16*DIV),DIV=468.75,转换到二进制为整数部分(000111010100),小数部分(1100)

发送接收代码——见STM32—USART串口发送+接收

既然都看到最后了,可否给个
呢,
关注收藏不迷路
给那些看完的朋友,奖励一个 赤赤博客-后端+前端,觉得不错的话可以推荐给身边的朋友哟!

|
|
| 嵌入式 最新文章 |
| 基于高精度单片机开发红外测温仪方案 |
| 89C51单片机与DAC0832 |
| 基于51单片机宠物自动投料喂食器控制系统仿 |
| 《痞子衡嵌入式半月刊》 第 68 期 |
| 多思计组实验实验七 简单模型机实验 |
| CSC7720 |
| 启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
| STM32初探 |
| STM32 总结 |
| 【STM32】CubeMX例程四---定时器中断(附工 |
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年10日历 | -2025/10/28 1:56:55- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |