STM32CubeMX实现串口DMA中断通信
文章目录一. 环境二. 使用STM32CubeMX三. USART DMA中断通信1. UART函数库介绍2. 编写代码3. 最终效果四. 软件调试五. 总结一. 环境硬件:stm32f103c8t6 核心板软件:STM32CubeMX 6.3.0软件:keil5 mdk二. 使用STM32CubeMX这里与前一篇串口通信文章只在于多了个DMA设置以及开启串口中断使能。STM32CubeMX实现串
一. 环境
- 硬件:stm32f103c8t6 核心板
- 软件:STM32CubeMX 6.3.0
- 软件:keil5 mdk
二. 使用STM32CubeMX
这里与前一篇串口通信文章只在于多了个DMA设置以及开启串口中断使能。STM32CubeMX实现串口通信_diyu-CSDN博客
与前一篇串口中断文章只多了个DMA设置。STM32CubeMX实现串口中断通信_diyu-CSDN博客
- 设置DMA

为了方便,串口发送以及接受都开启DMA


- 开启串口中断

三. USART DMA中断通信
1. UART函数库介绍
结构体以及函数定义均在头文件: stm32f1xx_hal_uart.h
- UART结构体定义
UART_HandleTypeDef huart1;
- 串口发送/接收函数
HAL_UART_Transmit():串口发送数据,使用超时管理机制
HAL_UART_Receive():串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT():串口中断模式发送
HAL_UART_Receive_IT():串口中断模式接收
HAL_UART_Transmit_DMA():串口DMA模式发送
HAL_UART_Transmit_DMA():串口DMA模式接收
- 串口中断函数
HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数(用的较少)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
HAL_UART_ErrorCallback();串口接收错误函数
2. 编写代码
在文件main.c 里 main函数外部 添加以下代码
#define LENGTH 8 //接受缓冲区大小
uint8_t RxBuffer[LENGTH]; //接受缓冲区
uint8_t RxFlag = 0; //接收完成标志;0表示接受未完成,1表示接收完成

在main函数内部,while循环外部添加以下代码
//发送提示信息
uint8_t message1[]="****UART commucition using IDLE IT DMA****\n";
uint8_t message2[]="Please enter 8 characters: \n";
HAL_UART_Transmit(&huart1,(uint8_t *)message1,sizeof(message1),HAL_MAX_DELAY);
HAL_UART_Transmit(&huart1,(uint8_t *)message2,sizeof(message2),HAL_MAX_DELAY);
//使能DMA接收中断
HAL_UART_Receive_DMA(&huart1, (uint8_t *)RxBuffer,LENGTH);

在while循环内部添加一下代码
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//添加下面代码
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)"hello windows!\n", 15 );
HAL_Delay(1000); //延时1s
if(RxFlag == 1) //如果接受完成,不在发送数据
{
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)"Recevie Success!\n",17); //提示接受成功
break; //退出循环,不在发送数据
}
}

在main函数后面,添加中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //串口接收中断回调函数
{
if(huart->Instance == USART1) //判断发生接收中断的串口
{
RxFlag=1; //置为接收完成标志
//DMA使能接收中断 这个必须添加,否则不能再使用DMA进行发送接受
HAL_UART_Receive_DMA(&huart1, (uint8_t *)RxBuffer,LENGTH);
}
}
如果没有再次开启 HAL_UART_Receive_DMA,你将不能继续使用DMA发送以及接受。
比如,如果没有开启,我这里不能使用DMA发送 Recevie Success!

3. 最终效果
编译,将程序烧录或下载进核心板,打开串口助手查看接收到的数据。
波特率、停止位、数据位、校验位要与配置的一致
你可以发送 8 个字节内容进行中断发送

这里发送8个字节内容 “stop DMA”,进行中断。串口接受成功后,不再发送数据

四. 软件调试
如果要进行软件调试,与前一篇文章相同。STM32CubeMX实现串口通信_diyu-CSDN博客
五. 总结
总体而言还是很简单的,只要了解HAL库中的串口发送接收函数以及DMA中断函数,然后调用即可。
DMA中断与串口中断实际上是一样的,都是固定长度的收发。
如果想实现任意长数据收发,可以采用IDLE中断以及DMA接收。
更多推荐

所有评论(0)