N76E003新唐MCU实现将变量保存到flash实现非易失存储IAP
场景
需求:需要每次上电加载上次运行的配置或者状态。
解决思路:每次修改配置后,将变量保存在flash非代码区。每次启动从非代码区读取配置。
如何判断代码区,非代码区?
如下图的案例,加载HEX文件后,可以在APROM栏目看到实际HEX文件最后到0x2BF0地址。那么
我们可以将变量存储在 > 0x2BF0的位置,比如0x3000。
代码解释
第一步:确定写入地址,这里假定0x3000,前面说的
第二步:进入IAP模式
第三步:APROM页擦除,从0x3000开始擦除128byte
第四步:APROM从0x3000开始写具体的byte
第五步:退出IAP
如下是IAP命令:我们只用到了页擦除和字节编程两条命令
看代码
#define PAGE_ERASE_AP 0x22 // 页擦除 ,前面表格中有说明
#define BYTE_PROGRAM_AP 0x21 // 字节编程, 前面表格中有说明
/* 实际要改写的地址0x200 */
volatile unsigned char code Data_Flash[128] _at_ 0x3000; //因为擦了页128byte,这里定义一个地址映射
Function (void)
{// 这一块是进入IAP模式TA = 0xAA; //CHPCON is TA protectedTA = 0x55;CHPCON |= 0x01; //IAPEN = 1, enable IAP modeTA = 0xAA; //IAPUEN is TA protectedTA = 0x55;IAPUEN |= 0x01; //APUEN = 1, enable APROM update//擦除页IAPCN = PAGE_ERASE_AP; //Erase page 3000h~307FhIAPAH = 0x30;//地址高位 IAPAL = 0x00;//地址高位IAPFD = 0xFF;// 写具体的byte数TA = 0xAA; //IAPTRG is TA protectedTA = 0x55;IAPTRG |= 0x01; //write ‘1’ to IAPGO to trigger IAP process//将3001H地址写0x55IAPCN = BYTE_PROGRAM_AP; // Program 3001h with 55hIAPAH = 0x30; //地址高位 IAPAL = 0x01; //地址高位IAPFD = 0x55; // 写具体的值TA = 0xAA;TA = 0x55;IAPTRG |= 0x01; //write ‘1’ to IAPGO to trigger IAP process// 退出IAP模式TA = 0xAA; //IAPUEN is TA protectedTA = 0x55;IAPUEN &= ~0x01; //APUEN = 0, disable APROM updateTA = 0xAA; //CHPCON is TA protectedTA = 0x55;CHPCON &= ~0x01; //IAPEN = 0, disable IAP mode// 读取3001H的值,这里之前写了0x55,看看回读效果P0 = Data_Flash[1]; //Read content of address 200h+1while(1);
}