最近在学习QSPI这个协议,在使用间接模式以及状态轮询模式都可以正常使用,但一到了使用内存映射模式无论怎么写都会导致系统卡死。在一次DeBug中执行执行着发现代码最终会进入到一个“内存故障中断”服务程序导致代码卡死。
我发现我的代码也没问题啊。此时灵光一现,忽然想起STM32H7具有内存保护管理单元这一硬件外设。我的外设代码也是通过CubeMx配置生成的,默认会使能内存保护管理单元,然后我也是大胆的尝试了一下,直接在CubeMx中将其失能后,代码就能正常跑起来了。当然也可以通过CubeMx将QSPI内存映射模式下所需的内存地址对其解除非法访问的保护应该也可以。
由于本人并未对内存保护单元有过研究,不过我猜测是因为内存保护单元导致无法使用指针的形式去访问内存,因为QSPI的内存映射到MCU中的地址是 0x9000 0000 - 0x9FFF FFFF 而这一地址本来就远远超过STM32H7系列所有MCU的内存地址的,属于无效的非法地址(因为ST官方没有在其添置内存单元,虽然32位足够有4GB的内存可访问,但是由于成本的原因,所以并不能使用完,所以当启动了内存保护单元后会将这些没有内存单元的地址将其“锁死”,导致在QSPI的内存映射访问过程中进入内存故障中断,从而导致程序卡死)。
最后,不得不说,有时候保护也可能会成为一种限制。
文章如有错误请及时指导,感激不尽。
感谢大家支持。