硬汉嵌入式论坛

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

[MPU] stm32H7平台的MPU功能

[复制链接]

13

主题

192

回帖

231

积分

高级会员

积分
231
发表于 2020-12-28 19:24:57 | 显示全部楼层 |阅读模式
看了硬汉哥的MPU方面的介绍,还是没有理解到精髓,现在出现问题了。
我用SDRAM作为显存,用AXI那部分作为主要RAM,DTCM那部分作为STACK区域。
设置MPU的时候,设置了SDRAM和AXI的MPU,现在出现的问题是,UART通信DMA收到的数据是对的,
但是从接收Buffer拷贝到另一个应用层的Buffer后,数据就不对了,这些操作是在AXI SRAM中完成的,
现在不知道该怎么设置MPU才能是正确的,求指点。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
发表于 2020-12-29 09:31:12 | 显示全部楼层
这个问题是因为你读Cache还开着造成的。

可以将SDRAM和AXI SRAM的设置为读Cache和写Cache全部关闭模式

使用STM32H7的AXI SRAM,SRAM1到SRAM4对应的Cache最高性能和最低性能配置
http://www.armbbs.cn/forum.php?m ... 9322&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

13

主题

192

回帖

231

积分

高级会员

积分
231
 楼主| 发表于 2020-12-30 13:41:05 | 显示全部楼层
eric2013 发表于 2020-12-29 09:31
这个问题是因为你读Cache还开着造成的。

可以将SDRAM和AXI SRAM的设置为读Cache和写Cache全部关闭模式

多谢回复~~现在我试了把Cache功能关闭了,但是发现在运行到C++库的时候出现问题了。以前这些应用程序我们在STM32其他平台上跑过,是没有问题的,现在到H7平台就报错了。不知道是什么原因,求分析~~
系统问题.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
发表于 2020-12-30 14:58:08 | 显示全部楼层
zhang0352505 发表于 2020-12-30 13:41
多谢回复~~现在我试了把Cache功能关闭了,但是发现在运行到C++库的时候出现问题了。以前这些应用程序我们 ...

确定读Cache关闭了吧。
回复

使用道具 举报

13

主题

192

回帖

231

积分

高级会员

积分
231
 楼主| 发表于 2020-12-30 15:48:30 | 显示全部楼层
设置部分代码如下
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_NUMBER1;
  MPU_InitStruct.BaseAddress = 0x60000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_16MB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /** 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 = 0x24000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

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

使用道具 举报

13

主题

192

回帖

231

积分

高级会员

积分
231
 楼主| 发表于 2020-12-30 19:23:26 | 显示全部楼层
知道原因了。。跟MPU没关系,是任务栈分配少了。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
发表于 2020-12-31 09:59:22 | 显示全部楼层
zhang0352505 发表于 2020-12-30 19:23
知道原因了。。跟MPU没关系,是任务栈分配少了。。

前面一顿分析猛如虎,

答案却是任务栈小了
回复

使用道具 举报

13

主题

192

回帖

231

积分

高级会员

积分
231
 楼主| 发表于 2021-1-4 09:59:26 | 显示全部楼层
eric2013 发表于 2020-12-31 09:59
前面一顿分析猛如虎,

答案却是任务栈小了

是啊,感觉老出现这种使劲使歪了的情况,在某些细微的地方,隐藏着一些小错误。硬汉哥是如何避免这种情况的呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
发表于 2021-1-4 10:28:57 | 显示全部楼层
zhang0352505 发表于 2021-1-4 09:59
是啊,感觉老出现这种使劲使歪了的情况,在某些细微的地方,隐藏着一些小错误。硬汉哥是如何避免这种情况 ...

逐步排查。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 20:44 , Processed in 0.194354 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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