STM32串口接收數據
稍微理一下思路,一個數據從電腦發送到STM32,然后在從STM32返回到電腦顯示出來。
如上圖所示,發送(1所示的路線)前,STM32的淳口需要初始化的設置。包括:波特率,字長,硬件流,停止位,奇偶校驗位,模式(接收,發送,接收和發送),串口的基地址(Instance)。在初始化串口的函數里面,需要調用到HAL_UART_MspInit(),這是一個虛函數(_weak),HAL_UART_MspInit()會調用到HAL_GPIO_Init(),把IO口進行配置。(模式,上下拉,速度,復用)
3.接收中斷優先級的配置
HAL_NVIC_EnableIRQ(USART1_IRQn); //接收中斷使能 HAL_NVIC_SetPriority(USART1_IRQn,2,2); // 中斷優先級的配置
以上兩個函數可以放在HAL_UART_MspInit()里面進行
4.使能串口接收中斷
HAL_UART_Receive_IT(&usart1_handler,rdula,1);
這個函數可以寫在主函數里面,因為在uart.c的文件中是有的。同時可以寫在串口配置函數的后面。
5.編寫中斷服務函數
/***中斷服務函數***/ void USART1_IRQHandler() { HAL_UART_IRQHandler(&usart1_handler); //中斷處理函數
HAL_UART_Receive_IT(&usart1_handler,rdula,1);//使能接收中斷。為什么放在這里,因為是處理完中斷處理函數,而接受中斷關閉,不在處理相關的接收數據,為了能夠再次接收數據,可以把接收中斷函數放在中斷服務函數逇里面。
}
6.編寫中斷回調函數
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { u8 temp; if(huart->Instance == USART1) //判斷是不是串口一,要對串口一進行回調函數。 { temp=*((huart->pRxBuffPtr)-1); HAL_UART_Transmit(&usart1_handler,&temp,1,1000); } }
上圖所示的代碼中,void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)是一個虛函數(_weak),所以需要重新定義。其中if是判斷這個基地址是不是串口一。
2019-09-06 21:52:36