本帖最后由 聚沃科技 于 2024-6-4 11:02 编辑
5.1 实验内容 通过本实验主要学习以下内容: • FMC控制器原理; • FMC擦写读操作; 5.2 实验原理 5.2.1 FMC控制器原理 FMC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32F303系列MCU中,Flash前256K字节空间内, CPU执行指令零等待,具有相同主频下最快的代码执行效率。FMC也提供了页擦除,整片擦除,以及32位整字/16位半字/位编程等闪存操作。GD32F303系列MCU支持最大3M Flash空间,可以提供业内最大Flash的相关产品。 GD32F303系列MCU的Flash结构如下图所示。由该图可知,GD32F303系列MCU可以支持最大3M的Flash空间,前256页为2KB每页,共512KB空间,后面的空间为4KB每页,信息块为存储内部出厂BOOTLOADER,中容量的GD32F303系列产品空间为2KB,大容量的GD32F303系列产品空间为6KB,互联型的GD32F305/307系列产品空间为18KB,主要是由于不同的产品所支持的ISP烧录接口不同,所需要的代码空间也会有差别。可选字节块存储的是选项字节,其空间大小为16个字节,地址范围为0x1FFFF800-0x1FFFF80F,本章主要讲解FMC的操作,有关选项字节操作可以参考选项字节操作实验。
有关Flash擦写操作均需要先解锁Flash,然后进行擦写操作,擦写完成后再进行锁Flash,注意Flash特性只能由1写0,也就是Flash需要先擦除才能写入新的数据,如果确保写入地址的数据为全0xFF,也可以直接写入。读取Flash数据可以采取直接寻址的方式进行读取。 |
下面为各位读者介绍Flash擦写读的相关操作。 5.2.2 Flash擦除操作原理 Flash擦除可分为页擦除以及整片擦除,如下图所示,页擦除时间典型值为48ms,256KB Flash的块擦除时间典型值为2S。 有关Flash的相关操作均在gd32f30x_fmc.c中实现,下面介绍下擦除实现的函数,如下表所示。 5.2.3 Flash写入编程操作原理 GD32F303系列MCU可支持32位整字编程/16位板字以及位编程,如下图所示,Flash 32位整字编程时间典型值为47.5us。 有关Flash编程实现函数如下表所示。 • 注意:fmc_word_reprogram可以在不用擦除的情况下直接进行位编程,但仅可实现将1编程为0,比如若调用以上fmc_word_reprogram(0x08001000,0xFE)语句,即实现将最低位编程为0,若0x08001000原始数据为0x81,则执行完后改地址数据为0x80。 |
5.2.4 Flash读取操作原理 Flash读取可以采用直接寻址的方式进行操作,具体可参考以下示例代码。 - C
- uint32_t read_data;
- read_data = *(uint32_t *)0x08001000;
• 注意:有关Flash有以下参数读者需要了解,GD32F303系列MCU的内部Flash具有至少10万次的擦写次数以及20年的数据保持能力,但需注意,随着擦写次数的增加数据保持时间会下降。 |
5.3 硬件设计 本例程不涉及硬件电路。 5.4 代码解析 5.4.1 Flash写入16bit双字节函数 Flash写入双字节操作函数如下所示,写入的过程主要分为擦写两个操作,由于Flash特有特性,需要先擦除才可以写入,因而需要确保写入地址的初识数据为0xFF。另外GD32F303具有双bank,且不同bank的页大小具有差异,本函数可以实现根据地址识别对应页并进行擦除的功能,使用上非常方便,使用者只需要关心擦写的起始地址以及数据和长度即可,擦写的位置函数中会进行实现。
|