硬汉嵌入式论坛

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

[UART] 求助:使用H743+串口空闲中断+DMA接收,接收数组没有更新的情况

[复制链接]

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2025-2-16 14:24:43 | 显示全部楼层 |阅读模式
本帖最后由 Marlboro 于 2025-2-16 18:07 编辑

环境:stm32CubeMX + Keil + stm32H743IIT6

使用cubemx创建了一个简单的工程(仅配置了USART1+DMA和MPU+Cache),MPU+Cache配置如图1所示

按照网上的说法,定义了接收数组,如图2所示

按照网上的说法,修改了.sct文件,新增了11~13行,如图3所示

使用上位机发送数据后,能进空闲中断,也调用了SCB_InvalidateDCache_by_Addr函数,但aRxBuffer里面没有数据,如图4所示

奇怪点:
1.debug时注意到aRxBuffer的地址还是在0x20000000,如图5所示

2.编译后,keil自动把我在.sct文件加的内容给删掉了,如下是keil的相关配置,如图6所示

有没有大佬知道这是什么问题造成的,有什么解决方式吗?感激不尽

图1

图1

图2

图2

图3

图3

图4

图4

图5

图5

图6

图6
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2025-2-17 04:49:45 | 显示全部楼层
不要勾上面这个单选框,仅勾选下面的, 通用DMA不支持0X2000 0000地址的TCM空间

123.png

回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
发表于 2025-2-18 09:17:46 | 显示全部楼层
两个方向的四路:
1.你看一下魔术棒的Linker中,有没有勾选 use Memory layout from target dialog。如果勾了,他只会按照Target中的布局设置默认SCT,你自己修改的不会生效。
2.你去看一下datasheet里bus martix看看DMA支不支持你这块RAM
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2025-2-18 21:33:49 | 显示全部楼层
eric2013 发表于 2025-2-17 04:49
不要勾上面这个单选框,仅勾选下面的, 通用DMA不支持0X2000 0000地址的TCM空间

谢谢哥,我把cache和mpu都disable后,按照你的方法,已经能够在数组里面读到数据了(后续再试试开启开启cache和mpu),但又发现了新的异常,就是数据接收不正确,似乎每次只能接收一个byte,但是可以确保DMA配置的数据宽度是byte,并且使能了内存地址自增,截了图,但是好像回复里面贴不了图片
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2025-2-18 21:45:02 | 显示全部楼层
Xor_Li 发表于 2025-2-18 09:17
两个方向的四路:
1.你看一下魔术棒的Linker中,有没有勾选 use Memory layout from target dialog。如果 ...

谢谢
1、学到了
2、查看了数据手册,0x20000000这块Ram是DTCM-RAM,通用DMA是不可访问这块区域的,没有总线互联,只有MDMA可以访问
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2025-2-18 22:14:12 | 显示全部楼层
eric2013 发表于 2025-2-17 04:49
不要勾上面这个单选框,仅勾选下面的, 通用DMA不支持0X2000 0000地址的TCM空间

试了一下开启cache+mpu,debug时进入了MemManage_Handler
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2025-2-19 10:17:28 | 显示全部楼层
Marlboro 发表于 2025-2-18 22:14
试了一下开启cache+mpu,debug时进入了MemManage_Handler

分享你的工程到百度云,我看下
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2025-2-19 20:26:05 | 显示全部楼层
eric2013 发表于 2025-2-19 10:17
分享你的工程到百度云,我看下

麻烦哥看一下
通过网盘分享的文件:DMA_Test.7z
链接: https://pan.baidu.com/s/1-UaS4Xmw_S3wQHw8F-oLNg 提取码: 1234
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2025-2-20 06:34:22 | 显示全部楼层
Marlboro 发表于 2025-2-19 20:26
麻烦哥看一下
通过网盘分享的文件:DMA_Test.7z
链接: https://pan.baidu.com/s/1-UaS4Xmw_S3wQHw8F-oL ...

修改你main.c里面的MPU配置如下试试

[C] 纯文本查看 复制代码
void MPU_Config(void)
{
  MPU_Region_InitTypeDef MPU_InitStruct = {0};

  /* Disables the MPU */
  HAL_MPU_Disable();
  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.BaseAddress = 0x00000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  
   /* 最低性能,读Cache和写Cache都关闭 */
     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
	MPU_InitStruct.BaseAddress      = 0x24000000;
	MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
	MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
	MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
	MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
	MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
	MPU_InitStruct.Number           = MPU_REGION_NUMBER1;
	MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
	MPU_InitStruct.SubRegionDisable = 0x00;
	MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

	HAL_MPU_ConfigRegion(&MPU_InitStruct);

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /* Enables the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

}
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2025-2-20 22:33:03 | 显示全部楼层
历时5天终于调好了,借助了这一篇帖子https://forum.anfulai.cn/forum.p ... 5%CF%D0%D6%D0%B6%CF
总结:除了上面解决的sct文件,DMA和RAM区域访问问题,keil下载RAM空间勾选外,剩下的解决方法是由V1.8.0和V1.5.0的HAL库换成了V1.12.0,因为只有V1.12.0才有HAL_UARTEx_ReceiveToIdle_DMA这个函数,这里是一个大坑
谢谢硬汉哥!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2025-2-21 08:35:23 | 显示全部楼层
Marlboro 发表于 2025-2-20 22:33
历时5天终于调好了,借助了这一篇帖子https://forum.anfulai.cn/forum.php?mod=viewthread&tid=118402&highlig ...

解决了就好
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-13 18:30 , Processed in 0.048975 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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