一、华大Flash写入注意事项
由Flash操作说明我们可以看出重要一点,就是檫写Flash函数地址需要定义在32K之前(即0x8000之前),否则将写入失败。
二、先上的错误的源代码
这个代码是我应用中导致硬件卡死重启的,其实也不算错误只能说是不严谨的
void WriteParamBlock(SYS_PARAM_t *pFlash) __attribute__((section(".ARM.__at_0x7000")));
void WriteParamBlock(SYS_PARAM_t *pFlash)
/*写入Param数据块*/
{
uint32_t *pAddr = (uint32_t *)pFlash;
uint32_t *pData = (uint32_t *)&SysParam;
uint16_t i,Len = sizeof(SYS_PARAM_t)/4;
for(i=0;i<Len;i++)
{
Flash_WriteWord(*(uint32_t*)&pAddr,*pData);
pAddr ++;
pData ++;
}
}
可以看出我对函数代码定义在0x8000之前,但问题出现在同样的代码块放在两个工程间,一个工程运行OK,一个一运行就卡死直至看门狗复位重启。折磨了我好久,后面终于发现是定义写Flash地址超出了0x8000了,导致问题的而发生。
分析如下:
(1)第一个工程我简称位"A"工程,我们查看A工程的map文件如下:
(2)第二个工程我简称"B"工程,我们查看B工程的map文件如下:
有上图一对比,恍然大悟,真正操作的定义在32K应该是库函数的
Flash_WriteWord、Flash_SectorErase这些才是,而我之前一直以为只要操作的应用函数定义在32K之前就可以,因为看DEMO例程这些底层的库函数Flash_SectorErase并没有对其声明定义在32K之前。
而A工程恰巧代码量少,Flash_WriteWord、Flash_SectorErase位置刚好在32K以内,有图可以看出,而B工程就没这么幸运了,那么解决办法就是针对库文件里面的Flash.c文件里面的有用到的檫写的函数自己定义至32K以内,如下图这是我的方法
三、注意事项
虽然规格书说定义在32K之前就可以,但是经实际验证,如果定义在很临近32K位置,实际操作还是存在问题,所以尽量不要定义在临近32K位置,留点余量就没问题。