首页 > 编程知识 正文

怎么读取stm32内部flash(cubemx STM32的FLASH内存读写)

时间:2023-05-04 14:50:04 阅读:123212 作者:1239

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字节的方式

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。