DMA空闲中断实现接收不定长数据(基于HAL库)
DMA空闲中断实现接收不定长数据(基于HAL库-F103ZET6):
第一步正常配置Cubemx:
1 时钟:
SYS:
2 LED: 我这里判断它进入的是哪个中断
第二步串口及DMA基础配置:
1 串口设置:
开启中断: 开启串口中断
2 DMA配置:打开串口接收DMA,模式选择Normal。
打开Keil工程:
在添加接受缓存数组
#include <string.h> //这个调用C的库函数
uint8_t ReceiveData[4]; //接收缓存数组
开启DMA串口空闲中断:
HAL_UARTEx_ReceiveToIdle_DMA(&huart1,ReceiveData,sizeof(ReceiveData));
//__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT); // 这个是清除中断挂起标志后面会举例
调用回调函数:
这里判断是串口进入那个中断
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart){
if(huart == &huart1){
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
}
}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
if(huart == &huart1){
HAL_UART_Transmit_DMA(&huart1,ReceiveData,Size);
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
HAL_UARTEx_ReceiveToIdle_DMA(&huart1,ReceiveData,sizeof(ReceiveData));
//__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
}
}
打开串口调试工具:
可以看到能正常收到信息
:::info
可以看到 D0-> PB5 灭了 说明进入 HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
:::
但是DMA有个缺点就是过半挂起就是在发送超过缓存数组一半的时候会自动发送(可以定义一个大点的缓存数组) 我们要求的确实完整的数据 所以需要清楚DMA的过半挂起 可以看到我们发送1234 但是才接受到12 这个时候我们就需要清除挂起
清除:可以看到失能 DMA_IT_HT就行了
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
现在就能正常收发信息了
完整工程:DM A
https://www.alipan.com/s/b8wSzvPjueR
提取码: pdk0
原文地址:https://blog.csdn.net/2301_79656184/article/details/140527764
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!