stm32cube 串口空閒中斷接收(非DMA方式)

簡述

實際開發過程中,DMA通道全部佔用,餘下串口無DMA使用,改用入緩存區。

配置過程

MCU使用STM32F427,串口配置用圖說明(偷個懶)。
空閒中斷接收數據寫
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在主函數初始化中,除開cube自動生成的串口初始化外,還需額外調用指明接收buffer[size]和使能空閒中斷接收。

HAL_UART_Receive_IT(&huart8,recv_buffer, USART_RX_SIZE);//指明接收buffer和size
__HAL_UART_ENABLE_IT(&huart8, UART_IT_IDLE);//開啓空閒中斷
/* 中斷接收數據處理過程 */
void recv_handle(UART_HandleTypeDef *huart) 
{  
	uint16_t length = 0;
	
    if ( __HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) 
    {
		__HAL_UART_CLEAR_IDLEFLAG(huart);
        if (huart->RxState == HAL_UART_STATE_BUSY_RX)
        {
            /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
            CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
            CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
            /* At end of Rx process, restore huart->RxState to Ready */
            huart->RxState = HAL_UART_STATE_READY;
        }
        
        length = USART_RX_SIZE - huart->RxXferCount;
  		//數據處理,寫入緩存區
  		for (uint8_t i; i < length; i++)
  		{
  			printf("%d", recv_buffer[i]);
  		}
  		
		recv_flag = true;
		HAL_UART_Receive_IT(huart, recv_buffer, USART_RX_SIZE);		
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章