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工具。一旦有错误,比较难调试。导致我找了一天。
posted @ 2020-01-06 17:24  Breezy-ye  阅读(4561)  评论(0编辑  收藏  举报