你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于stm32f7xx 的mpu 设置 ??

[复制链接]
hpdell 提问时间:2017-3-12 19:16 /
本帖最后由 hpdell 于 2017-3-12 19:31 编辑


关于 stm32f7xx 的设置,我的设置如下:

static void MPU_Set_Protection(uint32_t baseaddr,
                               uint32_t size,
                               uint32_t rnum,
                               uint32_t ap,
                               u8 sen,
                               u8 cen,
                               u8 ben)
{
        MPU_Region_InitTypeDef MPU_Initure;
        
        HAL_MPU_Disable();                                                                                      //配置MPU之前先关闭MPU,配置完成以后在使能MPU

        MPU_Initure.Enable           = MPU_REGION_ENABLE;                                  //使能该保护区域
        MPU_Initure.Number           = rnum;                                              //设置保护区域
        MPU_Initure.BaseAddress      = baseaddr;                              //设置基址
        MPU_Initure.Size             = size;                                                    //设置保护区域大小
        MPU_Initure.SubRegionDisable = 0x00;                            //禁止子区域
        MPU_Initure.TypeExtField     = MPU_TEX_LEVEL0;                  //设置类型扩展域为level0
        MPU_Initure.AccessPermission = (uint8_t)ap;                                  //设置访问权限,
        MPU_Initure.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;          //允许指令访问(允许读取指令)
        MPU_Initure.IsShareable      = sen;                            //是否允许共用
        MPU_Initure.IsCacheable      = cen;                            //是否允许cache
        MPU_Initure.IsBufferable     = ben;                             //是否允许缓冲
        HAL_MPU_ConfigRegion(&MPU_Initure);                           //配置MPU
        HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);                                          //开启MPU

}


//  下面这样设置后,读写 qspi 没有反应,屏蔽此段代吗后 qspi 可以正常读写了,这是为何 ???
        MPU_Set_Protection(0x80000000,
                     MPU_REGION_SIZE_2GB,    // 吧这个改成 256MByte 就可以了,是不是 不能够设置 为 2GByte ??
                     MPU_REGION_NUMBER3,
                     MPU_REGION_FULL_ACCESS,
                     MPU_ACCESS_NOT_SHAREABLE,
                     MPU_ACCESS_CACHEABLE,
                     MPU_ACCESS_BUFFERABLE);          //保护整个NAND FLASH区域,共2048M字节

收藏 2 评论5 发布时间:2017-3-12 19:16

举报

5个回答
cldym 回答时间:2017-3-25 11:46:07
学习学习
斜阳 回答时间:2017-3-25 13:32:54
是不是保护区域太大了?导致只能执行指令数据不能读写。
无薪税绵 回答时间:2017-3-25 13:54:54
建议楼主看看这里:http://bbs.21ic.com/icview-852683-1-1.html
有详细的代码可以参考。
hpdell 回答时间:2017-3-26 17:50:38
本帖最后由 hpdell 于 2017-3-26 18:38 编辑
无薪税绵 发表于 2017-3-25 13:54
建议楼主看看这里:http://bbs.21ic.com/icview-852683-1-1.html
有详细的代码可以参考。 ...

感觉这个 f7的 mpu 就是个麻烦,有时吧这个功能设置好了,但是另外一个又不能够使用了,哎,悲惨的 f7比如下面的设置

static void MPU_Set_Protection(uint32_t baseaddr,
                               uint32_t size,
                               uint32_t rnum,
                               uint32_t ap,
                               u8 sen,
                               u8 cen,
                               u8 ben)
{
        MPU_Region_InitTypeDef MPU_Initure;
        
        HAL_MPU_Disable();                                                                                      //配置MPU之前先关闭MPU,配置完成以后在使能MPU

        MPU_Initure.Enable           = MPU_REGION_ENABLE;                                  //使能该保护区域
        MPU_Initure.Number           = rnum;                                              //设置保护区域
        MPU_Initure.BaseAddress      = baseaddr;                              //设置基址
        MPU_Initure.Size             = size;                                                    //设置保护区域大小
        MPU_Initure.SubRegionDisable = 0x00;                            //禁止子区域
        MPU_Initure.TypeExtField     = MPU_TEX_LEVEL0;                  //设置类型扩展域为level0
        MPU_Initure.AccessPermission = (uint8_t)ap;                                  //设置访问权限,
        MPU_Initure.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;          //允许指令访问(允许读取指令)
        MPU_Initure.IsShareable      = sen;                            //是否允许共用
        MPU_Initure.IsCacheable      = cen;                            //是否允许cache
        MPU_Initure.IsBufferable     = ben;                             //是否允许缓冲
        HAL_MPU_ConfigRegion(&MPU_Initure);                           //配置MPU
        HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);                                          //开启MPU

}




        MPU_Set_Protection(0xC0000000,
                     MPU_REGION_SIZE_128MB,
                     MPU_REGION_NUMBER2,
                     MPU_REGION_FULL_ACCESS,
                     MPU_ACCESS_NOT_SHAREABLE,
                     MPU_ACCESS_CACHEABLE,    // 此处设置为 MPU_ACCESS_NOT_CACHEABLE 在申请 外部SDRAM内存进行读写时完全正确,
                                                                  //   但 设置MPU_ACCESS_CACHEABLE 为这个时,申请 外部SDRAM内存进行读写时错误,                                                                   // 如果不设置为 MPU_ACCESS_CACHEABLE  这个,那么外部设置单片机的 Heap 使用时,速度又跟不上
                                                                  // 请教下此处该如何设置才稳妥 ?????????????????????????????
                     MPU_ACCESS_BUFFERABLE);    //保护SDRAM区域,共128M字节







无薪税绵 回答时间:2017-3-27 13:17:38
这个我也不太懂,等待大神来解答了。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版