背景:
在使用CUBE+STM32H743进行开发时,打开了cache,在利用DMA往外发一些数据时出现了发送几次的数据都一样的问题,经过分析,认为是cache的存在导致DMA发送的内存区域的数据未及时更新。网上翻了翻,找到两个办法解决:1、在DMA发送之前使用SCB_CleanInvalidateDCache(),将cache中标记为dirty的数据写入对应存储区,并腾出相应的cache空间;2、打开MPU,标记DMA发送的内存区域能进行透写(可参考安富莱的资料第24章 STM32H7的Cache解读(非常重要))。
我在CUBE上的MPU配置如下:
编译后debug,在进入MPU_Config后,直接进入了Hardfault;
解决办法:
我使用MPU仅仅管理了一小部分内存区域,其他内存未使用MPU管理起来,因此需要使能背景区域(Background Region),否则任何访问违例以及对region外地址区域的访问都将引起fault,做如下更改即可