这篇文章我们来说一下嵌入式FLASH。
FLASH接口
FLASH接口其实在前面的文章中有提到,可以分为三类:
第一类,64位ITCM接口,该接口连接Cortex-M7的ITCM总线,用于指令执行以及数据读访问。它不支持写访问,支持64个标准化缓存行,256位宽。
第二类,64位AHB接口,该接口通过AHB总线矩阵连接Cortex-M7的AXI总线,用于代码执行以及读写访问。无论寻址的FLASH接口是TCM还是AHB,FLASH上的DMA和外设DMA数据传输都通过AHB接口完成。
第三类,32位AHB寄存器接口,该接口主要用于访问控制寄存器和状态寄存器。
FLASH构成
F7的FLASH最高有1M字节的用户闪存,它一共分为八个容量不等的扇区,这样FLASH分区可以存放不同的应用程序。
在信息块部分还包括64KB的系统闪存、1024个字节的OTP区和32字节的选项字。
在修改用户选项字之前,需要向选项密钥寄存器写入两个Key值,然后才能在FLASH_OPTCR寄存器中雪茹所需的选项值。
FLASH的擦除和编程操作的并行宽度主要取决于VDD的范围以及是否有采用外部编程的电压,最大的擦除和变成操作的并行宽度是在FLASHCR寄存器中的PSIZE这个字段进行设计的,但是要注意这个字段设计的值必须与实际的外部电压的条件是相符的。
下图就列出了外部电压范围和能够配置到的最大的并行位数的对应表格
如果PSIZE设置的值和实际使用的外部条件不符,就会造成擦除或者编程操作可能导致不能预料的错误,即使能够读出数据,但数据的正确性不能保证。对于擦除操作来说,只能按照扇区或者整片擦除,擦除的时间也取决于PSIZE设置的值。
CPU时钟和FLASH等待周期之间的关系
我们知道FLASH的访问速度远远低于CPU的时钟,所以为了准确地读取FLASH的数值必须根据CPU的时钟频率和器件电源在FLASH存储寄存器中正确编写等待周期,这样才能保证准确读取FLASH的数据。
STM32F7中新增了选项字,,一个是在停止模式下冻结独立看门狗计数器,还有一个是在待机模式下冻结独立看门狗计数器,第三个是硬件/软件窗口看门狗的配置。需要注意的是,当修改这些选项字之后,需要复位系统来使修改起作用。
前面有介绍说F7的启动模式和之前F4、F3都不一样,所以相对的它的选项字也有了新的变化。下图显示了BOOT引脚为0和1时分别对应的启动地址的选项字。当外面的BOOT引脚为低电平时,BOOT_ADD0的选项字所定义的就是启动地址;当BOOT引脚为高电平时,BOOT_ADD1定义的是启动地址。在BOOT_ADD0和BOOT_ADD1中并不是直接写的就是启动地址,它的值和启动地址之间是有一个对应关系的,下图也给大家举了几个例子。
FLASH编程错误
FLASH的编程错误又分为写保护错误和编程错误。
写保护错误是尝试在写保护区域执行编程或擦除操作时,WRPERR位由硬件置1。
编程错误又分为好几种,一种是编程并行位数错误,当访问宽度和PSIZE所选并行位数类型不一致时,硬件置1;还有一种是编程并齐错误,对FLASH进行跨越128位行界限的数据编程操作时,将由硬件置位该标志位;第三种是擦除顺序错误,如果代码在控制寄存器未正确配置的情况下对FLASH执行擦除操作,则ERSERR错误标志位将置1;最后一种是操作错误,如果检测到FLASH操作请求,但由于存在并行位数错误、对齐错误或写保护错误而无法运行,将由硬件对该位置1.只有在使能错误中断后,该位才会置1.
FLASH中断
FLASH中断分为两类,一类是操作结束,一类是错误中断,它们在寄存器中都有对应的事件标志和使能控制位。
F7的FLASH保护和F4是一样的。FLASH保护又分为读保护和写保护,写保护可以分别对各个扇区进行保护,防止因程序指针错乱而发生意外的写操作。FLASH选项寄存器中的nWRP位段包含了复位后扇区0-7的写保护选项字节值,通过对这些位执行写操作,可将新的写保护编程到FLASH。
对于FLASH的写保护,选项字控制寄存器中对应的位低电平表示写保护有效,当写保护有效的时候,不能对已经进行保护的扇区进行编程或者擦除操作,而且只要有一个扇区被写保护,芯片就不能执行全片擦除。
使能和除能写保护的操作过程是首先向选项字控制寄存器中的nWRPi位段写入需要的值,0表示使能写保护,1表示禁止写保护,之后置位FLASH选项字控制寄存器中的OPTSTRT位,等待BSY位清零之后对于FLASH写保护的配置就完成了。
FLASH的读保护分为三个级别
读保护Level 0就是没有读保护,选项字节中的RPD域应该是0xAA,这时候所有启动配置下,对闪存和备份SRAM的读操作都允许。
第二个级别是Level 1,当选项字节中的RPD域是非0xAA或者0xCC的值时是处于Level 1级别。在这个级别下,如果用户从用户闪存启动,这时候对闪存的访问是无限制的,如果是在调试的模式或者是SRAM或系统闪存启动时,对片上闪存是有访问限制的,不能读、编程和擦除,即使这时候nWRP为1也不行,但是可以通过SRAM运行代码修改选项字节来取消保护,也就是从Level 1降级到Level 0,硬件先对用户闪存和备份SRAM进行全部擦除,选项字节其他域不受影响。
最高级别的读保护是Level 2,在这个级别下,选项字节中的RDP域是0xCC,在这个级别,除了Level 1级别的保护,用户选项字节也不能再修改,也就是不能从Level 2降级到Level 1或Level 0,而且调试功能是被永久性禁止的,系统闪存启动也被禁止,不能通过bootloader修改选项字节。