-
问题描述
YTM32B1MD1 和 YTM32B1ME0 是Cortex-M33的内核,是支持非对齐访问Flash的。
但由于SystemInit() 中MPU配置错误的问题导致,有概率(1/16)在某次上电后出现:非对齐访问Flash地址时发生UNALIGNED UsageFault,被force为HardFault。
存在问题的SDK版本
- 1_2_0
- 1_2_1
- 1_3_0
- 1_3_1
PS:YTM32B1MD1 和 YTM32B1ME0 1_3_1 版本可以安装HOTFIX001 进行该问题修复
问题分析
在47行,ARM_MPU_SetMemAttr初始化的Attr index是“0”,而在40(或 43行)其配置的Flash地址范围的MPU的Attr引用的index是 “7”。
index 7的Attr其实是没有被进行初始化过的,ARM内核中MPU的寄存器在上电后的值都是随机的,因此Flash地址范围的MPU指定的attr其实是随机值。当某次上电,其值刚好被随机为:MAIR_ATTR[7:4] == 0时,属性就是device memory。
这样就不支持该MPU保护的地址非对齐访问了。因此也可以计算出其上电后出现的概率为1/16。
https://developer.arm.com/documentation/100235/0100/The-Cortex-M33-Peripherals/Security-Attribution-and--Memory-Protection/MPU-Memory-Attribute-Indirection-Registers-0-and-1
问题确认
由于该问题是上电概率性(1/16)发生。
因此如果要确定代码中是否存在非对齐访问Flash的情况,需要固定发生条件使其百分百必现:- 可以在main函数中配置“MPU->MAIR1 &= 0x0FFFFFFF;” 再进行测试,看能否产生 UNALIGNED UsageFault。
- 或者ozone attach后直接修改MPU_MAIR1寄存器为0后,进行测试。
解决方法
- 将40行和43行的“7UL” 改为 “0UL”,正确初始化即可。
测试例程
-
-
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...