OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4413|回复: 7

我使用两个串口进行DMA发送,只有串口1能正常发送,求助!!

[复制链接]

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1040
金钱
1040
注册时间
2022-4-20
在线时间
373 小时
发表于 2023-3-9 18:11:20 | 显示全部楼层 |阅读模式
30金钱
串口1目前是正常的,只要发送了过后,就能正常进入DMA传输完成的中断,但是串口2发送完全没反应,进入调试里看,发现连中断状态寄存器都毫无变化。
芯片:STM32H7
串口1:PA9、PA10
串口2:PD5、PD6

求大神相助,谢谢!!!
  1.   GPIO_InitTypeDef GPIO_InitStruct;
  2.                 __HAL_RCC_GPIOA_CLK_ENABLE();                        //使能GPIOA时钟
  3.                 __HAL_RCC_USART1_CLK_ENABLE();                        //使能USART1时钟        
  4.                 GPIO_InitStruct.Pin       = GPIO_PIN_9;
  5.                 GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
  6.                 GPIO_InitStruct.Pull      = GPIO_PULLUP;
  7.                 GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;
  8.                 GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
  9.                 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  10.                 GPIO_InitStruct.Pin = GPIO_PIN_10;
  11.                 GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
  12.                 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  13.            //USART1 初始化设置
  14.                 huart1.Instance          = USART1;                //串口1
  15.                 huart1.Init.BaudRate     = 256000;               //波特率设置
  16.                 huart1.Init.WordLength   = UART_WORDLENGTH_8B;    //8位
  17.                 huart1.Init.StopBits     = UART_STOPBITS_1;       //1个停止位
  18.                 huart1.Init.Parity       = UART_PARITY_NONE;      //无校验
  19.                 huart1.Init.HwFlowCtl    = UART_HWCONTROL_NONE;   //无硬件流
  20.                 huart1.Init.Mode         = UART_MODE_TX_RX;       //串口发送,接收使能
  21.                 huart1.Init.OverSampling = UART_OVERSAMPLING_16;  //16倍过采样  
  22.                 huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  23.                 HAL_UART_Init(&huart1);   //初始化串口

  24.                 DMA_CLK_ENABLE();
  25.                 husart1dma_tx.Instance                 = DMA1_Stream7;                                 //选择流
  26.                 husart1dma_tx.Init.Request             = DMA_REQUEST_USART1_TX;                        //发送通道选择
  27.                 husart1dma_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;                        //内存到外设
  28.                 husart1dma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;                                
  29.                 husart1dma_tx.Init.MemInc              = DMA_MINC_ENABLE;
  30.                 husart1dma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  31.                 husart1dma_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;
  32.                 husart1dma_tx.Init.Mode                = DMA_NORMAL;
  33.                 husart1dma_tx.Init.Priority            = DMA_PRIORITY_LOW;              //DMA_PRIORITY_MEDIUM;
  34.                 husart1dma_tx.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;
  35.                 husart1dma_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
  36.                 husart1dma_tx.Init.MemBurst            = DMA_MBURST_INC4;
  37.                 husart1dma_tx.Init.PeriphBurst         = DMA_MBURST_INC4;


  38.                 HAL_DMA_Init(&husart1dma_tx);
  39.                
  40.                 __HAL_LINKDMA(huart1, hdmatx, husart1dma_tx);
  41.                
  42.                 HAL_NVIC_SetPriority(DMA1_Stream7_IRQn, 1, 1);
  43.                 HAL_NVIC_EnableIRQ(DMA1_Stream7_IRQn);
