STM32F767IGT6D的FLASH大小为1MB

文章目录

  • Flash
    • 闪存模块
    • 闪存的读取
    • 闪存的编程和擦除
      • STM32F767的标准编程步骤
      • STM32F767的擦除
        • 扇区擦除
        • 整片擦除
  • 附录
    • 代码

Flash

闪存模块

  • 模块组织表如上,可见STM32F767IGT6由:主存储器系统存储器OPT区域选项字节4部分组成。
    STM32F767的Flash访问路径有两条:AXIMICTM,一般使用AXIM接口访问Falsh,其其实地址为0X08000000

  • 主存储器
    存放代码和数据常量(const常量数据)。它可以分为1个Bank(默认)和2个Bank,可以通过选项字节nDBank位来设置。
    在单Bank模式下,STM32F767的主存储器被分为8个扇区,前4个扇区为32kb大小,第五个山扇区为128kb大小,剩下的3个扇区都是256kb大小,共1MB

  • 系统存储器
    存放Bootloader代码,此代码是出厂时就固化的,用来给主存储器下载代码,当B0接3.3v时默认从系统存储器启动

  • OTP区域
    一次性可编程区域,共1056byte,被划分为16个64字节的OTP数据块和1个16字节的OTP锁定块。锁定块决定了数据块是否可编程。

  • 选项字节

闪存的读取

为了准确的读取Flash数据,需要根据CPU时钟(HCLK)的频率和器件电源电压设置FLSH的存取控制寄存器(FLASH_ACR)中的等待周期数(LATENCY),CPU频率与FLASH等待周期数的对应关系如图:

  • 等待周期通过FLASH_ACR寄存器的LATENCY[3:0]来设置,系统复位后,系统时钟为内部的16MRC振荡器,LATENCY默认是0(1个等待周期)。供电电压一般默认为3.3,所以在设置216Mhz频率作为CPU时钟之前,必须先设置LATENCY为7(8个CPU周期),否则FLASH读写可能会出错导致死机。
  • STM23F7的 FLASH 读取是很简单的。例如,我们要从地址 addr ,读取一个字(一个字为32 位),可以通过如下的语句读取:
                  data=(vu32)addr;
    将addr 强制转换为 vu32 指针,然后取该指针所指向的地址的值,即得到了 addr 地址的值。
    类似的,将上面的 vu32 改为 vu8 ,即可读取指定地址的一个字节。

闪存的编程和擦除

  • 执行任何Flash的编程操作(擦除或编程)时,CPU时钟频率(HCLK)不能低于1Mhz。如果在Flash操作期间期间器件发生复位,无法保证Flash的内容。
  • 在对Flash执行写入或擦除操作期间,任何读取Flash的尝试都会导致总线阻塞。只有在完成编程操作后才能正确处理读操作。
  • STM32F767的闪存编程由7个32位寄存器控制,如下
    名称 缩写
    Flash访问控制寄存器 FLASH_ACR
    Flash密匙寄存器 FLASH_KEYR
    Flash选项密匙寄存器 FLSAH_OPTKEYR
    Flash状态寄存器 FLASH_SR
    Flash控制寄存器 FLASH_CR
    Flash选项控制寄存器 FLASH_OPTCR
    Flash选项控制寄存器1 FLASH_OPTCR1
  • STM32F767复位后,Flash的编程操作是被保护的,不能写入FLASH_CR寄存器;通过写入特定的序列(0X45670123 和 0XCDEF89AB)到FLASH_KEYR寄存器才可解除写保护,只有在写保护被解除后,才能操作相关寄存器。
  • STM32F767的编程位数通过FLASH_CR的PSIZE字段配置,PSIZE的设置必须和电源电压匹配,见表,使用3.3v供电时,PSIZE必须设置为10,擦除护着编程都必须以32位为基础。
  • FLASH在编程的时候,也必须要求其写入地址的FLASH是被擦除了的(值必须是0XFFFFFFFF),否则无法写入。

STM32F767的标准编程步骤

  1. 检查Flash_SR的BSY位,确定当前未执行任何Flash操作;
  2. 将Flash_CR寄存器中的PG位置1,激活Flash编程;
  3. 针对所需存储器地址(主存储器块或OTP区域内)执行数据写入操作(PSIZE需要已经设置)
  4. 等待BSY位清,完成一次编程。
  • 以上四步操作就可以完成一次FLASH编程操作,需要注意几点:

    1. 确保编程地址已擦除
    2. 需要先解锁FLASH_CR,操作完后要上锁
    3. 变成操作对OPT区域也一样

