void FlashCtl_eraseSegment(uint8_t *flash_ptr){
//Clear Lock bit
HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY;
//Set Erase bit
HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY + ERASE;
//Dummy write to erase Flash seg
*flash_ptr = 0;
//test busy
while(HWREG8(FLASH_BASE + OFS_FCTL3) & BUSY)
{
;
}
//Clear ERASE bit
HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY;
//Set LOCK bit
HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY + LOCK;
}
上述程序复制与官方LIB中的flashctl.c
现在有些许疑问:为什么输入的地址是8位,main memory不都是16位和20位的吗。
其次,为什么直接地址的值赋0,后面就可以擦除FLASH了,是给寄存器定位当前地址用的?
Maka Luo:
information flash 分为4个Segment,这里传输的并非地址信息,而是information flash segment 地址。
如果需要擦除code flash, 调用extern void FlashCtl_eraseBank(uint8_t *flash_ptr); flash是以bank为单位擦除。