当前位置:网站首页>STM32基于HAL库的USART+DMA使用
STM32基于HAL库的USART+DMA使用
2022-06-29 06:47:00 【点灯大师~】
开发板:正点原子阿波罗
创建工程
使能USART
开启DMA

配置中断

以上配置好之后,点击生成工程
一、接收、发送指定长度数据
指定接收、发送的数据长度为1
定义一个接收缓冲区
char tx_buffer[10];
编写中断回调函数
当触发接收中断时,将接收到的数据通过DMA发送出去
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
//函数要使用DMA方式的
HAL_UART_Transmit_DMA(&huart1,tx_buffer,1);
}
}
当触发发送中断时,使用DMA接收一下
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
函数要使用DMA方式的
HAL_UART_Receive_DMA(&huart1,tx_buffer,1);
}
}
使能接收中断
在main.c中

编译、下载进去就能看到效果
二、接收、发送不定长度数据
接收不定长度时,需要判断USART什么时候为空闲状态,当触发空闲中断时,证明此时已经接收全部数据,需要
用到的函数有
HAL_UART_DMAStop(UART_HandleTypeDef *huart); //停止DMA传输
__HAL_DMA_GET_COUNTER(__HANDLE__); //得到DMA传输了多少数据
__HAL_UART_CLEAR_IDLEFLAG(__HANDLE__); //清除空闲标志
HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size); //使用DMA的方式发送
HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); //使用DMA的方式接收
使能空闲中断
在 MX_USART1_UART_Init() 函数中添加
/* USER CODE BEGIN USART1_Init 2 */
//使能空闲中断
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
/* USER CODE END USART1_Init 2 */
定义一个接收缓冲区
/* USER CODE BEGIN 0 */
#define RXSIZE 1024 /
uint8_t rx_buffer[RXSIZE] = {
0};
uint16_t RxNum = 0;
/* USER CODE END 0 */
编写USART1中断
/** * @brief This function handles USART1 global interrupt. */
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
//判断空闲标志
if (__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) == SET) {
//清除空闲中断标志
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
//停止DMA
HAL_UART_DMAStop(&huart1);
//接收了多长的数据
RxNum = RXSIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
//将接收到的数据再发送出去
HAL_UART_Transmit_DMA(&huart1,rx_buffer,RxNum);
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
编写中断回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
RxNum = 0;
//清空一个缓冲区
memset(rx_buffer,0,RXSIZE);
//使能接收
HAL_UART_Receive_DMA(&huart1,rx_buffer,RXSIZE);
}
}
使能接收中断
在main.c中
若是不添加这句则无法进入中断
编译、下载进去就能看到效果
边栏推荐
- Detailed explanation of route (Jiuyang Scripture)
- 498. diagonal traversal (simulation)
- 【kerberos】kerberos 认证浅析
- Prompt during packaging: property 'sqlsessionfactory' or 'sqlsessiontemplate'‘
- 498. 对角线遍历(模拟)
- Kyushu cloud helps Inner Mongolia's "counting from the east to the west" project to drive the smart new ecology of the surveying and mapping industry
- SQL Server 2008 publish and subscribe to SQL Server 2017 pit avoidance Guide
- 自动化测试 - uiautomator2框架应用 - 自动打卡
- 基于Sophus的Ceres优化
- 基础语法 - 位运算
猜你喜欢

【深度之眼吴恩达第四期作业班】多元线性回归Linear Regression with multiple variables总结

产品经理应该学习墨刀还是Axure?

穿越过后,她说多元宇宙真的存在

Prompt during packaging: property 'sqlsessionfactory' or 'sqlsessiontemplate'‘

编译原理王者之路

关于SqlSugar的多对多的级联插入的问题(无法获取集合属性的id,导致无法维护中间表)

Vulnhub's dc7 target

友元,静态关键字,静态方法以及对象间的关系

Vulnhub's DC8 target

ROS2中的行为树 BehaviorTree
随机推荐
How to share the virtual environment of pycharm to jupyter Lab
Wechat applet learning notes (summer vacation)
【工控老马】基于西门子S7-200PLC的跑马灯控制系统的设计方案详解
Sonic communication - streaming data processing - window alignment
Pointer reference array element
电检码配置
101. symmetric binary tree (recursive and iterative methods)
【量化投资系统】问题记录及解决方法
SizeBalanceTree
Codeforces Round #799 (Div. 4)
软重启(reboot)
js实现图片懒加载的一个详细方案(引入即可使用)
C compiler - implicit function declaration
在colaboratory上云端使用GPU训练(以YOLOv5举例)
100 lectures on Excel advanced drawing skills (VI) - practical application cases of Gantt chart in project progress
Protobuf binary file learning and parsing
环境准备 - 工程管理
搭建jenkins环境并自动关联打包好的工程jar进行自动发布
719. find the distance of the number pair with the smallest K (two points)
js异或混淆代码