华大Flash檫写导致重启异常问题

文章讲述了在进行Flash操作时,函数地址必须在32K之前,否则可能导致写入失败。作者遇到的问题是,同一段代码在不同工程中的表现不同,原因在于库函数的位置超出了32K限制。解决方案是将库文件中涉及Flash擦写的相关函数重新定位到32K以内。文章强调,即使规格书允许接近32K,也应留出安全余量以避免问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、华大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位置,留点余量就没问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值