stm32f4采用DMA方式进行不定长串口接收讲解
功能:stm32f4采用DMA方式进行不定长串口接收 平台:STM32CubeIDE(STM32CubeMX) 1、新建工程 示例中采用的是stm32f401re,先设置调试接口(默认是关闭的,不设置的话调试一次就不能调试了) 设置时钟,示例中采用的是无源12M晶振 设置串口1 DMA选项,默认就可以 中断设置,需要打开中断 新建设置完成了,另外加句,关于工程我个人喜欢这样设置 2、修改源码 采用接收空闲中断方式,原库文件没有这个中断的代码,我的方法是改源代码,进入这个文件夹 修改stm32f4xx_hal_uart.c文件,打开该文件 找到HAL_UART_IRQHandler函数,在下图位置处添加
/* UART in mode Idle -------------------------------------------------*/ if(((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET)) { __HAL_UART_CLEAR_IDLEFLAG(huart); HAL_UART_IdleCpltCallback(huart); return; } 在这个文件如下图的位置添加
__weak void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart) { UNUSED(huart); } 进入这个文件夹 修改stm32f4xx_hal_uart.h文件,打开该文件
在下图位置处添加
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart); 3、工程代码
回到工程文件,修改usart.c文件,添加 #include <string.h> #define RXBUF_1_SIZE 255 uint8_t rx1_len=0; uint8_t recv1_end_flag=0; uint8_t rx1_buffer[RXBUF_1_SIZE]; 添加
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart) { HAL_UART_DMAStop(huart); if(huart->Instance == USART1) { rx1_len = RXBUF_1_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); recv1_end_flag = 1; } } void UART_DMA_Init(void) { __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); HAL_UART_Receive_DMA(&huart1,rx1_buffer,sizeof(rx1_buffer)); } void UART_Info(void) { if(recv1_end_flag ==1) { HAL_UART_Transmit(&huart1,rx1_buffer, rx1_len,500);//接收数据打印出来 memset(rx1_buffer,0,sizeof(rx1_buffer)); rx1_len=0; recv1_end_flag=0; HAL_UART_Receive_DMA(&huart1,rx1_buffer,sizeof(rx1_buffer)); } } 在usart.h文件中,添加
void UART_DMA_Init(void); void UART_Info(void); main.c中添加
#include “usart.h” 添加 UART_Info(); 完成了。 通过串口调试工具,向开发板发送数据,开发板接收什么数据就向串口调试工具发送什么数据。
这个工程是我临时建立的,有什么问题留言吧,我尽量解决。
