LPC55Sxx Flash读取遇到HardFault该如何解决?

cancel
Showing results for 
Search instead for 
Did you mean: 

LPC55Sxx Flash读取遇到HardFault该如何解决?

100% helpful (1/1)

LPC55Sxx Flash读取遇到HardFault该如何解决?

经常有客户在使用LPC55S69的过程中遇到读 Flash进入异常HardFault中断的现象。如果在Flash Mass Erase之后从未对Flash扇区进行过写操作,直接用指针通过AHB读Flash地址会导致程序跳入HardFault 中断而无法继续正常运行。

原因

   刚出厂的LPC55Sxx FLASH处于全零的全擦除状态,没有设置ECC。当芯片通过LinkServer MCUXpresso IDE建立连接时,先擦除要下载代码用到的扇区,再把代码下载到对应位置,并对相应存储区的ECC值同时进行更新。代码以外的区域仍然是无ECC设置的擦除状态。

LPC55Sxx 通过AHB总线直接读取Flash内存区域时(例如,mytemp = *(uint32_t*)0x4000)要对Flash ECC进行校验。这一指令对于读有效代码区是没有问题的, 因为这一区域的ECC在下载代码时早已设置好。但是一旦读取没有代码的扇区,由于没有检测到正确的ECC,导致Flash读取失败,并跳转到下图中的HardFault_Handler()异常中断:

ZhangJennie_0-1628233844853.png

 

我们在Sector Erase后通过AHB读取Flash内存内容,也会遇到同样的HardFault异常跳转,出问题的原因都是一样的。

解决方法

针对这一问题我们有如下两种解决方法:

  1. 先执行Flash写操作,再读取Flash

Flash 擦除操作不同,执行Flash写操作后对应的ECC值也同步更新。这样,ECC校验通过后,通过下面的代码就可以对Flash直接进行AHB读取。

volatile uint32_t mytemp;

……

mytemp = *(uint32_t*)0x1000;//read memory content 0x1000 to mytemp

请注意:0x1000必须是一个已经写过的地址。

如果Flash的某个扇区处于被擦除的状态,我们只需要在通过AHB总线读取内存区域之前对该区域执行写操作,这样ECC校验位更新正确后,就可以正常读FlashFlash的写操作可以参考MCUXpresso SDK自带的flashiap例程,函数FLASH_Program

 

  1. 使用Flash控制指令读取Flash区内容

使用Flash控制指令进行读操作不会导致硬件错误(请参阅UM11126 “Command listing (CMD)”章节)。这是用户手册中推荐的读Flash正确打开方式。

请注意:CPU只有在频率低于100MHz时,才能进行Flash操作(读,写,擦除,校验,等等),当CPU频率超过100MHz时是不能实现上述操作的。

目前,官方没有提供上用控制指令读取Flash内容的例程,因此需要您根据下面步骤创建自己的读Flash程序。

开发环境:

IDE: MCUXpresso IDE v11.1.0

SDK MCUXpresso SDK v2.7.0

步骤:

  • MCUXpresso IDE中导入一个基础例程,如led_blinky
  • 在下图所述选项中添加iap组件
ZhangJennie_1-1628233844895.png

 

选择iap1,点击OK

ZhangJennie_2-1628233844992.png

 

点击完OK之后,fsl_iap_ffr.h, fsl_iap.c, fsl_iap.h文件将自动添加到工程中

ZhangJennie_3-1628233845037.png

 

  • source文件夹中添加附件中的memory.hmemory.c文件
ZhangJennie_4-1628233845067.png

 

4) 使用Flash 控制指令时,需要在源文件中添加memory.h, fsl_iap.h

ZhangJennie_5-1628233845092.png

 

5) 调用memory初始化和memory读取函数

ZhangJennie_6-1628233845138.png

 

6)调试,单步执行(step over)到memory_read(),查看结果

ZhangJennie_7-1628233845666.png

 

Version history
Revision #:
1 of 1
Last update:
‎08-06-2021 12:11 AM
Updated by: