簡述
實際開發過程中,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);
}
}