STM32cubemx教程及STM32入门(四)串口通信 2022.8.24
前言
本章主要介绍串口通信的概念以及在STM32单片机上通过STM32CubeMX和HAL库进行串口通信,同时重定义了printf函数。
简介
在串行通信中,一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束。在进行传输之前,双方一定要使用同一个波特率设置。波特率就是每秒钟传输的数据位数。
常用的两种基本串行通信方式包括同步通信和异步通信。
异步通信不带时钟同步信号(UART,单总线通信接口,LIN,调制解调,IrDA)
同步通信带时钟同步信号传输(SPI,IIC通信接口,智能卡)
UART和USART
UART和USART的区别见下图
STM32的USART
我们通常使用的是异步通信.异步通信规定传输的数据格式由起始位(start bit)、数据位(data bit)、奇偶校验位(parity bit)和停止位(stop bit)组成。
如下图为32的USART内部结构
下图为STM32的串行异步通信引脚接口
USART的寄存器
USART_SR:状态寄存器
USART_DR:数据寄存器
USART_BRR:波特率寄存器
这个寄存器的位15:4存放的是USARTDIV(USART分频器除法因子)的整数部分,位3:0存放的是USARTDIV的小数部分
波特率计算方法
PCLK1:用于USART2~5
PCLK2:用于USART1
通过上述公式我们可以计算出USARTDIV的值,向USART_BRR写入这个值就可以控制波特率
使用STM32Cubemx编写定时器中断程序的步骤
首先仍然是先配置HSE和时钟树,此时PCLK1为36MHz,PCLK2为72MHz
接着如下图所示配置串口初始化
Mode(模式)选择栏中:
Asynchronous异步通信
Synchronous同步通信
正下方分别是:
Baud Rate 波特率 115200
Word Length 传输数据长度 8
Parity 奇偶校验位 none
Stop Bits 停止位 1
发送和接收都使能
接着配置中断
生成文件与之前相同
HAL库中的USART函数
我们打开stm32f1xx_hal_uart.h头文件,可以看到hal库中和usart相关的所有函数
初始化函数
IO操作函数
这么多IO操作函数,大家只需要掌握常用几个就行
HAL_UART_Transmit();串口发送数据,使用超时管理机制
HAL_UART_Receive();串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收
传输中断函数
这里只要重点掌握以下即可
HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数
该函数会在中断处理中被调用。功能:对接收到的数据进行判断和处理 判断是发送中断还是接收中断,然后进行数据的发送和接收,在中断服务函数中使用。如果接收数据,则会进行接收中断处理函数,如果发送数据,则会进行发送中断处理函数。
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口发送中断回调函数
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中断回调函数
串口查询函数
HAL_UART_GetState(); 判断UART的接收是否结束,或者发送数据是否忙碌
重写printf函数
在usart.c文件中可看到串口1的初始化函数MX_USART1_UART_Init(void),以及管脚配置函数HAL_UART_MspInit()。C语言中的标准库中所用的标准输出函数,默认的输出设备是显示器,要实现串口或LCD的输出,必须重新定义标准库函数里与输出函数相关的函数。例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:只要自己添加一个int fputc(int ch, FILE *f)函数,能够输出字符就可以了。
在usart.c文件后面添加如下代码,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数。