flash模拟EEROM
FLASH中:0x08000000--0x08000000+SIZE保存的是用户代码
Rule:
16位为传输单位
读数据:
u16 STMFLASH_ReadHalfWord(u32 faddr)
- 可以在通用地址空间直接寻址:data=*(vu16*)ADDR;[ADDR为32位数据,指向的数据为uv16型]
写数据:
- 写之前1:解锁FLASH_KEYR(FLASH_Lock(void);| FLASH_Lock(void);)
- 写之前2:擦除,也就是其值必须是 0XFFFF,否则无法写入。[擦除页或直接擦除ALL] 1页=2k字节
- 写之前3: 确保BSY 位为’0’
- 写半字即16位(FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);库里还有Word,byte版本实际上就是写两次HalfWord或1个byte占16位)
- Wait until BSY==1
擦除:
- FLASH_Status FLASH_ErasePage(uint32_t Page_Address);
- FLASH_Status FLASH_EraseAllPages(void);
- FLASH_Status FLASH_EraseOptionBytes(void);
ALIENTEK:
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)
Insure That:
- 地址必须是用户代码区以外的地址,如果把用户代码给卡擦了,可想而知你运行的程序可能就被废了(先在KEIL中限制程序空间,但只要重刷就会失效)
- 地址必须是 2 的倍数。