完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1:Flash简介
FLASH存储器是闪速存储器,它的主要特点是在不加电的情况下能长期保持存储的信息。就其本质而言,Flash Memory属于EEPROM(电擦除可编程只读存储器)类型。它既有ROM的特点,又有很高的存取速度,而且易于擦除和重写, 功耗很小。 2:嵌入式Flash特性 对于 STM32F40x 和 STM32F41x,容量高达 1 MB;对于 STM32F42x 和 STM32F43x,容量高达 2 MB 128 位宽数据读取 字节、半字、字和双字数据写入 扇区擦除与全部擦除 低功耗模式 STM32F40x和STM32F41x Flash 模块构成 可以看到 主存储器 该部分用来存放代码和数据常数(如const类型的数据)。分为12个扇区,前4个扇区为16KB大小,然后扇区4是64KB大小,扇区5~11是128K大小,从上图可以看出主存储器的起始地址就是0X0800 0000,B0、B1都接GND的时候,就是从0X0800 0000开始运行代码 2.系统存储器 这个主要用来存放STM32F4的bootloader代码,此代码是出厂的时候就固化在STM32F4里面了,专门来给主存储器下载代码的。当B0接3.3V,B1接GND的时候,从该存储器启动(即进入串口下载模式)。 3.OTP区域 即一次性可编程区域,共528字节,被分成两个部分,前面512字节(32字节为1块,分成16块),可以用来存储一些用户数据(一次性的,写完一次,永远不可以擦除!!),后面16字节,用于锁定对应块。 4.选项字节 用于配置读保护、BOR级别、软件/硬件看门狗以及器件处于待机或停止模式下的复位。 3:Flash 闪存的读取 STM23F4的FLASH读取是很简单的。例如,我们要从地址addr,读取一个字(字节为8位,半字为16位,字为32位),可以通过如下的语句读取: data=*(vu32*)addr; 将addr强制转换为vu32指针,然后取该指针所指向的地址的值,即得到了addr地址的值。类似的,将上面的vu32改为vu16,即可读取指定地址的一个半字。 在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。 STM32F4的闪存编程由6个32位寄存器控制,他们分别是 FLASH访问控制寄存器(FLASH_ACR) FLASH秘钥寄存器(FLASH_KEYR) FLASH选项秘钥寄存器(FLASH_OPTKEYR) FLASH状态寄存器(FLASH_SR) FLASH控制寄存器(FLASH_CR) FLASH选项控制寄存器(FLASH_OPTCR) 其中秘钥寄存器中有两个键值KEY1=0X45670123 KEY2=0XCDEF89AB STM32F4 Flash标准编程的步骤如下 检查FLASH_SR中的BSY位,确保当前未执行任何FLASH操作。 将FLASH_CR寄存器中的PG位置1,激活FLASH编程。 针对所需存储器地址(主存储器块或OTP区域内)执行数据写入操作: —并行位数为x8时按字节写入(PSIZE=00) —并行位数为x16时按半字写入(PSIZE=01) —并行位数为x32时按字写入(PSIZE=02) —并行位数为x64时按双字写入(PSIZE=03) 等待BSY位清零,完成一次编程。 按以上四步操作,就可以完成一次FLASH编程。不过有几点要注意:1,编程前,要确保要写入地址的FLASH已经擦除。2,要先解锁(否则不能操作FLASH_CR)。3,编程操作对OPT区域也有效,方法一模一样。 4:闪存擦除 FLASH编程的时候,要先判断所写地址是否被擦除了,STM32F4的闪存擦除分为两种 扇区擦除 整片擦除 扇区擦除步骤 检查FLASH_CR的LOCK是否解锁,如果没有则先解锁 检查FLASH_SR寄存器中的BSY 位,确保当前未执行任何FLASH操作 在FLASH_CR寄存器中,将SER位置1,并从主存储块的12个扇区中选择要擦除的扇区 (SNB) 将FLASH_CR寄存器中的STRT位置1,触发擦除操作 等待BSY位清零 整片擦除步骤 检查 FLASH_SR 寄存器中的 BSY 位,以确认当前未执行任何 Flash 操作 将 FLASH_CR 寄存器中的 MER 位置 1(STM32F405xx/07xx 和 STM32F415xx/17xx 器件) 将 FLASH_CR 寄存器中的 MER 和 MER1 位置 1(STM32F42xxx 和 STM32F43xxx 器件) 将 FLASH_CR 寄存器中的 STRT 位置 1 等待 BSY 位清零 5:代码实现 讲几个重要的函数 CR控制寄存器位8、9置0 根据VCC来操作CR寄存器的位8、9 CR寄存器位3~7置0 操作CR寄存器位3~6来选择要擦除的扇区,并置位1,激活扇区擦除 操作CR寄存器的位16来触发擦除操作 等待操作并查询SR寄存器,查询操作的状态 操作完成后,清除掉一些相应位 写入函数FLASH_ProgramWord CR控制寄存器位8、9置0 操作CR寄存器位8、9,来确定编程并行位数 操作CR寄存器的位0,来激活编程 把写入的数据放进扇区地址中 等待操作并查询SR寄存器,查询操作的状态 操作完成后,清除掉CR寄存器位0 至于读函数STMFLASH_ReadWord,那就很简单了。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1602 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1536 浏览 1 评论
967 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
680 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1579 浏览 2 评论
1861浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
642浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
514浏览 3评论
528浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
501浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 19:47 , Processed in 0.964368 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号