天天看點

STM32CubeMX序列槽接收資料(DMA方式,HAL庫)

使用DMA方式可以減輕CPU負擔,此例子相關配置可以參考

STM32CubeMX序列槽接收資料(中斷方式,HAL庫)

(1)設定USART1中斷,NVIC配置如下圖

STM32CubeMX序列槽接收資料(DMA方式,HAL庫)

(2)設定USART1的DMA,如下圖

STM32CubeMX序列槽接收資料(DMA方式,HAL庫)

注意:要将RX的模式設定為

circular

,否則隻能接收一次,如果這裡不作設定,網上也有其他方法介紹代碼實作多次接收的,但既然用到了STM32CubeMX就盡量發揮最大作用吧!

STM32CubeMX序列槽接收資料(DMA方式,HAL庫)

(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效果如下:

STM32CubeMX序列槽接收資料(DMA方式,HAL庫)

不足之處:

如果一開始不使能序列槽中斷,那麼DMA接收完成後就不會進入HAL_UART_RxCpltCallback函數,雖然有單獨的DMA中斷處理函數

DMA2_Stream2_IRQHandler

DMA2_Stream7_IRQHandler

,簡單試了一下還未實作預定效果,有待改進,也請同道小夥伴告知~^_^

繼續閱讀