[LPC55xx]如何修复AHB读取HardFault错误
最近,有用户在LPC55S69上执行AHB FLASH存储器读取时遇到HardFault错误。如果在批量擦除之后从未对FLASH扇区进行编程,则如果检测到不可恢复的错误,则执行AHB读取FLASH存储器内容将导致硬件故障。
为什么?
LPC55Sxx零件出厂时已批量擦除,且未设置ECC。当MCUXpresso IDE通过LinkServer连接芯片时,它将首先擦除将用于编程图像的扇区,然后使用正确的ECC集对代码进行编程。超出映像末尾的扇区将保持不变,这些扇区将保持“擦除”状态,而未设置ECC。
当LPC55Sxx通过AHB总线执行FLASH读取代码(例如,mytemp = *(uint32_t *)0x4000)时,它将在AHB读取时检查FLASH ECC。读取已编程的扇区没有问题,因为ECC已经设置。但是,读取具有无效ECC值的未编程扇区会导致无法读取并转到HardFault_Handler,如下所示:
如果在扇区擦除后执行AHB读取闪存内容,我们将遇到同样的HardFault问题。
解决方案
有两种解决方法可以纠正该错误。
1.在对闪存部分进行编程之后,读取闪存内容
与批量擦除不同,对FLASH进行编程会更新相关的ECC值。因此,通过成功的ECC检查,可以通过以下代码实现读取的AHB。
- volatile uint32_t mytemp;
- ……
- mytemp = *(uint32_t*)0x1000;//read memory content 0x1000 to mytemp
复制代码 注意:0x1000必须为“已编程”地址。如果未使用的FLASH扇区处于“擦除”状态,则要读取它,我们需要在AHB读取之前手动对其进行编程。可以在MCUXpresso SDK程序包下的flashiap演示中引用FLASH编程演示代码。参见函数FLASH_Program。
2.使用FLASH控制器命令读取FLASH内容
使用FLASH控制器命令的读取操作(请参见UM11126的“命令列表(CMD)”部分)不会引起硬故障。这是UM建议的读取FLASH内容的方法。
注意:仅在最高100 MHz的CPU频率下才能执行闪存操作(擦除,空白检查,编程)和读取单个字。对于高于100 MHz的频率,无法执行这些操作。
到目前为止,我还没有找到FLASH阅读的演示代码。请按照以下步骤创建演示。
环境:
IDE:MCUXpresso IDE v11.1.0
SDK MCUXpresso SDK v2.7.0
文件:
lpcxpresso55s69_led_blinky_memoryread.zip
(659.83 KB, 下载次数: 1)
|