在L011中,除了普遍的Flash和OB外,还有EEPROM,而且还可以让Flash掉电运行.所以,他其实有4个密码,没错,是4个密码啊.如果Flash掉电了,那么就要RAM运行,也可以省一些电的.在Keil中这样定义RAM中运行代码.
__attribute__ ((section (".ramcode"))) void MyFunc(void){
while(1);
}
不过这2K RAM,是不是真的有点小呢,对于如果在RAM运行,就看要运行的小代码多大了.当然建议把Flash操作过程代码都放在RAM调试,当OK了再转移到Flash,不然调试过程因为Flash没法获取就没法调试了.
说回来那4个钥匙,手册也给了我们.
FLASH->PDKEYR = 0x04152637;
FLASH->PDKEYR = 0xFAFBFCFD;
FLASH->PEKEYR = 0x89ABCDEF;
FLASH->PEKEYR = 0x02030405;
FLASH->PRGKEY = 0x8C9DAEBF;
FLASH->PRGKEY = 0x13141516;
FLASH->OPTKEY = 0xFBEAD9C8;
FLASH->OPTKEY = 0x24252627;
开锁顺序我也整理了一下.
编程EEPROM:PEKEY
编程Flash扇区:PEKEY+PRGKEY
编程OP字节:PEKEY+PRGKEY+OPTKEY
编程Flash RunMode 下掉电模式:PDKEY
EEPROM的地址范围是0x08080000 – 0x080801FF,测试程序如下.
uint8_t i = 0;
__attribute__ ((section (".ramcode"))) void EEPROM_WriteBytes(uint32_t addr, uint8_t code)
{
/* 储存总线没有进行写入/擦除工作. */
while (FLASH->SR & FLASH_SR_BSY);
/* 输入密码解锁储存器 */
FLASH->PEKEYR = 0x89ABCDEF;
FLASH->PEKEYR = 0x02030405;
/* 等待解锁成功 */
while(FLASH->PECR & FLASH_PECR_PELOCK);
/* 编程内容 */
*(uint8_t *)(addr) = code;
/* 等待编程完成 */
while (FLASH->SR & FLASH_SR_BSY);
/* 加锁储存器 */
FLASH->PECR |= FLASH_PECR_PELOCK;
}
int main(void)
{
for(i = 0; i < 0xff; i++)
{
EEPROM_WriteBytes(0x08080000, i);
if(*(uint8_t *)(0x08080000) != i)
{
while(1); /* 错误发生 */
}
}
while (1)
{
}
}
当然了,实际操作中,可以全部写完再加锁,甚至可以不加(就是有点不安全吧).EEPROM的寿命是100K次的,也就是10万次,寿命是很足够的记录很多数据.大致推算也有几十MB的写入寿命了,这EEPROM又这么慢,很耐用的.
接下来看看Flash.其中已知Flash编程需要2个Key.根据Flash特性还要先擦后写.每个扇区大小是128B,所以这一系列器件最大的竟然可以到1536扇区.但是这个Flash只支持一次性编程32Bit或者一次性编程16 Word(Half Page).一次性编程Half Page肯定比32Bit不断来回节省的.