硬汉嵌入式论坛

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

[MPU] MPU遇到的小问题

[复制链接]

14

主题

37

回帖

79

积分

初级会员

积分
79
发表于 2024-12-30 16:26:23 | 显示全部楼层 |阅读模式
在搞屏幕的过程中发现一个MPU的小问题想和大家讨论

我使用的为FMC驱动屏幕,连接rs信号线为A18,那么我的地址收发地址就是0x6007FFFE 和 0x60080000
我想简单的将0x6007FFFE~0x60080001区域设置为strongly order

现在问题来了我在填写基地址时,
捕获.PNG
基地址写成0x6007FFFE(总之最后一位不为零)就会进入错误中断
是对基地址有什么要求吗?
各位大佬求解答

还有,后面我试了一下将subregiondisable 设置为0x18或者0xe7
对程序都没有影响,都可以正常跑
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-12-31 06:38:15 | 显示全部楼层
楼主的地址描述不准确,如果你的FMC配置带宽是16bit,接A18控制的话,那么用到的读写地址应该是
0x6000 0000  +  (1 << (18 + 1))和0x6000 0000

回复

使用道具 举报

14

主题

37

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2025-1-2 10:46:48 | 显示全部楼层
eric2013 发表于 2024-12-31 06:38
楼主的地址描述不准确,如果你的FMC配置带宽是16bit,接A18控制的话,那么用到的读写地址应该是
0x6000 00 ...

我是这样建立的
//LCD地址结构体
typedef struct
{
        uint16_t LCD_REG; //0x6007FFFE
        uint16_t LCD_RAM;//0x60080000
} LCD_TypeDef;

//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A18作为数据命令区分线
//注意设置时STM32内部会右移一位对其!                             
#define LCD_BASE        ((uint32_t)(0x60000000 | 0x0007FFFE))
#define LCD             ((LCD_TypeDef *) LCD_BASE)

我想将这么四个字节保护起来,但是设置mpu时发现只有一楼那种写法可以,BaseAddree写成0x6007FFFx,x只要不为零就不行
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-3 06:45:50 | 显示全部楼层
2668350209 发表于 2025-1-2 10:46
我是这样建立的
//LCD地址结构体
typedef struct

STM32F407的FSMC的的地址计算方法,以TFT为例
https://forum.anfulai.cn/forum.p ... 4566&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
发表于 2025-1-14 15:26:52 | 显示全部楼层
请问楼主如果不配置MPU会有什么后果吗?我也是H750配置FMC控制ST7789V 的LCD,我的控制线为A16,刚开始不懂这个MPU然后就一直点亮背光之后没法写GRAM寄存器,然后配置了MPU就可以了

     MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  MPU_InitStruct.BaseAddress = 0x60000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_64MB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  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_BUFFERABLE;
回复

使用道具 举报

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
发表于 2025-1-14 15:27:00 | 显示全部楼层
请问楼主如果不配置MPU会有什么后果吗?我也是H750配置FMC控制ST7789V 的LCD,我的控制线为A16,刚开始不懂这个MPU然后就一直点亮背光之后没法写GRAM寄存器,然后配置了MPU就可以了

     MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  MPU_InitStruct.BaseAddress = 0x60000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_64MB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  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_BUFFERABLE;
回复

使用道具 举报

14

主题

37

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2025-1-14 15:52:31 | 显示全部楼层
不吃鱼的猫大人 发表于 2025-1-14 15:27
请问楼主如果不配置MPU会有什么后果吗?我也是H750配置FMC控制ST7789V 的LCD,我的控制线为A16,刚开始不懂 ...

我是
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.BaseAddress = 0x0;
  MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
  MPU_InitStruct.SubRegionDisable = 0x87;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  HAL_MPU_ConfigRegion(&MPU_InitStruct);

MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  MPU_InitStruct.BaseAddress = 0x60000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_64MB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  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_BUFFERABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
因为在mpu配置0中将此段屏幕空间配置为了不可读写,然后如果没有mpu配置1,此段空间就是不可读写。
添加了配置1后就可以读写了
回复

使用道具 举报

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
发表于 2025-1-14 19:13:03 | 显示全部楼层
2668350209 发表于 2025-1-14 15:52
我是
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
...

非常感谢!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 02:03 , Processed in 0.044829 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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