思路:
1、通过IAP 方式操作EEPROM, 操作变量++,写到EEPROM,达到掉电不丢失
2、STM8 208MB 2KB 数据 EEPROM存取区 地址:从4000H开始-47FFH
3、IAP:单片机程序自己改写EEPROM、存取器里面的东西、选项字节
4、ICP:基于电路更新 ,通过SWIM+STLink
5、MASS密钥访问方法
6、Flash 功能相关寄存器:状态寄存器、控制寄存器、保护寄存器(解密时)——
7、解锁EEPROM函数 unlock_EEPROM()
8、1数码管计数掉电不丢失
u8 disnum_EEPROM @0x4000;
//指定disnum_EEPROM指向0x4000地址,即EEPROM起始地址
通过FLASH_IAPSR状态寄存器
1、是否解密成功?2、是否写完?
EEPROM关注以下两个位
位6 HVOFF (高压编程),0为正在写,1写完 。 高4位 0100(已编写完)
位3 DUL 解锁标志 ,0位没解锁,1已解锁。
FLASH关注以下两个位
位1 PUL 解锁标志 ,0位没解锁,1已解锁。
u8 unlock_EEPROM(void)
{
//1.首先写入MASS密匙以解锁EEPROM
FLASH_DUKR=0xAE;
FLASH_DUKR=0x56;
//2.判断DUL位是否解锁成功
if(FLASH_IAPSR & 0x08) &00001000 为真返回0,解锁成功。 为假,返回1,解锁失败
return 0;//解锁成功
else
return 1;//解锁失败
}
while(unlock_EEPROM());//等待数据EEPROM区域解锁成功 0解锁成功,跳到下一行,1继续死循环等待
if(disnum_EEPROM!=0)//如果EEPROM首地址装载数值不为0
{
LED=tableA[disnum_EEPROM];//显示EEPROM数值
i=disnum_EEPROM;//将EEPROM数值赋值给i
delay(200);//延时停留
}
else
LED=tableA[i];//若EEPROM数值为0则数码管显示‘0’
while(1)
{
i=(i+1)%10;//限定i取值范围在0至9
LED=tableA[i];//将0至9段码送到数码管显示
disnum_EEPROM=i;//将0至9数值存入EEPROM首地址
while((FLASH_IAPSR & 0x40)==0);//等待写入成功 0x0100 & 位6 HVOFF (高压编程) 1
写完,0继续等待
delay(500);//延时停留
}