基于STM32 HAL库的串口通信实现与应用

串口通信作为嵌入式系统中一种常见的数据传输方式,允许不同设备之间进行数据交换。STM32系列微控制器提供了丰富的串口通信接口,支持多种通信协议和配置选项。本文将详细介绍如何使用STM32的HAL库来实现串口通信,并提供实际的代码示例。

串口通信基础

串口通信概念

串口通信是一种点对点的通信方式,通常使用两条线:一条用于发送(TX),另一条用于接收(RX)。数据以串行方式传输,即一次传输一个比特。

串口通信的时序

串口通信的时序包括起始位、数据位、校验位和停止位。起始位标志着数据传输的开始,数据位是实际传输的信息,校验位用于错误检测,停止位表示数据传输的结束。

数据参数配置

串口通信的数据参数包括:

  • 数据位长度(通常是7或8位)
  • 校验方式(奇校验、偶校验或无校验)
  • 停止位(1或2位)
  • 波特率(传输速度,如9600、115200等)

使用STM32CubeMX配置串口

配置步骤

  1. 打开STM32CubeMX,选择目标MCU型号。
  2. 配置时钟树,确保为串口提供正确的时钟源。
  3. 在GPIO配置中,指定用于TX和RX的引脚。
  4. 在串口配置中,设置波特率、数据位、校验和停止位等参数。
  5. 生成代码并打开生成的工程。

示例配置

假设我们使用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库函数(如printfscanf)进行数据的发送和接收。

// 重写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视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI_Guru人工智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值