STM32读写内部自带的flash

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位数据。
     

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值