1、 使用CUBEMX 配置自动生成代码:
①添加串口的DMA 通道
②使用串口全局中断:
其他的配置就不详细说了。
生成代码后, 打开工程在串口初始化函数中添加代码:
/* USART1 init function */
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
------------------添加----------------------------
//使能串口空闲中断
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
//DMA 接收地址设置
HAL_UART_Receive_DMA(&huart1,uart1RxBuf,RX_SIZE);
}
添加空闲中断处理函数:
void UART_RxIdleCallback(UART_HandleTypeDef *huart)
{
if(__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE)){
__HAL_UART_CLEAR_IDLEFLAG(huart);
HAL_UART_DMAStop(huart);
//hdma_usart2_rx.Instance->CNDTR = BUFFER_SIZE;
//rxSize = RX_SIZE-hdma_usart2_rx.Instance->CNDTR;
//printf("uart2 receive CNT: %d\n",rxSize);
printf("data:%s\n",uart1RxBuf);
memset(uart1RxBuf,0,sizeof(uart1RxBuf));
HAL_UART_Receive_DMA(huart,uart1RxBuf,RX_SIZE);
}
}
uart1RxBuf 为DMA 接收缓存数组
在 USART1_IRQHandler(void) 中调用该函数。