打印
[资源共享]

Flash产品IAP使用

[复制链接]
2638|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LEDyyds|  楼主 | 2021-11-26 13:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
HolyChip 部分Flash MCU采用了Flash作类EEPROM的设计方式, MCU的ROM空间均可以用作类
EEPROM数据存储(IAP操作), 用户在数据存储时的灵活性大大提升。
在IAP操作时,如果不做好相关的保护措施,可能会造成程序运行异常。  

适用芯片: HC89S003F4、 HC89S003P、 HC89S001P、 HC89S105C6、 HC89S105C8、
HC89S105K6、 HC89S105K8、 HC89F0411P、 HC89F0421、 HC89F0431、 HC89F0531、 HC89F0541、
HC89F301、 HC89F302、 HC89F303、 HC89F3421、 HC89F3531、 HC89F3541。
相关数据手册、工具及技术文档下载网址: http://www.holychip.cn/


使用特权

评论回复
沙发
LEDyyds|  楼主 | 2021-11-26 13:14 | 只看该作者
1、 BOR 电压以及 BOR 消抖时间设置
1.1 原理说明
MCU 工作电压为 2.0V-5.5V,如果关闭 BOR 时, MCU 1.5V-2.0V 可能会工作异常,程序可能会
跑飞从而导致误擦除。如果将
BOR 电压设置为 2.0V 2.0V 以上,可以保证 MCU 工作在一个稳定的电
压范围内。
  

1.2 BOR 电压设置方式
BOR 电压检测控制寄存器 BORC


BOR 电压检测控制寄存器 BORC


在设置 BOR 电压以及 BOR 消抖时间时, BOR 电压至少设置到 2.0V,在系统允许的情况下, BOR
电压设置的越高越好并且尽量将消抖时间设置较短从而保证 MCU 工作在一个可靠的电压环境内。
BOR 使能后的功耗约为 8uA,如用户需要低功耗,建议在进入掉电模式之前关闭 BOR,掉电模式
唤醒后再使能 BOR,从而达到节省功耗的目的。


使用特权

评论回复
板凳
LEDyyds|  楼主 | 2021-11-26 13:16 | 只看该作者
2、 Option 设置 IAP 擦写保护设置
2.1 原理说明
Option 中设置相关的 IAP 擦写保护,使能程序区数据保护位,可以有效的保证程序区数据不会
被改写或误擦除。
2.2 操作说明
2.2.1 Keil 操作方式
HC89S003F4 “Flash 做类 EEPROM 读写范例为例。  



操作步骤:
1、 KEIL 中打开 Option。(如图 2-1)
2、 点击 Utilities 选项卡中的 Settings 选项。(如图 2-2)
3、 点击保护配置选项卡。(如图 2-3)
4、 分别打开 IAP-RD 以及 IAP-EW 选项卡。(如图 2-4)
5、 根据需求勾选相应的扇区后点击确定。(如图 2-5)
2.2.2 HC-PM51 操作方式

操作步骤:
1、 选择芯片型号,配置代码选项,加载代码后勾选加密保护选项,点击加密保护设置选项。(如图
2-6)
2、 分别打开 IAP-RD 以及 IAP-EW 选项卡。(如图 2-7)
3、 根据需求勾选相应的扇区后点击确定。(如图 2-8)
2.2.3、保护区域计算方法

HolyChip Flash 系列 MCU 均为 128 个字节一个扇区, 8*128 = 1K 为 1 页。
KEIL 编译后会生成编译字节大小,以 HC89S003F4 的“Flash 做类 EEPROM 读写”范例为例,本例
程编译的字节为 585 个(如图 2-9),由于 HC89S003F4 以 4K 字节为保护为单位,所以在勾选时勾选 0、
1、 2、 3 页(如图 2-5 和图 2-8)。部分 MCU 以 1K 字节为保护单位,用户根据需求选择即可。


使用特权

评论回复
地板
LEDyyds|  楼主 | 2021-11-26 13:17 | 只看该作者
3、 IAP 操作前判断 MCU 电压
为防止 MCU 上电瞬间电压不稳导致程序跑飞造成误操作,所以建议每次 IAP 操作前采用 ADC 或
者 LVD 检测 MCU 当前电压,如果电源低于 2.0V 则不进行 IAP 操作。具体的操作方式详见各 MCU 数
据手册及例程。

使用特权

评论回复
5
LEDyyds|  楼主 | 2021-11-26 13:18 | 只看该作者
4、 中断
IAP 操作前,建议关闭中断(EA=0),确保在 IAP 操作期间不会被中断影响,待 IAP 操作完成后,
再将中断恢复。

使用特权

评论回复
6
LEDyyds|  楼主 | 2021-11-26 13:18 | 只看该作者
5、 双区域保存存储数据
5.1 实现原理
在执行 IAP 操作时,不可避免的会遇到数据擦除结束后,尚未写数据就掉电的情况,所以建议采用
双区域保存数据的方式,即使一个区域的数据被擦除,也可以保证另一个区域的数据被正常读取。
5.2 操作说明  


擦写操作:
更新数据时,先更新区域一内数据,更新完成后再更新区域二内数据。(如图 5-1)
读取操作:
读取数据时,先读取区域一内数据,并进行 CRC 校验,如果校验错误,则丢弃区域一的数据, 读
取区域二内数据。(如图 5-2)


使用特权

评论回复
7
LEDyyds|  楼主 | 2021-11-26 13:19 | 只看该作者
6、 IAP 函数绝对地址编译及指针调用
6.1 实现原理
Option 中设置相关的 IAP 擦写保护,使能用户程序所在扇区保护位后, 使用绝对地址编译将
IAP 操作函数放到未设置 IAP 保护的区域, 并使用函数指针的方式调用函数, 保证 MCU 不会误擦除用
户代码。
6.2 操作说明
HC89S003F4 “Flash 做类 EEPROM 读写范例为例,
1、 打开 Flash 做类 EEPROM 读写, 在主函数里分别找到 FLASH 擦除(Flash_EraseBlock)和写
(FLASH_WriteData)的函数, 打开 Project -> Options for Target 菜单, 选中 BL51 Locate 选项卡, 在
Code: 中输入: ?PR?_Flash_EraseBlock?MAIN(0X2000),?PR?_FLASH_WriteData?MAIN(0X2080)
格式为:
?PR?_函数名?MAIN(要编译的地址), 注意, 输入的文本(包括标点符号) 必须是英文格
式, 否则编译器会报错, 然后点击
OK, 程序编译后, 在 M51 文件中可以找到相关信息,如 图 6-3
所示程序已经被编译在相关地址处。



2、 使用函数指针调用绝对地址处的函数,详情请参考例程
(1) 定义函数原型: void Flash_EraseBlock(unsigned int fui_Address);
(2) 定义相应的函数指针变量: void (*CALL_FLASH_ERASE)(unsigned int i);
(3) 函数指针变量赋值, 指向我们定位的绝对地址的函数: CALL_FLASH_ERASE=Flash_EraseBlock;
(4) 函数指针的调用: (*CALL_FLASH_ERASE)(0x2B00);


使用特权

评论回复
8
lajfda002| | 2021-12-2 10:46 | 只看该作者
IAP确实不错的,很棒的一个帖子,不错的。

使用特权

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

本版积分规则

113

主题

815

帖子

1

粉丝