硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3117|回复: 7
收起左侧

[DMA] STM32F7 串口1DMA接收异常

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2021-5-24 07:02:47 | 显示全部楼层 |阅读模式
本帖最后由 pauljames 于 2021-5-25 14:35 编辑

大家好,我在F7串口DMA接收的时候发现了一个问题,设置的内存缓冲区只有在32字节对齐的时候,DMA接收才能正常,否则这片区域无法访问,例如0x20020795不行,0x200207A0就可以。不知道大家有没有遇到过类似的问题?工程精简后,接受地址在0x20020010,开始的16个字节无法写入,具体见附件,请大家帮忙分析下。
问题.png

DMA_reg_recv异常.rar

511.39 KB, 下载次数: 14

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-5-24 14:01:42 | 显示全部楼层
1、数据传输宽度设置的字节,字还是半字,通用DMA使用字节传输,无需考虑对齐问题。
2、如果开启了Cache,注意Cache问题。
另外贴下你的程序代码,要不只能猜

回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2021-5-25 14:33:36 | 显示全部楼层
eric2013 发表于 2021-5-24 14:01
1、数据传输宽度设置的字节,字还是半字,通用DMA使用字节传输,无需考虑对齐问题。
2、如果开启了Cache, ...

附件我上传了代码,目前是0x20020010开始的buffer,前面16个空间无法写入,发送30个字符,帮忙看看是啥问题,真是很头疼
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-5-26 07:38:33 | 显示全部楼层
pauljames 发表于 2021-5-25 14:33
附件我上传了代码,目前是0x20020010开始的buffer,前面16个空间无法写入,发送30个字符,帮忙看看是啥问 ...

你个工程是寄存器配置方式,看的我有点辛苦。

另外我没有看到你的Cache配置在哪里,建议读Cache和写Cache都关闭了,或者简单省事些。

启动DMA前调用,调用Cache的CleanInvalid函数,结束后,读取缓冲数据前也调用一次。

如果工程还有其它问题,不清楚了。

回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2021-5-26 09:34:49 | 显示全部楼层
eric2013 发表于 2021-5-26 07:38
你个工程是寄存器配置方式,看的我有点辛苦。

另外我没有看到你的Cache配置在哪里,建议读Cache和写Ca ...

  我试了打开透写
  SCB_EnableICache();        //使能I-Cache,函数在core_cm7.h里面定义
    SCB_EnableDCache();        //使能D-Cache,函数在core_cm7.h里面定义
    SCB->CACR|=1<<2;        //强制D-Cache透写,如不开启透写,实际使用中可能遇到各种问题
或者关闭
    SCB_DisableICache();
    SCB_DisableDCache();
结果都一样
但是,启动DMA前加SCB_CleanInvalidateDCache();就正常了,谢谢;
另外,我发现个现象,这个问题在MDK5.21出现,换到MDK5.14就没问题了,同样的工程。在5.14的MDK上,不需要操作Cache,也没有问题。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-5-26 09:41:33 | 显示全部楼层
pauljames 发表于 2021-5-26 09:34
我试了打开透写
  SCB_EnableICache();        //使能I-Cache,函数在core_cm7.h里面定义
    SCB_EnableDCac ...

Cache本身就有个命中率的,所以不同编译器版本测试不具有参考性。

合理配置才是关键。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2021-5-26 09:44:28 | 显示全部楼层
eric2013 发表于 2021-5-26 07:38
你个工程是寄存器配置方式,看的我有点辛苦。

另外我没有看到你的Cache配置在哪里,建议读Cache和写Ca ...

暂时先这么解决了,或者用老版本MDK,或者DMA操作前执行SCB_CleanInvalidateDCache();
谢谢管理员的耐心解答。
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2022-7-25 15:14:17 | 显示全部楼层
我的stm32F767也是接收错误
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 02:03 , Processed in 0.189604 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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