用到的是DMA發送數據,DMA接收,在中斷回調里發送出去。
一.代碼生成
1.按以前的方法設置好時鍾和調試方式,這里就不多說了。
2.設置串口1。
3.在DMA Setting里點擊Add添加USART1_TX,Mode有兩種模式,一種是普通模式,使用一次發送語句就發一次,另一種是循環模式,使用一次發送會一直發送。這里發送我選擇普通模式,接收選擇循環模式。
4.在中斷設置里打開串口1的中斷。
5.時鍾和文件路徑等設置好,然后點生成代碼。
二.代碼編寫
1.先定義發送和接收的數組。
/* USER CODE BEGIN 0 */ uint8_t aRxBuffer[1]; uint8_t aTxBuffer[]="ok"; /* USER CODE END 0 */
2.打開串口DMA的發送使能,while循環可以放一些LED的閃爍。
/* USER CODE BEGIN 2 */ HAL_UART_Receive_DMA(&huart1,aRxBuffer,1); HAL_UART_Transmit_DMA(&huart1,aTxBuffer,sizeof(aTxBuffer)); /* USER CODE END 2 */
3.最后加上一個串口接收函數的回調函數,把接收到的數據再發出去。
/* USER CODE BEGIN 4 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) { HAL_UART_Transmit(&huart1,aRxBuffer,1,0); } /* USER CODE END 4 */
現象:
上電之后,電腦的串口會收到“OK”,然后從電腦發送給芯片任意字符,芯片再發回來。
總結:使用DMA做發送處理,接收數據后用串口發出去。為什么接收到數據后不用HAL_UART_Transmit_DMA發送出去呢?使用這個發現丟包情況,因為這里只是測試DMA接收數據情況,接收到之后一般是作運算處理的,所以用一般串口發送驗證接收的數據正確。