串口通信作为嵌入式系统中一种常见的数据传输方式,允许不同设备之间进行数据交换。STM32系列微控制器提供了丰富的串口通信接口,支持多种通信协议和配置选项。本文将详细介绍如何使用STM32的HAL库来实现串口通信,并提供实际的代码示例。
串口通信基础
串口通信概念
串口通信是一种点对点的通信方式,通常使用两条线:一条用于发送(TX),另一条用于接收(RX)。数据以串行方式传输,即一次传输一个比特。
串口通信的时序
串口通信的时序包括起始位、数据位、校验位和停止位。起始位标志着数据传输的开始,数据位是实际传输的信息,校验位用于错误检测,停止位表示数据传输的结束。
数据参数配置
串口通信的数据参数包括:
- 数据位长度(通常是7或8位)
- 校验方式(奇校验、偶校验或无校验)
- 停止位(1或2位)
- 波特率(传输速度,如9600、115200等)
使用STM32CubeMX配置串口
配置步骤
- 打开STM32CubeMX,选择目标MCU型号。
- 配置时钟树,确保为串口提供正确的时钟源。
- 在GPIO配置中,指定用于TX和RX的引脚。
- 在串口配置中,设置波特率、数据位、校验和停止位等参数。
- 生成代码并打开生成的工程。
示例配置
假设我们使用STM32L432KCU3作为目标MCU,配置串口1的波特率为9600,数据位为8,无校验,停止位为1。
串口通信的实现
阻塞方式发送和接收
使用HAL库提供的阻塞函数进行数据的发送和接收。
// 阻塞方式发送数据
void blocking_send(UART_HandleTypeDef *huart, uint8_t *data, size_t size) {
HAL_UART_Transmit(huart, data, size, HAL_MAX_DELAY);
}
// 阻塞方式接收数据
void blocking_receive(UART_HandleTypeDef *huart, uint8_t *buffer, size_t size) {
HAL_UART_Receive(huart, buffer, size, HAL_MAX_DELAY);
}
串口重定向
使用标准C库函数(如printf
和scanf
)进行数据的发送和接收。
// 重写fputc函数以实现printf重定向
int fputc(int ch, FILE *stream) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
// 使用printf发送数据
printf("Hello, STM32 World!\r\n");
中断方式发送和接收
使用串口中断进行数据的发送和接收。
// 中断方式发送数据
void interrupt_send(UART_HandleTypeDef *huart, uint8_t *data, size_t size) {
HAL_UART_Transmit_IT(huart, data, size);
}
// 中断接收数据的回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
// 处理接收到的数据
}
DMA方式发送和接收
使用DMA(直接内存访问)来提高数据传输的效率。
// DMA方式发送数据
void dma_send(UART_HandleTypeDef *huart, uint8_t *data, size_t size) {
HAL_UART_Transmit_DMA(huart, data, size);
}
// DMA接收数据的回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
// 处理接收到的数据
}
不定长数据的发送和接收
实现不定长数据的发送和接收,无需指定字符串长度。
// 不定长数据发送函数
void uart_send_bits(UART_HandleTypeDef *huart, const uint8_t *pData) {
while (*pData != '\0') {
HAL_UART_Transmit(&huart1, (uint8_t *)pData, 1, 0xffff);
++pData;
}
printf("\r\n");
}
总结
本文详细介绍了基于STM32 HAL库的串口通信实现方法,包括阻塞方式、重定向方式、中断方式和DMA方式。通过实际的代码示例,展示了如何在STM32微控制器上配置和使用串口进行数据传输。希望这些信息能够帮助嵌入式开发者更高效地实现串口通信功能。
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