完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本文首先讲解STM32CubeMX配置串口的操作,以及HAL库串口函数接口,详细的讲解各种收发方式(普通收发、中断收发、DMA收发),本文将HAL库与STM32CubeMX结合在一起讲解,可以更快速的学会各种收发方式的使用。
UART 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信,特别适用于远距离通信,但传送速度较慢。可实现全双工。 本文提供在中断接收后普通发送回显的示例代码; 后续还有DMA实现不定长收发示例代码; 【STM32】串口DMA空闲中断不定长收发配自定义装包与解包 DMA双缓冲收发。 【STM32】串口DMA之双缓冲 基本所有常用方式全部涵盖,一次通透。 所用工具:
HAL库函数介绍 HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); 函数分别是普通模式超时管理的发收、中断模式的发收、DMA模式下的发收。按需求直接使用就可以了。 普通发送接收在需要处调用就可以了; 中断模式接收一般将处理函数放入 HAL_UART_RxCpltCallback 串口接收中断回调函数中,在处理完后需要重新调用 HAL_UART_Receive_IT中断接收函数,否则函数只执行一次。 DMA模式下Mode 有循环模式和普通模式,循环模式只需调用一次,然后就一直装数据,而普通模式需要在在使用时调用。 代码示例 中断接收,普通发送回显接收内容 首先在main.c 中加入 /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxTemp, 1); /* USER CODE END 2 */ 新建 bsp_uart.c 代码如下 1 #include "bsp_uart.h" #include "string.h" #include "main.h" #include "usart.h" uint8_t RxBuf[256]; //作为接收后发送数据的Buffer uint16_t RxCount = 0; uint8_t RxTemp; //中断接收缓冲 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { UNUSED(huart); if(huart->Instance == USART1) { if(RxCount >= 255) { RxCount = 0; memset(RxBuf,0x00,sizeof(RxBuf)); } else { RxBuf[RxCount++] = RxTemp; //接收数据转存 if(RxTemp == 0x0A) /* 自定义通信协议,遇到回车换行符认为1个命令帧, 可自行加其它判断实现自定义命令 */ { HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuf, RxCount,0xFFFF); //将收到的信息发送回显 while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束 RxCount = 0; memset(RxBuf,0x00,sizeof(RxBuf)); //清空数组 } } } HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxTemp, 1); } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1614 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1541 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
682 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1592 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 23:14 , Processed in 0.763199 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号