你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 3个Uart 通讯互传【接收DMA】 HAL例程

[复制链接]
慎微 发布时间:2019-7-26 11:28
附件是 末学做STM32 UART的例程:

主要想法是: 从A 串口收到 命令,根据需要传到 B或C串口 的设备。
B/C 串口收到的 数据反应回 A串口 打印出来。

参考论坛,

用cubeMX 工具设置 三个 串口LPUART1,USART2,UART4,比特率 及硬件;
打印参口了论坛的文章,由于该芯片 L476有浮点功能,浮点打印 加 %f 即可。

主要定义了 结构体

#define BUFFER_SIZE      60
typedef struct
{
    uint8_t EndFlag:1;                   //空闲接收
    uint16_t length;                     //接收长度
    uint8_t dmaBuf[BUFFER_SIZE];         //串口DMA接收缓冲
}UART_ReceiverDef;

中断处理稍加处理

void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */
     uint32_t tmp_flag = 0;
     uint32_t temp;
  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */
  tmp_flag =  __HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE);

    if((tmp_flag != RESET))
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart2);
        /* 读取串口状态寄存器(芯片型号不同,寄存器名称可能需要修改) */
        temp = huart2.Instance->ISR;

        /* 读取串口数据寄存器(芯片型号不同,寄存器名称可能需要修改) */
        temp = huart2.Instance->RDR;

        HAL_UART_DMAStop(&huart2);

        /* 读取DMA剩余传输数量(芯片型号不同,寄存器名称可能需要修改) */
      temp  = hdma_usart2_rx.Instance->CNDTR;
      huart2_rx.EndFlag = 1;
      huart2_rx.length = BUFFER_SIZE - temp;  
    }
  /* USER CODE END USART2_IRQn 1 */
}

main 函数 的 初始化:
  MX_USART2_UART_Init();
  MX_UART4_Init();
  MX_LPUART1_UART_Init();

启动 uart口:
  __HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_IDLE);
        /*启动串口DMA接收*/
  HAL_UART_Receive_DMA(&hlpuart1,&huart2_rx.dmaBuf[0],BUFFER_SIZE);

  __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
        /*启动串口DMA接收*/
  HAL_UART_Receive_DMA(&huart2,&huart2_rx.dmaBuf[0],BUFFER_SIZE);

  __HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE); //UART_IT_IDLE
        /*启动串口DMA接收*/
  HAL_UART_Receive_DMA(&huart4,&huart4_rx.dmaBuf[0],BUFFER_SIZE);


main 函数的while loop:
     if (1 == hlpuart1_rx.EndFlag)
      {
          HAL_UART_Transmit(&hlpuart1,&hlpuart1_rx.dmaBuf[0],hlpuart1_rx.length,250); //送回验证 hlpuart1 是否 OK,若改hlpuart1为huart2,就发给另个串口
          hlpuart1_rx.length = 0;
          hlpuart1_rx.EndFlag = 0;     

          memset(&hlpuart1_rx.dmaBuf[0],0,BUFFER_SIZE);
         HAL_UART_Receive_DMA(&hlpuart1,&hlpuart1_rx.dmaBuf[0],BUFFER_SIZE);   //其实不必每个 Loop用这个函数 接收DMA ,若是环型的话           
      }               

      if (1 == huart2_rx.EndFlag)
      {
          HAL_UART_Transmit(&huart2,&huart2_rx.dmaBuf[0],huart2_rx.length,250); //修改 huart2 为 hlpuart1,就可发给打印口
          huart2_rx.length = 0;
          huart2_rx.EndFlag = 0;     

          memset(&huart2_rx.dmaBuf[0],0,BUFFER_SIZE);
         HAL_UART_Receive_DMA(&huart2,&huart2_rx.dmaBuf[0],BUFFER_SIZE);   //其实不必每个 Loop用这个函数 接收DMA ,若是环型的话。      
      }                 

收藏 评论1 发布时间:2019-7-26 11:28

举报

1个回答
慎微 回答时间:2019-7-26 11:30:35
附件是详细代码。

3UartOk_org.rar

下载

726.55 KB, 下载次数: 49

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版