复制代码
串口2的配置是一样的:
  1. __HAL_RCC_GPIOD_CLK_ENABLE();
  2. __HAL_RCC_USART2_CLK_ENABLE();
  3.                         //GPIO端口设置
  4.                 GPIO_InitTypeDef GPIO_InitStruct;

  5.                 GPIO_InitStruct.Pin       = GPIO_PIN_5;
  6.                 GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
  7.                 GPIO_InitStruct.Pull      = GPIO_PULLUP;
  8.                 GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;
  9.                 GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
  10.                 HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  11.                 GPIO_InitStruct.Pin = GPIO_PIN_6;
  12.                 GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
  13.                 HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);


  14.                 huart2.Instance          = USART2;               
  15.                 huart2.Init.BaudRate     = 256000;               //波特率设置
  16.                 huart2.Init.WordLength   = UART_WORDLENGTH_8B;    //8位
  17.                 huart2.Init.StopBits     = UART_STOPBITS_1;       //1个停止位
  18.                 huart2.Init.Parity       = UART_PARITY_NONE;      //无校验
  19.                 huart2.Init.HwFlowCtl    = UART_HWCONTROL_NONE;   //无硬件流
  20.                 huart2.Init.Mode         = UART_MODE_TX_RX;       //串口发送,接收使能
  21.                 huart2.Init.OverSampling = UART_OVERSAMPLING_16;  //16倍过采样  
  22.                 huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  23.                 HAL_UART_Init(&huart2);   //初始化串口

  24.   __HAL_RCC_DMA2_CLK_ENABLE();
  25.                 husart2dma_tx.Instance                 = DMA2_Stream7;                                 //选择流
  26.                 husart2dma_tx.Init.Request             = DMA_REQUEST_USART1_TX;                        //发送通道选择
  27.                 husart2dma_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;                        //内存到外设
  28.                 husart2dma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;                                
  29.                 husart2dma_tx.Init.MemInc              = DMA_MINC_ENABLE;
  30.                 husart2dma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  31.                 husart2dma_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;
  32.                 husart2dma_tx.Init.Mode                = DMA_NORMAL;
  33.                 husart2dma_tx.Init.Priority            = DMA_PRIORITY_LOW;              //DMA_PRIORITY_MEDIUM;
  34.                 husart2dma_tx.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;
  35.                 husart2dma_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
  36.                 husart2dma_tx.Init.MemBurst            = DMA_MBURST_INC4;
  37.                 husart2dma_tx.Init.PeriphBurst         = DMA_MBURST_INC4;
  38.                 HAL_DMA_Init(&husart2dma_tx);
  39.                
  40.                 __HAL_LINKDMA(huart2, hdmatx, husart2dma_tx);
  41.                 HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 1, 1);
  42.                 HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);
复制代码


最佳答案

查看完整内容[请看2#楼]

谢谢帮忙了,不过问题不在这,我刚刚又检查了一边,发现是串口2那段代码的31行DMA_REQUEST_USART1_TX的USART1没改成USART2,太粗心了
又菜又爱指点
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1040
金钱
1040
注册时间
2022-4-20
在线时间
373 小时
 楼主| 发表于 2023-3-9 18:11:21 | 显示全部楼层
hzhanhai 发表于 2023-3-10 10:44
引脚重映射配置过程
1、使能GPIO时钟(重映射后的IO);
2、使能功能外设时钟(例如串口2);

谢谢帮忙了,不过问题不在这,我刚刚又检查了一边,发现是串口2那段代码的31行DMA_REQUEST_USART1_TX的USART1没改成USART2,太粗心了
又菜又爱指点
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2023-3-9 23:25:54 | 显示全部楼层
帮顶
回复

使用道具 举报

5

主题

312

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1820
金钱
1820
注册时间
2018-11-28
在线时间
226 小时
发表于 2023-3-10 09:10:04 | 显示全部楼层
串1端口配置对的,串2端口改一下试试
        if(huart->Instance==USART2)//如果是串口2,进行串口2 MSP初始化
        {
                __HAL_RCC_GPIOA_CLK_ENABLE();                        //使能GPIOA时钟
                __HAL_RCC_USART2_CLK_ENABLE();                        //使能USART2时钟

                GPIO_Initure.Pin=GPIO_PIN_2;                        //PA2
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //复用推挽输出
                GPIO_Initure.Pull=GPIO_PULLUP;                        //上拉
                GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
                GPIO_Initure.Alternate=GPIO_AF7_USART2;        //复用为USART2
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //初始化PA2

                GPIO_Initure.Pin=GPIO_PIN_3;                        //PA3
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //初始化PA3


                HAL_NVIC_EnableIRQ(USART2_IRQn);                                //使能USART2中断通道
                HAL_NVIC_SetPriority(USART2_IRQn,3,3);                        //抢占优先级3,子优先级3
        }
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1040
金钱
1040
注册时间
2022-4-20
在线时间
373 小时
 楼主| 发表于 2023-3-10 09:28:45 | 显示全部楼层
hzhanhai 发表于 2023-3-10 09:10
串1端口配置对的,串2端口改一下试试
        if(huart->Instance==USART2)//如果是串口2,进行串口2 MSP初始化
...

串口2必须用PD5、6,硬件在这边
又菜又爱指点
回复

使用道具 举报

5

主题

312

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1820
金钱
1820
注册时间
2018-11-28
在线时间
226 小时
发表于 2023-3-10 10:36:12 | 显示全部楼层
驭剑的秘密 发表于 2023-3-10 09:28
串口2必须用PD5、6,硬件在这边

需要重映射到PD5,PD6
回复

使用道具 举报

5

主题

312

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1820
金钱
1820
注册时间
2018-11-28
在线时间
226 小时
发表于 2023-3-10 10:39:56 | 显示全部楼层
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
回复

使用道具 举报

5

主题

312

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1820
金钱
1820
注册时间
2018-11-28
在线时间
226 小时
发表于 2023-3-10 10:44:55 | 显示全部楼层
引脚重映射配置过程
1、使能GPIO时钟(重映射后的IO);
2、使能功能外设时钟(例如串口2);
3、使能AFIO时钟。重映射必须使能AFIO时钟:
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
4、开启重映射。
    GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 17:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表