硬汉嵌入式论坛

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

[STM32H7] 配置MPU是的FLASH起始地址和我要操作的外设关系

[复制链接]

3

主题

6

回帖

15

积分

新手上路

积分
15
发表于 2024-11-24 10:50:35 | 显示全部楼层 |阅读模式
问题:最近在学习MPU 和Cache使用中 ,不明白你们是如何确定起始地址和大小的。 这两者之间的关系是什么?比如:我需要使用串口的DMA功能 我在配置MPU是 如何确定它的起始地址和大小呢? 希望大佬们能救救这个笨孩子吧
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-11-24 17:01:37 | 显示全部楼层
对于H7系列不是有很多RAM块,首次使用的话,可以省事些,专门将一个RAM块给DMA使用,然后这个RAM块配置MPU Cache属性即可。

用到DMA空间的地方,也手动分配这个空间。
回复

使用道具 举报

3

主题

6

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2024-11-24 18:54:04 | 显示全部楼层
eric2013 发表于 2024-11-24 17:01
对于H7系列不是有很多RAM块,首次使用的话,可以省事些,专门将一个RAM块给DMA使用,然后这个RAM块配置MPU  ...

但是 我还输不会如何把一个RAM提供给DMA这个外设用
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2024-11-25 01:55:46 | 显示全部楼层
陌路 发表于 2024-11-24 18:54
但是 我还输不会如何把一个RAM提供给DMA这个外设用

我想你需要看一下HAL库的用法
就拿UART举例子,它的传输函数有一些以DMA结尾的函数,这就是使用DMA传输的函数。
而硬汉哥说的把RAM给DMA用只是一种“约定”,而不是需要手动写代码的。
当使用DMA传输的时候,你需要告诉DMA使用哪一块内存,每次使用的时候,都是需要告诉它的。
MPU的话可以看看手册,配置这一块内存就不要进入Cache就好。一半TEX=1 C=1 B=0就可以了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-11-25 11:41:08 | 显示全部楼层
陌路 发表于 2024-11-24 18:54
但是 我还输不会如何把一个RAM提供给DMA这个外设用


学习下第25和26章

https://forum.anfulai.cn/forum.php?mod=viewthread&tid=86980

12.png

回复

使用道具 举报

3

主题

6

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2024-11-25 13:01:52 | 显示全部楼层
eric2013 发表于 2024-11-25 11:41
学习下第25和26章

https://forum.anfulai.cn/forum.php?mod=viewthread&tid=86980

我采用的ADC的模板里面配置MPU的参数 发现每次都写Cache都没有命中(不知道是不是这个意思 ,现象是 不执行 Clean或者无效化 发送的数据 和接受的数据都是错误的)。这种情况正常吗?还是说直接每次使用前都Clean一下?
回复

使用道具 举报

3

主题

6

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2024-11-25 13:21:40 | 显示全部楼层
eric2013 发表于 2024-11-25 11:41
学习下第25和26章

https://forum.anfulai.cn/forum.php?mod=viewthread&tid=86980

比如 我配置的MPU如下
  /* 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 = 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_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;

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

我查看了我DMA操作串口 保存数据这个变量地址是0x240000014在设置的MPU里面 但是每次使用串口DMA发送数据都需要Clean
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-11-26 07:37:53 | 显示全部楼层
陌路 发表于 2024-11-25 13:21
比如 我配置的MPU如下
  /* Disables the MPU */
  HAL_MPU_Disable();

手动Clean可以。

也可以把Cache关闭了,配置为最低性能即可

使用STM32H7的AXI SRAM,SRAM1到SRAM4对应的Cache最高性能和最低性能配置
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=99322


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 04:16 , Processed in 0.045550 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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