使用示例
/*初始化USART 配置模式为 115200 8-N-1,中断接收*/
DEBUG_USART_Config();
printf("欢迎使用野火 电机开发板 步进电机 速度闭环控制 位置式PID例程\r\n");
printf("按下按键1增加目标值、按键2减少目标值\r\n");
printf("其他操作请使用PID调试助手\r\n"); /* 初始化时间戳 */
这样即可以打印到串口助手上。
基础原理
USART(Universal Synchronous/Asynchronous Receiver/Transmitter)是STM32微控制器内部集成的一个硬件外设,用于串行数据通信。它能够根据数据寄存器中的一个字节数据自动生成数据帧时序,并通过TX引脚发送出去,同时也可以自动接收RX引脚的数据帧时序,将其拼接成一个字节数据并存放在数据寄存器中。
波特率生成器
- 功能:USART内置波特率发生器,最高支持4.5 Mbps的速率。
- 工作原理:波特率发生器通过对输入时钟频率进行分频来生成所需的波特率时钟。例如,如果APB2总线提供72 MHz的频率,波特率发生器将对其进行分频,生成所需的波特率时钟。在这个时钟下进行数据的收发,即为指定的通信波特率。
配置选项
- 数据位长度:可配置为8位或9位数据长度。
- 停止位长度:可选0.5、1、1.5或2个停止位。
- 校验位:可选无校验、奇校验或偶校验。
- 模式支持:
- 同步模式:用于需要时钟信号的通信。
- 硬件流控制:用于避免数据丢失的问题。
- DMA(直接存储器访问):用于大量数据传输,减轻CPU负担。
- 智能卡模式:支持智能卡通信。
- IrDA(红外数据协会):用于红外通信。
- LIN(局域网络接口):用于汽车通信网络。
硬件流控制
问题:当A设备通过TX向B设备的RX发送数据,如果A发送太快,B处理不过来,就可能导致数据丢失。
- 解决方案:硬件流控制在硬件电路上多出一根线,用于反馈B设备的准备状态。
- 当B设备没有准备好接受数据时,发送高电平信号。
- 当B设备准备好接受数据时,发送低电平信号。
- A设备根据B设备的反馈信号决定是否发送数据。
- 作用:避免数据丢失的问题,确保数据传输的可靠性。
- 使用:STM32支持硬件流控制,但一般情况下不常用。
DMA支持
- 功能:USART支持DMA(直接存储器访问)用于数据传输。
- 优势:在进行大量数据收发时,DMA可以直接将数据从存储器传输到USART外设或从USART外设传输到存储器,减轻了CPU的负担,提高了数据传输效率。
STM32F103C8T6的USART资源
- USART1:连接在APB2总线上。
- USART2、USART3:连接在APB1总线上。
串口初始化
- 开启时钟:首先,打开USART和GPIO所需的时钟。
- GPIO初始化:将TX引脚配置为复用输出,将RX引脚配置为输入。
- 配置USART:使用一个结构体配置所有参数。
- 启用USART:
- 如果只需要发送功能,直接启用USART。
- 如果需要接收功能,还需配置中断。在启用USART之前,添加ITConfig和NVIC的相关代码。
问题引入?
1、这两个函数的功能和区别?//HAL_UART_Receive_IT(&UartHandle,UART_RxBuffer,20); /*使能串口接收断 */ __HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE);
在 STM32 的 HAL 库中,HAL_UART_Receive_IT
和 __HAL_UART_ENABLE_IT
是用于配置和启用 UART 接收功能的两个关键函数。它们的区别在于功能不同,分别用于启动接收中断和使能特定的中断。
1. HAL_UART_Receive_IT
功能:
- 启动 UART 接收中断:该函数用于以中断模式启动 UART 接收数据。当接收到指定数量的数据时,会触发中断。
- 异步接收:通过中断方式接收数据,适合需要实时处理接收数据的场景。
- 数据缓冲区:需要传递一个接收缓冲区
UART_RxBuffer
(一个数组或指针),用于存储接收到的数据。 - 接收长度:需要指定接收的数据长度
20
,表示期望接收 20 个字节的数据。
触发条件:
- 当 UART 接收到指定数量的字节(例如 20 字节)时,触发接收完成中断。
- 调用回调函数
HAL_UART_RxCpltCallback
处理接收完成后的逻辑。
示例代码:
HAL_UART_Receive_IT(&UartHandle, UART_RxBuffer, 20);
关键点:
- 接收完成后,系统会自动调用回调函数
HAL_UART_RxCpltCallback
。 - 适用于需要接收固定长度数据的场景。
2. __HAL_UART_ENABLE_IT
功能:
- 使能特定的 UART 中断:该函数用于使能 UART 的特定中断源(例如,接收缓冲区非空中断