当前位置: 首页 > news >正文

HAL库开发--串口

知不足而奋进 望远山而前行


目录

文章目录

前言

学习目标

学习内容

开发流程

串口功能配置

串口功能开启

串口中断配置

串口参数配置

查询配置结果

发送功能测试

中断接收功能测试

printf配置

DMA收发

配置

DMA发送

DMA接收(方式1)

DMA接收(方式2)

总结


前言

在嵌入式系统开发中,掌握串口通信是至关重要的一环。串口通信作为微控制器与外部设备或其他微控制器之间的主要通信方式,在各种嵌入式应用中起着重要作用。本文将介绍如何通过STM32CubeMX配置串口功能,并掌握串口发送、接收以及使用DMA进行数据传输的方法。同时,我们还将讨论如何配置printf函数,使其能够在串口上输出调试信息,以及如何处理串口接收中断。通过学习这些内容,读者将能够在嵌入式系统开发中更加灵活地应用串口通信功能。


学习目标

  • 熟悉STM32CubeMX配置流程
  • 掌握串口发送和接收
  • 掌握串口DMA发送和DMA接收
  • 掌握printf配置

学习内容

开发流程

  1. 配置芯片串口功能
  2. 编写串口代码
  3. 调试

串口功能配置

串口功能开启

  • Connectivity下选择合适的串口,这里选择USART1
  • 配置模式为异步,Asynchronous
串口中断配置

  • NVIC Settings下,打开串口中断。
串口参数配置

  • Parameter Settings中,根据情况配置串口的参数。
查询配置结果

GPIO Setting中可以显示默认的IO引脚

右侧芯片引脚部分会显示配置的结果。

发送功能测试

/* USER CODE BEGIN WHILE */
uint8_t cnt = 0;
while (1)
{HAL_UART_Transmit(&huart1, &cnt, 1, HAL_MAX_DELAY);cnt++;HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
}

通过HAL_UART_Transmit函数发送数据。

中断接收功能测试

/* USER CODE BEGIN WHILE */
HAL_UART_Receive_IT(&huart1, usart1_buffer, USART1_BUFFER_LEN);
while (1)
{/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
/* USER CODE BEGIN 0 */
#define USART1_BUFFER_LEN 1
uint8_t usart1_buffer[USART1_BUFFER_LEN];void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {HAL_UART_Transmit(&huart1, (const uint8_t *)usart1_buffer, USART1_BUFFER_LEN, HAL_MAX_DELAY);// 开启中断接收HAL_UART_Receive_IT(&huart1, usart1_buffer, USART1_BUFFER_LEN);
}
/* USER CODE END 0 */

接收任意个字节

触发空闲中断接收

HAL_UARTEx_ReceiveToIdle_IT(&huart1, usart_buffer, RX_BUF_LEN); // 常用

使用Idle空闲中断回调

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){usart_buffer[Size] = '\0';printf("callback2: %s\n", usart_buffer);HAL_UARTEx_ReceiveToIdle_IT(&huart1, usart_buffer, RX_BUF_LEN); // 常用
}

printf配置

#include <stdio.h>
int fputc(int ch, FILE* f) {HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1, 0xFFFF);return ch;
}

注意:如果加了printf无法打印日志,记得在 options 里勾选 MicroLIB

DMA收发

配置

DMA发送
/* USER CODE BEGIN WHILE */
uint8_t cnt = 0;
while (1)
{HAL_UART_Transmit_DMA(&huart1, &cnt, 1);cnt++;HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
}
DMA接收(方式1)
  • 触发接收
HAL_UART_Receive_DMA(&huart1, usart_buffer, RX_BUF_LEN); //  常用!
  • 接收回调函数
#define RX_BUF_LEN    12
uint8_t usart_buffer[RX_BUF_LEN + 1];void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){// 为了打印字符串usart_buffer[RX_BUF_LEN] = '\0';printf("callback1: %s\n", usart_buffer);// 再次启用中断接收(收到指定个字节才执行)HAL_UART_Receive_DMA(&huart1, usart_buffer, RX_BUF_LEN);  // 常用!}
DMA接收(方式2)

通过空闲中断事件接收,即发生空闲了才进行数据处理

  • 触发接收
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, usart_buffer, RX_BUF_LEN); // 常用!!!
  • 接收回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){// 为了打印字符串usart_buffer[Size] = '\0';printf("callback2[%d]: %s\n", Size, usart_buffer);// 再次启用接收(RX_BUF_LEN为最大接收数量)HAL_UARTEx_ReceiveToIdle_DMA(&huart1, usart_buffer, RX_BUF_LEN);  // 常用!}

总结

通过本文的学习内容,读者可以熟悉STM32CubeMX的串口配置流程,掌握串口发送和接收的基本方法,并了解如何使用DMA进行串口数据传输。在串口发送功能测试中,通过HAL_UART_Transmit函数实现了简单的数据发送;在中断接收功能测试中,通过HAL_UART_Receive_IT函数实现了中断接收,并介绍了触发空闲中断接收的方法。此外,还讨论了如何配置printf函数,使其能够在串口上输出调试信息。最后,通过DMA收发部分的介绍,读者可以了解如何配置DMA进行高效的串口数据传输,包括DMA发送和DMA接收的两种方式。通过这些学习内容,读者将能够在嵌入式系统开发中灵活运用串口通信功能,为实际应用开发提供技术支持。

http://www.lryc.cn/news/373313.html

相关文章:

  • Web前端设计毕业论文:深度探索与未来展望
  • JAVA 字节运算 取低5位 获取低位第一位
  • 全网首发:教你如何直接用4090玩转最新开源的stablediffusion3.0
  • 智慧监狱技术解决方案
  • QT——事件
  • 【SpringBoot】Spring Boot 中高级特性详解
  • MQTT TCP HTTP 协议对比
  • C++面向对象程序设计 - 函数库
  • computeIfAbsent是Java 8引入的Map接口中的一个方法
  • HTML实现进度条/加载框模版
  • Python 3 列表
  • Type-C接口显示器:C口高效连接与无限可能 LDR
  • 微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门
  • 护眼灯落地的好还是桌面的好?落地护眼灯性价比高的品牌推荐
  • 计算机网络-子网掩码的计算
  • Java:111-SpringMVC的底层原理(中篇)
  • Vue3新特性指南:探索新增指令、内置组件和改进
  • Qt项目天气预报(2) - 重写事件函数
  • uni-app前端,社区团购系统搭建部署
  • 基于iBeacon蓝牙定位技术的反向寻车系统
  • CCAA质量管理【学习笔记】​​ 备考知识点笔记(五)质量设计方法与工具
  • RIP路由协议汇总(华为)
  • 服务部署:.NET项目使用Docker构建镜像与部署
  • 力扣1170.比较字符串最小字母出现频次
  • boost asio异步服务器(3)增加发送队列实现全双工通信
  • 49.Chome浏览器有三种清缓存方式
  • Python爬取与可视化-豆瓣电影数据
  • 【背包题】oj题库
  • Web前端弱势因素:深入探讨与挑战解析
  • 元素在超出当前界面的下拉列表中如何定位