DMA接收设置前铺垫知识点:
STM32的IDLE的中断产生条件:在串口无数据接收的情况下,不会产生,当清除IDLE标志位后,必须有接收到第一个数据后,才开始触发,一但接收的数据断流,没有接收到数据,即产生IDLE中断停止。
生成代码后,
oid USART1_IRQHandler(void) 加入源码:
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_DMAStop(&huart1);
if(USART1_RX_STATE_START == usart1_rx_state)
{
usart1_rx_len = USART1_MAX_RECV_LEN - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
usart1_rx_state = USART1_RX_STATE_FINISH;
memcpy(g_usart1_rx_buff,tmp_usart1_rx_buffer,usart1_rx_len);
}
memset((uint8_t *)tmp_usart1_rx_buffer,0,USART1_MAX_RECV_LEN);
HAL_UART_Receive_DMA(&huart1, tmp_usart1_rx_buffer, USART1_MAX_RECV_LEN);
}
void MX_USART1_UART_Init(void) 最后加入:
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //usart1, 使能空闲中断
HAL_UART_Receive_DMA(&huart1, tmp_usart1_rx_buffer, MAX_RECV_LEN); //使能DMA接受,将接受到的数据放到tmp_usart1_rx_buffer
加入串口发送:
void USART1_TX(uint8_t *pData, uint16_t Size)
{
HAL_UART_Transmit(&huart1,pData,Size,1000);
}
主程序里加入:
if(USART1_RX_STATE_FINISH == usart1_rx_state)
{
USART1_TX(g_usart1_rx_buff,usart1_rx_len);
usart1_rx_state = USART1_RX_STATE_START;
}
程序结果:
程序链接地址:
https://download.csdn.net/download/happygrilclh/12368152