使用STM32CUBE MX创建STM32F407工程 串口DMA加空闲中断任意长度收发
一、使用平台
STM32F407VET6
KEIL 5 5.25
STM32CUBE MX 4.25
二、配置
LED连接在单片机PB9,串口使用UART1,PA9,PA10。
1.打开stm32cube,新建工程
使能外部晶振,串口,LED(GPIOB,9).
2.配置时钟树
3.详细配置
1.串口参数配置:
串口使用DMA,大大节省CPU开支。
配置中断优先级:
配置LED -pin
2.配置输出工程
三、代码修改
1.
uart.h
头文件中添加UART结构体:
/* USER CODE BEGIN Private defines */
#define RX_LEN 1024
typedef struct
{
uint8_t RX_flag:1; //IDLE receive flag
uint16_t RX_Size; //receive length
uint8_t RX_pData[RX_LEN]; //DMA receive buffer
}USART_RECEIVETYPE;
extern USART_RECEIVETYPE UsartType;
/* USER CODE END Private defines */
uart.c
/* USER CODE BEGIN 0 */
USART_RECEIVETYPE UsartType;
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
void UsartReceive_IDLE(UART_HandleTypeDef *huart)
{
uint32_t temp;
if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_DMAStop(&huart1);
temp = huart1.hdmarx->Instance->NDTR;
UsartType.RX_Size = RX_LEN - temp;
UsartType.RX_flag=1;
HAL_UART_Receive_DMA(&huart1,UsartType.RX_pData,RX_LEN);
}
}
/* USER CODE END 1 */
在main函数中的while(1)之前添加串口DMA使能函数,开启串口空闲中断。
在主循环中添加FLAG检测,如果使用RTOS,则在进程中检测。
/* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart1, UsartType.RX_pData, RX_LEN);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(UsartType.RX_flag) // Receive flag
{
UsartType.RX_flag=0; // clean flag
HAL_UART_Transmit_DMA(&huart1, UsartType.RX_pData, UsartType.RX_Size);
}
}
/* USER CODE END 3 */
最后别忘了 一定要在串口中断中调用串口空闲中断回调函数。
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
UsartReceive_IDLE(&huart1);
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
OK,大功告成!!!!
工程下载地址:https://download.csdn.net/download/medojonh/10381613