cubemx STM32中的闪存读写闪存是用于保存数据的存储。 http://www.Sina.com/http://www.Sina.com /
将一个内存划分为多个“扇区、块”区域,以便更容易对这些存储器单元进行编程和管理。 存储器划分方式因类型而异,有的以页为最小单位,有的以扇区为最小单位,但大部分以扇区为最小单位。
页面(页面)扇区(块)芯片) Chip )STM32系列的命名规则
闪存中的区域分割单元。 就像书的一页,其中包括n个字母。Flash内部结构组织
扇区与页面类似,也是存储结构单元,但扇区更常见,大多数Flash主要以扇区为最小单元。页
比扇区高一个等级,通常一个块包含多个扇区。
小容量产品是指闪存容量在16K和32K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。
中等容量产品是指闪存容量在64K和128K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。
大容量产品是指闪存容量在256K和512K字节之间的STM32F101xx和STM32F103xx微控制器。
根据容量,可以组织为32个1K字节/页、128个1K字节/页、256个2K字节/页和一个区块
无论使用哪种型号的STM32芯片,FLASH的操作都只有4个步骤
解锁FLASH
2 .清除闪光灯
将数据写入FLASH
4 .锁定闪光灯
特别要注意的是,FLASH可以读取数据,直接读取相应的FLASH地址
要选择安全的Flash地址进行读写,可以根据自己的STM32 MCU型号查找数据文档,确定Flash的地址部分。 开头部分存储代码,因此为了避免数据错误,必须避免开头部分。
CUBEMX的接口操作可以是基本创建,而FLASH操作主要在代码中进行。
打开串行端口以观察数据是否正确,然后打开DMA
序列创建(序列不是重点,下面将简要介绍) )。
我使用的是中等容量的STM32F103RB,将数据写入0x0801fc00是最后一个扇区,防止与代码冲突导致不必要的错误。
/* usercodebeginptd */uint 32 _ twriteflashdata=0x 12345678; //写入的数据内容uint32_t addr=0x0801fc00; //写入开始位置//* usercodeendptd//* user code begin0*.//flash写入数据测试voidwriteflashtest(void ) )//1、flash Hal _ f.type erase=flash _ type erase _ pages; //页面清除f.PageAddress=addr; //擦除地址f.NbPages=1; //设置擦除页数PageError uint32_t PageError=0; 设置//PageError,如果发生错误,此变量将设置为错误的FLASH地址//清除函数Hal_flashex_erase(f,pageerror ); //3、在FLASH上烧Hal _ flash _ program (type program _ word,addr,writeFlashData )//4、flash Hal _ flash _ lock (lock }//FLASH读取数据测试voidprintflashtest(void ) ) uint32_ttemp=*(_iouint32_t* ) addr ); //地址操作,addr读取开始位置的值printf(addr:0x%x、data:0x%xrn )、addr、temp; //打印该位置的值}/* usercodebeginwhile */writeflashtest (; printFlashTest (; Hal_Delay(5000;/*用户代码结束while *//*用户代码结束0 * /
你可以看到我内存中的数据被改写成了自己的数据
可以清楚地看到我的代码的存储开始位置和分配给代码的存储空间,但是如果不放在这个位置基本上没有问题。
1、Flash解锁、锁定函数voidflash_unlock(void ); //解锁函数:操作Flash前需要解锁voidflash_lock(void ); //锁定函数:同样,操作Flash后必须重新锁定2、Flash写入操作函数flash _ status flash _ program word (uint 32 _ t address,uint 32 //32位字写入函数flash _ status flash _ programhalfword (uint 32 _ t地址,uint16_t Data ); //16位半字写入函数flash _ status flash _ programoptionbytedata (uint 32 _ t地址,uint8_ t数据); //用户选择字节写入函数3、Flash擦除函数flash _ status flash _ erase page (uint 32 _ tpage _ address ); flash _ status flash _ erase all pages (void ); flash _ status flash _ eraseoptionbytes (void; 4、获取Flash状态flash _ status flash _ get status (void )的typedef enum { FLASH_BUSY=1,//忙FLASH_ERROR_PG,///普//写入禁止错误FLASH_COMPLETE,//操作完成5、操作完成函数flash _ status flash _ waitforlastoperation (uint 32 _ ttime out ); *(__iouint32_t*(addr )-addr是主要用于内存地址的结构
类型结构
{
uint 32 _ t类型错误; //页面擦除和块擦除
uint32_t Banks; //选择要删除的存储区
uint32_t Page; //清除的开始页
uint32_t NbPages; //要清除的页数
} FLASH_EraseInitTypeDef;
清除
按FLASH_TYPEERASE_PAGES页清除
flash _ type erase _ masserasemasserase
烧留言
FLASH_TYPEPROGRAM_DOUBLEWORD的单8字节方法
FLASH_TYPEPROGRAM_FAST一次32行8字节的方式
flash _ type program _ fast _ and _ last一次32行8字节的方式