学习目标:
- 掌握 STM32 基础知识
学习内容: 1、利用串口可以帮助我们调试程序,本节介绍的为串口最基本、最常用的方法,全双工、异步通讯方式。
2、要配置串口通讯,至少要设置以下几个参数:字长(一次传送的数据长度)、波特率(每秒传输的数据位数)、奇偶校验位、还有停止位。
在初始化串口的时候,必然有一个串口初始化结构体,这个结构体的几个成员就是有来存储这些控制参数的。
3、串口线主要分两种,直通线(平行线)和交叉线。
假如PC与板子之间要实现全双工串口通讯,必然是PC的Tx针脚要连接到板子的Rx针脚,而PC的Rx针脚则要连接至板子的Tx针脚了。由于板子和pc的串口接法是相同的,就要使用交叉线来连接了。
直通线接法:开发板Tx连接至DB9的第2针脚,而Rx连接至第3针脚,这与PC接法是相反的,这样的板子与PC通讯就需要使用直通线了。
文章图片
要实现基本的全双工异步通讯,只要3条线,分别为Rx、Tx、和GND。
4、串口架构图
文章图片
从下至上,串口外设主要由三个部分组成,分别是波特率的控制部分、收发控制部分及数据存储转移部分。
5、发送接收数据过程:
当我们需要发送数据时,内核或DMA外设(一种数据传输方式)把数据从内存(变量)写入到发送数据寄存器TDR后,发送控制器将适时地自动把数据从TDR加载到发送移位寄存器,然后通过串口线Tx,把数据一位一位地发送出去,在数据从TDR转移到移位寄存器时,会产生发送寄存器TDR已空事件TXE,当数据从移位寄存器全部发送出去时,会产生数据发送完成事件TC,这些事件可以在状态寄存器中查询到。
而接收数据则是一个逆过程,数据从串口线Rx一位一位地输入到接收移位寄存器,然后自动地转移到接收数据寄存器RDR,最后用内核指令或DMA读取到内存(变量)中。
6、函数运行过程
文章图片
首先调用函数 USART1_Config(),函数USART1_Config()主要做了如下工
- 使能了串口1的时钟
- 配置好了usart1的I/O
- 配置好了usart1的工作模式,具体为波特率为 115200 、8个数据位、1个停止位、无硬件流控制。 即 115200 8-N-1。
文章图片
具体的USART1_Config() 在usart1.c这个用户文件中。
一般情况下,该外设的配置都在该外设的.C文件中
文章图片
8、通讯协议要求两个通讯器件之间的波特率、字长、停止位奇偶校验位都相同。
USART1_printf()便是一个完全自定义的格式输出函数,它的功能与重定向之后的printf类似。格式化输出,类似于C库中的printf,但这里没有用到C库
printf() 函数会受缓冲区大小的影响,有时候在用它打印的时候程序会发生莫名奇妙的错误,而实际上就是由于使用printf() 这个函数引起的,其优点就是这种情况很少见且支持的格式较多。
而USART1_printf()则不会受缓冲区的影响产生莫名的错误,但其支持的格式较少。
学习总结: 硬件流,在STM32的很多外设都具有硬件流的功能,其功能表现为:当外设硬件处于准备好的状态时,硬件启动自动控制,而不需要软件再进行干预。
main.c文件中要把 stdio.h 这个头文件包含进来,还要在编译器中设置一个选项 Use MicroLIB (使用微库)
【单片机|STM32学习总结之------串口通信USART】实验结果可以把主函数main里面的 printf 的内容打印出来,可以用来显示程序运行位置。
推荐阅读
- STM32cubeIDE|STM32cubeIDE-DMA收发串口不定长数据
- stm32|STM32CubeIDE开发笔记 MK.III - UART串口通信(普通/中断/DMA)
- STM32cubeIDE|STM32cubeIDE学习汇总(六)---串口,DMA
- stm32cube|STM32CUBEMX开发GD32F303(8)----USART收发配置
- stm32cube|STM32CUBEMX开发GD32F303(9)----USART通过DMA收发
- STM32—cubeIDE+DMA+USART 接收任意长度的数据
- 单片机|STM32CUBEIDE(7)----USART收发配置
- STM32实现HID键盘
- 单片机|**51 stm8 arduino esp8266 esp32 stm32 树莓派 等单片机使用对比**