打印
[技术问答]

请教HC32L196的FLASH擦写

[复制链接]
1269|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qeeuly|  楼主 | 2024-1-29 09:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
同样的一块板子,用官方的例程读写flash没问题,移植到自己的项目就出现写flash进hard fault的问题,总共也就用了3个函数,
Flash_Init();Flash_SectorErase();Flash_WriteByte();
翻官方用户手册看到一句话,如下图。
看了一下自己的项目编译出来有130K,主要是液晶显示的字模用了很多。
于是做了个测试,把液晶显示的代码都去掉了,编译剩30多K,就没有出现写flash进hard fault的问题。
那么,官方的这句话是哪个意思呢?
1、把en_result_t Flash_SectorErase(uint32_t u32SectorAddr)这个函数指定到小于32768的FLASH地址即可。
2、把官方库文件的整个flash.c都指定到小于32768的FLASH地址。
3、把所有涉及flash读写的代码包括官方库文件和自己写的代码全都指定到小于32768的FLASH地址。


使用特权

评论回复
沙发
wubangmi| | 2024-1-29 11:23 | 只看该作者
意思就是FLASH的擦和写函数必须要放在32K地址(也就是0x8000)这个地址以前,超过这个地址会出现不知名的错误。
别问是什么错误,问就是不知名。设计人员都说不上来。

使用特权

评论回复
板凳
qeeuly|  楼主 | 2024-1-30 10:47 | 只看该作者
这原是回复二楼的,可是一点回复就要登录,登录完点回复又要登录,死循环了。。。
只好回复自己了。
把官方库文件的flash.c指定0x4000的地址,就好了。参考的是下面这个帖子:
https://www.amobbs.com/forum.php?mod=viewthread&tid=5479814
具体做法:用记事本打开hc32l19x.icf,后面加一句:place at address mem:0x00004000 { section .text object flash.o };
(上传图片一直错误,直接贴.icf的最后几行吧,红色是加上去的)。
initialize by copy { readwrite };
do not initialize  { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at address mem:0x00004000 { section .text object flash.o };
place in ROM_region   { readonly };
place in RAM_region   { readwrite, block CSTACK, block HEAP };

使用特权

评论回复
地板
wubangmi| | 2024-1-30 10:55 | 只看该作者

给你贴一张小华原厂的M0+内核的FLASH操作图。
另外建议不要把这个地址放到太后面,越靠前越好,不然IAR这个编译器可能会空出来很大一块地址不存放代码。
导致你最后代码量没到FLASH的极限,但是却说你FLASH空间不够

使用特权

评论回复
5
可怜的小弗朗士| | 2024-2-25 19:56 | 只看该作者
FLASH操作出现hard fault基本上就是地址分配的问题,操作了不该操作的地址

使用特权

评论回复
6
qeeuly|  楼主 | 2024-2-27 16:55 | 只看该作者
wubangmi 发表于 2024-1-30 10:55
给你贴一张小华原厂的M0+内核的FLASH操作图。
另外建议不要把这个地址放到太后面,越靠前越好,不然IAR这 ...

这个pdf能分享一下吗?谢谢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

25

帖子

0

粉丝