stm32hal庫串口DMA收發


Cubemx配置串口DMA數據傳輸

摘要:串口功能十分簡單,配置串口DMA傳輸主要是為了熟悉DMA配置過程,所以編寫了一個簡單的串口回顯功能(自收自發),利用串口空閑中斷,+DMA來進行數據傳輸。

Cubemx配置

  1. 配置串口
    avatar
  2. 配置DMA
    avatar
  3. 打開串口中斷
    avatar
  4. 記得配置時鍾
    根據個人使用MCU配置就好

個人代碼編寫

在生成代碼之后我們打開工程,使能串口空閑中斷,添加串口中斷的處理函數,添加串口DMA發送數據函數。
  1. 在while循環前添加使能串口空閑中斷和開啟DMA中斷接收
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能串口空閑中斷
  HAL_UART_Receive_DMA(&huart1, RX_Buff,RX_LEN);//開啟DMA接收,不加此局自啟后接收一次空字符
  1. 添加個人的串口中斷處理函數
void MX_RXCallBack(UART_HandleTypeDef *huart)
{
  uint8_t  tmp_flag,temp;
  tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE);
  if((tmp_flag != RESET))
  {
    HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
    __HAL_UART_CLEAR_IDLEFLAG(&huart1);
    HAL_UART_DMAStop(&huart1);
    temp=__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
    HAL_UART_Receive_DMA(&huart1,RX_Buff,RX_LEN);
    RX_Count= RX_LEN - temp;
    RX_flag = 1;
  }  
}

此函數要在生成的Src目錄下的stm32xxxx_it.c中的void USART1_IRQHandler(void)函數中調用
3. main函數中對接收到的數據進行處理(通過串口發送出去)

if (RX_flag)
{
    if(HAL_UART_Transmit(&huart1,RX_Buff,RX_Count,1000)!=HAL_OK){
    printf("error\r\n");
    }
    RX_flag=0;
    memset(RX_Buff,0,RX_Count);
}r

上面程序添加至主函數中的while循環內

總計

在調試過程中遇到DMA傳輸數據不通的現象,同過調試發現cubemx在生成串口DMA代碼時候,將串口1的DMA初始化的時鍾放在串口DMA初始化的后面,導致DMA串口初始化失敗,在調試串口3的時候代碼又是正確的,所以不可盲目使用cubemx工具。一旦有錯誤,比較難調試。導致我找了一天。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM