OpenEdv-开源电子网

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

求助,我想用STM32H7进行串口1的空闲中断DMA收发,可结果很不随我愿

[复制链接]

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
发表于 2022-5-13 16:35:05 | 显示全部楼层 |阅读模式
5金钱
我的DMA配置如下




void MYDMA_TX(void)
{
    __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能       
    __HAL_LINKDMA(&UART1_Handler,hdmatx,UART1TxDMA_Handler);    //将DMA与USART1联系起来(发送DMA)

    //Tx DMA配置
    UART1TxDMA_Handler.Instance=DMA2_Stream7;                            //数据流选择
                UART1TxDMA_Handler.Init.Request=DMA_REQUEST_USART1_TX;                                                        //USART1发送DMA
    UART1TxDMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH;             //存储器到外设
    UART1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
    UART1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
    UART1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //外设数据长度:8位
    UART1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //存储器数据长度:8位
    UART1TxDMA_Handler.Init.Mode=DMA_NORMAL;                            //外设流控模式
    UART1TxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
    UART1TxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    UART1TxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
    UART1TxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
    UART1TxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输

    HAL_DMA_DeInit(&UART1TxDMA_Handler);   
    HAL_DMA_Init(&UART1TxDMA_Handler);
}

void MYDMA_RX(void)
{
    __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能       
    __HAL_LINKDMA(&UART1_Handler,hdmarx,UART1RXDMA_Handler);    //将DMA与USART1联系起来(发送DMA)

    //Tx DMA配置
    UART1RXDMA_Handler.Instance=DMA2_Stream5;                            //数据流选择
                UART1RXDMA_Handler.Init.Request=DMA_REQUEST_USART1_RX;                                                        //USART1接收DMA
    UART1RXDMA_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY;             //外设到存储器
    UART1RXDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
    UART1RXDMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
    UART1RXDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //外设数据长度:8位
    UART1RXDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //存储器数据长度:8位
    UART1RXDMA_Handler.Init.Mode=DMA_NORMAL;                            //外设流控模式
    UART1RXDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
    UART1RXDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    UART1RXDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
    UART1RXDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
    UART1RXDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输

    HAL_DMA_DeInit(&UART1RXDMA_Handler);   
    HAL_DMA_Init(&UART1RXDMA_Handler);
}






在我HAL_UART_Receive_DMA(&UART1_Handler,USART_RX_BUF,50);之后,每次DMA收到的数都不会把数组USART_RX_BUF里的内容替换掉,请问是我的数据流没选对吗


另外,有没有大佬能给我解释一下这张图什么意思,我实在没理解到位,看不出从这里该怎样选择DMA1或者DMA2的数据流


最佳答案

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

H7的串口DMA配置基本和F系列差不多,只要注意串口接收DMA要配置成循环模式,其他的配置没太大区别,H7需要注意的地方其实是cache, 主要是Dcache ,如果没有同步数据,CPU读取的数据就是cache里的,造成和DMA搬运的数据不一致, 楼主图片没有上传成功,盲猜是DMA控制器框图,这是和F系列不同的地方,可以看出DMA数据流是可以配置的, 至于你要将DMAX的数据流n配置成什么,就要看DMA复用表,,这里面就详细的指明了复用的对象,比如 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
394
金钱
394
注册时间
2021-3-6
在线时间
115 小时
发表于 2022-5-13 16:35:06 | 显示全部楼层
H7的串口DMA配置基本和F系列差不多,只要注意串口接收DMA要配置成循环模式,其他的配置没太大区别,H7需要注意的地方其实是cache,
主要是Dcache cache.png ,如果没有同步数据,CPU读取的数据就是cache里的,造成和DMA搬运的数据不一致,
楼主图片没有上传成功,盲猜是DMA控制器框图 DMA.png ,这是和F系列不同的地方,可以看出DMA数据流是可以配置的,
至于你要将DMAX的数据流n配置成什么,就要看DMA复用表, DMA复用.png ,这里面就详细的指明了复用的对象,比如要将dma复用到
UART1的TX上,就要复用成85 DMATX.png ,至于是用DMA1 还是2,数据流0~7,都可以,以上是个人理解,可能有误,望自行甄别
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
 楼主| 发表于 2022-5-13 16:38:28 | 显示全部楼层
C:\Users\dr\Desktop\屏幕截图 2022-05-13 163727.png
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
 楼主| 发表于 2022-5-13 16:38:58 | 显示全部楼层

file:///C:/Users/dr/Desktop/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-05-13%20163727.png
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
 楼主| 发表于 2022-5-13 16:39:57 | 显示全部楼层
完了,图还发不上来,图就是STM32H7参考手册中文版的一个表,标题是【表 109. DMAMUX1:复用器输入到资源的分配】
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2016-6-22
在线时间
31 小时
发表于 2022-5-14 15:24:00 | 显示全部楼层
楼上正解
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
 楼主| 发表于 2022-5-17 14:03:45 | 显示全部楼层
omw 发表于 2022-5-13 16:35
H7的串口DMA配置基本和F系列差不多,只要注意串口接收DMA要配置成循环模式,其他的配置没太大区别,H7需要 ...

谢谢,有些眉目了,我再去研究一下
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
 楼主| 发表于 2022-5-17 14:07:48 | 显示全部楼层
omw 发表于 2022-5-13 16:35
H7的串口DMA配置基本和F系列差不多,只要注意串口接收DMA要配置成循环模式,其他的配置没太大区别,H7需要 ...

再次看了一下表和HAL库,大概明白了,数据流似乎是随心所欲使用的,没有固定选择
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 18:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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