STM32F767的擦除

扇区擦除

  1. 检查FLASH_CR是否解锁,未解锁先解锁
  2. 检查FLASH_SR的BSY位,确保当前未执行任何FLASH操作
  3. 将FLASH_CR的SER位置1,并从主存储块的12个扇区中选择要擦除的扇区(SNB)
  4. 将FLASH_CR的STRT置1,触发擦除操作
  5. 等待BSY位清零

整片擦除

附录

代码

依赖于HAL库

#include "stmflash.h"
#include "delay.h"//读取指定地址的字(32位数据)
//faddr:读地址
//返回值:对应数据.
u32 STMFLASH_ReadWord(u32 faddr)
{return *(__IO uint32_t *)faddr;
}//获取某个地址所在的flash扇区
//addr:flash地址
//返回值:0~11,即addr所在的扇区
uint16_t STMFLASH_GetFlashSector(u32 addr)
{if(addr<ADDR_FLASH_SECTOR_1)return FLASH_SECTOR_0;else if(addr<ADDR_FLASH_SECTOR_2)return FLASH_SECTOR_1;else if(addr<ADDR_FLASH_SECTOR_3)return FLASH_SECTOR_2;else if(addr<ADDR_FLASH_SECTOR_4)return FLASH_SECTOR_3;else if(addr<ADDR_FLASH_SECTOR_5)return FLASH_SECTOR_4;else if(addr<ADDR_FLASH_SECTOR_6)return FLASH_SECTOR_5;else if(addr<ADDR_FLASH_SECTOR_7)return FLASH_SECTOR_6;return FLASH_SECTOR_7;
}//从指定地址开始写入指定长度的数据
//特别注意:因为STM32F7的扇区实在太大,没办法本地保存扇区数据,所以本函数
//         写地址如果非0XFF,那么会先擦除整个扇区且不保存扇区数据.所以
//         写非0XFF的地址,将导致整个扇区数据丢失.建议写之前确保扇区里
//         没有重要数据,最好是整个扇区先擦除了,然后慢慢往后写.
//该函数对OTP区域也有效!可以用来写OTP区!
//OTP区域地址范围:0X1FF0F000~0X1FF0F41F
//WriteAddr:起始地址(此地址必须为4的倍数!!)
//pBuffer:数据指针
//NumToWrite:字(32位)数(就是要写入的32位数据的个数.)
void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)
{ FLASH_EraseInitTypeDef FlashEraseInit;HAL_StatusTypeDef FlashStatus=HAL_OK;u32 SectorError=0;u32 addrx=0;u32 endaddr=0;    if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return;    //非法地址HAL_FLASH_Unlock();             //解锁addrx=WriteAddr;                //写入的起始地址endaddr=WriteAddr+NumToWrite*4;    //写入的结束地址if(addrx<0X1FF00000){while(addrx<endaddr)        //扫清一切障碍.(对非FFFFFFFF的地方,先擦除){if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区{   FlashEraseInit.TypeErase=FLASH_TYPEERASE_SECTORS;       //擦除类型,扇区擦除 FlashEraseInit.Sector=STMFLASH_GetFlashSector(addrx);   //要擦除的扇区FlashEraseInit.NbSectors=1;                             //一次只擦除一个扇区FlashEraseInit.VoltageRange=FLASH_VOLTAGE_RANGE_3;      //电压范围,VCC=2.7~3.6V之间!!if(HAL_FLASHEx_Erase(&FlashEraseInit,&SectorError)!=HAL_OK) {break;//发生错误了    }SCB_CleanInvalidateDCache();                            //清除无效的D-Cache}else addrx+=4;FLASH_WaitForLastOperation(FLASH_WAITETIME);                //等待上次操作完成}}FlashStatus=FLASH_WaitForLastOperation(FLASH_WAITETIME);            //等待上次操作完成if(FlashStatus==HAL_OK){while(WriteAddr<endaddr)//写数据{if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,WriteAddr,*pBuffer)!=HAL_OK)//写入数据{ break;    //写入异常}WriteAddr+=4;pBuffer++;} }HAL_FLASH_Lock();           //上锁
} //从指定地址开始读出指定长度的数据
//ReadAddr:起始地址
//pBuffer:数据指针
//NumToRead:字(32位)数
void STMFLASH_Read(u32 ReadAddr,u32 *pBuffer,u32 NumToRead)
{u32 i;for(i=0;i<NumToRead;i++){pBuffer[i]=STMFLASH_ReadWord(ReadAddr);//读取4个字节.ReadAddr+=4;//偏移4个字节.    }
}

STM32F7--->Internal Flash相关推荐

  1. 在PPT中插入flash动画和影片

    在写PowerPoint时为了展示的需要,通常要插入flash以及影片,具体方法如下: 1. 先说影片吧,这个比较直观 直接选择"插入-影片"然后就可以了. 2. 插入flash ...

  2. zigbee cc2530地址空间 layout 和flash操作

         ... 2.2.2 CPU Memory Space cpu存储空间(以下叫地址空间) XDATA memory space. The XDATA memory map is given i ...

  3. H750移植rt_thread操作系统完整工程分享,包括外部FLASH分散加载文件

    一.移植注意事项 1.在运行外部FLASH存储的代码之前首先要初始化QSPI进入内存映射模式,参考代码: //QSPI进入内存映射模式(执行QSPI代码必备前提,为了减少引入的文件, //除了GPIO ...

  4. you-get下载b站选集_Flash选集:酷炫效果和实用的ActionScript-第1章:Flash基本知识

    you-get下载b站选集 Life without Flash would be uninteresting and mundane. Flash sites are to static HTML ...

  5. Flash应用安全规范

    Flash应用安全规范 Author: jianxin [80sec] EMail: jianxin#80sec.com Site: http://www.80sec.com Date: 2009-0 ...

  6. 如何修复Google Chrome中的Shockwave Flash崩溃

    If your copy of Google Chrome has taken on a sudden and inexplicable hatred for Shockwave Flash, we' ...

  7. STM32 Flash 永久用户数据空间

    /*********************************************************************************  *               ...

  8. 把DSP TMS320F28XXX的程序段从flash复制到ram中运行

    翻译自TI应用手册SPRAAU8(http://www.ti.com.cn/cn/lit/an/spraau8/spraau8.pdf) 摘要 这个应用报告和相关的代码提供了一种把编译后的程序段从TM ...

  9. DSP28335—把TMS320F28XXX的程序段从flash复制到ram中运行

    文章来自:http://www.61ic.com/Article/C2000/Delfino/201303/47552.html 翻译自TI应用手册SPRAAU8 很详细,对编写CMD文件很有帮助! ...

  10. CCS编译 FLASH memory range has already been specified 错误

    触发linker报错的过程是,先从CCS12的资源浏览器中导入一个例程如project zero.此时如果直接编译,不会报错.但是如果将目标芯片更改,只要一改,不管改成什么,即使改完保存再改回来,依然 ...

最新文章

  1. Java程序员从笨鸟到菜鸟之(七十四)细谈Spring(六)spring之AOP基本概念和配置详解
  2. 华为基于策略划分VLAN的配置方法及示例
  3. html页面foot,HTML tfoot用法及代码示例
  4. linux无密码ssh,scp,rsync
  5. HTC Vive凭什么在十分钟内获得1.5万的订单?
  6. 个人开发—进度记录(十五)
  7. 问题三十九:怎么用ray tracing画圆环
  8. 网络流二十四题之魔术球问题
  9. HTML+CSS美食静态网页设计——简单我的家乡吉林
  10. 从石器时代到硅器时代
  11. 利用python炒股talib_【手把手教你】股市技术分析利器之TA-Lib(一)
  12. PyQt主窗口、对话框
  13. 关于自动化测试的定位及一些思考
  14. Cohort analysis
  15. 数模(02)---多属性决策模型
  16. java rgb565_java将图片(jpg/bmp/png)转16位bmp(RBG565)
  17. MySQL中文乱码问题处理详解
  18. 异常e.getMessage()与e.getCause().getMessage()的区别
  19. 常用英语翻译与技巧总结
  20. 地铁线路项目需求简要分析

热门文章

  1. 会话固定攻击(session fixation attack)及解决办法
  2. web buuctf [0CTF 2016]piapiapia
  3. 坚持#第235天~哎呀,最近培训云计算忙得都把写博客的大事给忘了,赶快捡起来
  4. php molten,当molten遇到机器学习
  5. MTK 6737 Flash配置
  6. 笔记本突然不能连接无线网解决办法
  7. 机器学习笔记15——决策树(DT)、ID3算法、C4.5算法原理以及python实现案例
  8. Laravel和Doctrine的测试驱动开发
  9. 数据预处理--无量纲化
  10. MR-GMMapping:基于高斯混合模型的通信高效多机器人映射系统