使用DMA方式可以減輕CPU負擔,此例子相關配置可以參考
STM32CubeMX序列槽接收資料(中斷方式,HAL庫)
(1)設定USART1中斷,NVIC配置如下圖
(2)設定USART1的DMA,如下圖
注意:要将RX的模式設定為
circular
,否則隻能接收一次,如果這裡不作設定,網上也有其他方法介紹代碼實作多次接收的,但既然用到了STM32CubeMX就盡量發揮最大作用吧!
(3)生成項目工程
(4)在main.c裡設定變量以及啟動DMA接收
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t aRxBuffer1[]; //接收緩存
uint8_t aTxBuffer[] = "*********SENDING DATA USING USART1 with DMA***********\r\n";
/* USER CODE END PV */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
HAL_UART_Receive_DMA(&huart1,aRxBuffer1,);// 啟動DMA接收
HAL_UART_Transmit_DMA(&huart1,aTxBuffer,sizeof(aTxBuffer));// DMA發生資料
while ()
{
}
/* USER CODE END WHILE */編寫USART1接收中斷處理函數void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit_DMA(&huart1,aRxBuffer1,1); // DM2發送出去
// HAL_UART_Receive_DMA(&huart1,aRxBuffer1,1); // 重新DMA接收
}
“`
注意這裡和隻采用中斷方式的不同,配置了循環模式後可以不用自己手動再次啟動DMA接收
linux下(windows下是一樣的)使用序列槽助手cutecom效果如下:
不足之處:
如果一開始不使能序列槽中斷,那麼DMA接收完成後就不會進入HAL_UART_RxCpltCallback函數,雖然有單獨的DMA中斷處理函數
DMA2_Stream2_IRQHandler
和
DMA2_Stream7_IRQHandler
,簡單試了一下還未實作預定效果,有待改進,也請同道小夥伴告知~^_^