【STM32 系列】基于HAL库的串口DMA空闲中断接收+串口DMA发送
CubeMx配置
串口常规配置


串口DMA配置

打开串口中断

串口空闲中断DMA接收-程序
串口初始化编写
点击查看代码
void usart_rx_init(void)
{
/* 打开串口DMA空闲中断接收 */
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, usart1_rx_DMA_buffer, sizeof(usart1_rx_DMA_buffer));
/* 关闭串口半传输中断 */
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);
}
关键程序编写
1、先外部定义串口接收和发送DMA结构体(官方配置并没有外部定义)
点击查看代码
extern DMA_HandleTypeDef hdma_usart1_rx;
extern DMA_HandleTypeDef hdma_usart1_tx;
2、定义一个接收数组一个发送数组和一个转存数组
点击查看代码
#define USART_LEN 20
uint8_t usart1_rx_DMA_buffer[USART_LEN];
uint8_t usart1_tx_DMA_buffer[USART_LEN];
uint8_t Rx[USART_LEN];
3、串口空闲中断(事件)回调函数编写
点击查看代码
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance == USART1) {
/* 转存数据 */
for(uint16_t i = 0; i < USART_LEN; i++) {
Rx[i] = usart1_rx_DMA_buffer[i];
}
/* 将接收到的数据发送回去 */
HAL_UART_Transmit_DMA(&huart1, Rx, sizeof(Rx));
/* 清除缓冲数据(重要!) */
memset(usart1_rx_DMA_buffer, 0, sizeof(usart1_rx_DMA_buffer));
/* 打开串口DMA空闲中断接收 */
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, usart1_rx_DMA_buffer, sizeof(usart1_rx_DMA_buffer));
/* 关闭串口半传输中断 */
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);
}
}
4、LCD显示串口接收数据
点击查看代码
char text[20];
void lcd_show(void)
{
sprintf(text, "Rx:%c%c%c%c%c%c%c%c%c%c%c%c",Rx[0],Rx[1],Rx[2],Rx[3],Rx[4],Rx[5],Rx[6],Rx[7],Rx[8],Rx[9],Rx[10],Rx[11]);
LCD_DisplayStringLine(Line2, (uint8_t*)text);
}
现象
串口调试助手显示

LCD显示

博客导航
本文来自博客园,作者:膝盖中箭卫兵,转载请注明原文链接:https://www.cnblogs.com/Skyrim-sssuuu/p/18810798

浙公网安备 33010602011771号
https://orcid.org/0000-0001-5102-772X