如果CPU要读取的SRAM区数据在Cache中已经加载好,就可以直接从Cache里面读取。如果没有,就用到配置read allocate了,意思就是在Cache里面开辟区域,将SRAM区数据加载进来,后续的操作,CPU可以直接从Cache里面读取,从而时间加速。安全隐患,如果Cache命中的情况下,DMA写操作也更新了SRAM区的数据,CPU直接从Cache里面读取...
如果使用了可以使用DMA的SRAM,需要注意开启了CACHE,记得要配置MPU然后选择为MPU_ACCESS_NOT_CACHEABLE不可使用cahe,所以可以将DMA的数据单独指定到另一块SRAM上,然后将该RAM设置为MPU_ACCESS_NOT_CACHEABLE就可以了,否则DMA数据很有可能是不更新的。 开启CACHE的情况下操作内部flash的时候,也要注意清除D-CACHE,否则写...
*/voidbsp_Init(void){/* 配置MPU */MPU_Config();/* 使能L1 Cache */CPU_CACHE_Enable();/* STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟: - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。 - 设置NVIV优先级分组为4。 */HAL_Init();/* 配置系统时钟到400MHz - 切换使用HSE。
CPU_CACHE_Enable(); /* STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟: - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。 - 设置NVIV优先级分组为4。 */ HAL_Init(); /* 配置系统时钟到400MHz - 切换使用HSE。 - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。 */ S...
方法一:不启动或关闭 D-Cache。 方法二:Core访问SRAM前invalidate cache。 4.2 通过内存保护单元配置Cache 4.2.1 MPU简介 MPU 可以将 memory map内存映射区分为多个具有一定访问规则的区域,通过这些规则可以实现如下功能:[4] 防止不受信任的应用程序访问受保护的内存区域。 防止用户应用程序破坏操作系统使用的数据。
MPU可以配置保护16个内存区域(这16个内存域是独立配置的),每个区域最小要求256字节,每个区域还可以配置为8个子区域。由于子区域一般都相同大小,这样每个子区域的大小就是32字节,正好跟Cache的Cache Line大小一样。 MPU可以配置的16个内存区的序号范围是0到15,还有默认区 default region,也叫作背景区,序号-1。由于...
/* 配置MPU */ MPU_Config(); /* 使能L1 Cache */ CPU_CACHE_Enable(); /* STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟: - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。 - 设置NVIV优先级分组为4。 */ HAL_Init(); ...
不过,请注意这里针对D-Cache相应地址做了无效化处理的代码要放在最前面。你可以将该句试着放在对AdcDataViaDMA [5]赋0语句的后面验证下,看看会有什么现象,要看细致点,不然发现不了问题。顺便提醒,目前所用SRAM区域在没有做MPU配置的情况下,默认为write back加write allocate Cache属性,我在前面贴图时已经圈出来了...
IsShareable:设定配置的内存区域是否可以共享,可设置为1:MPU_ACCESS_BUFFERABLE和0:MPU_ACCESS_NOT_BUFFERABLE。这个参数在多用在总线和多核访问时的访问控制,一般情况下,除非使用STM32H745/H747,否则基本不用在乎此参数。 IsCacheable:设定cache策略,可设置为1:MPU_ACCESS_CACHEABLE和0:MPU_ACCESS_NOT_CACHEABLE ...
/* 配置MPU */ MPU_Config(); /* 使能L1 Cache */ CPU_CACHE_Enable(); /* STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟: - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。 - 设置NVIV优先级分组为4。 */ HAL_Init(); ...