STM32中存储区分为:随机存取存储器RAM和只读存储器ROM。
最近在学习RFID-RC522相关的知识,想着把读到的32位卡号存储在ROM中,市面上也有相应的模块,比如W25Q64、AT24C02等等;我在这里由于方便,就直接把32位数据存储在STM32自带的ROM(flash)里面了。
(一)、内部flash相关的介绍
我在本次实验中用到的是F103C8T6最小系统板(中密度产品)。
flash最多可以写10万次,所以不能在主循环内调用往flash写入数据的函数。
通过查阅产品的英文手册可知:
该芯片的内部 FLASH 包含主存储器、信息块以及闪存存储器 接口寄存器,一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,芯片型号说明中的256K FLASH、 32K FLASH 都是指这个区域的大小。与其它 FLASH 一样,在写入数据前,要先按扇区擦除。
而且由上面的图可知内部的flash的基地址是0x0800 0000,由128页构成,每页有1K字节(2的10次方等于1024,数量级就是1K)。
(二)、对内部flash写入的过程
如下图:
1. 解锁 (固定的KEY值)
(1) 往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY1 = 0x45670123
(2) 再往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY2 = 0xCDEF89AB
英文手册具体位置:
2、清标志位
FLASH_FLAG_BSY、FLASH_FLAG_EOP、FLASH_FLAG_PGERR、FLASH_FLAG_WRPRTERR
3、按页擦除
具体步骤如下:
(1) 检查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以确认当前未执行任何
Flash 操作;
(2) 在 FLASH_CR 寄存器中,将“激活扇区擦除寄存器位 SER ”置 1,并设置“扇
区编号寄存器位 SNB”,选择要擦除的扇区;
(3) 将 FLASH_CR 寄存器中的“开始擦除寄存器位 STRT ”置 1,开始擦除;
(4) 等待 BSY 位被清零时,表示擦除完成。
4、擦除后就可以在相应的页写数据了
(我们是32位的系统)库函数提供了3个方式,分别是按字写、按半字写和按字节写,在本次的过程中我用的是最后一种方式。连续写4个字节数据就刚好是一个IC卡的卡号了。
5、清除标志位、上锁。
(三)、相关部分工程代码
void FLASH_W(u32 add,u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
FLASH_Unlock(); //解锁FLASH编程擦除控制器
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
FLASH_ErasePage(add); //擦除指定地址页
FLASH_ProgramOptionByteData(add,dat1); //从指定页的addr地址开始写
FLASH_ProgramOptionByteData(add+1,dat2);
FLASH_ProgramOptionByteData(add+2,dat3);
FLASH_ProgramOptionByteData(add+3,dat4);
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
FLASH_Lock(); //锁定FLASH编程擦除控制器
}
flash指定地址连续写入4字节数据。
u16 FLASH_R(u32 add)
{
u16 a;
a = *(u8*)add;
return a;
}
flash读4位数据。