GD32F303固件库开发(17)----内部Flash读写
概述
本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是GD32F303ZET6主控,512K大小的Flash。 最近在弄ST和GD的课程,需要GD样片的可以加群申请:6_15061293 。
csdn课程
课程更加详细。 https://download.csdn.net/course/detail/37144
样品申请
https://www.wjx.top/vm/wFGhGPF.aspx#
生成例程
这里准备了自己绘制的开发板进行验证。

系统架构示意图
Flash的操作可以通过FMC控制器进行操作。

FLASH分配
要注意的是,将数据存在flash不同的地方,速度可能不一样。 在闪存的前256K字节空间内,CPU执行指令零等待,在此范围外,CPU读取指令存在较长延时。 同时FLASH有2大块,对于GD32F30x_CL和GD32F30x_XD,使用了两片闪存,前512KB容量在第一片闪存(bank0)中,后续的容量在第二片闪存(bank1)中;


操作流程
如果要对FLASH进行写入数据,需要执行以下四步:
解锁FLASH
擦除FLASH
写入FLASH
锁住FLASH

FMC_CTLx 寄存器解锁
首先第一步是确保FMC_CTLx寄存器不处于锁定状态。

解锁用fmc_unlock()函数,UNLOCK_KEY0和UNLOCK_KEY1分别是0x45670123和0xCDEF89AB,向FMC_KEY0分别写入着2个参数。


对于第二层解锁,需要使用ob_unlock()函数,向FMC_OBKEY写入UNLOCK_KEY0和UNLOCK_KEY1。 同时通过软件将FMC_CTL0的OBWEN位清0来锁定FMC_CTL0的OBPG位和OBER位。

解锁代码。
页擦除
第二步进行页擦除。


其中第一步确保FMC_CTLx寄存器不处于锁定状态已在上面解锁了,所以直接进行第二步,检查FMC_STATx寄存器的BUSY位来判定闪存是否正处于擦写访问状态,若BUSY位为1,则需等待该操作结束,BUSY位变为0; 对于擦除函数,使用fmc_page_erase();

对于if(FMC_BANK0_SIZE < FMC_SIZE)

FMC_BANK0_SIZE 和 FMC_SIZE 是两个定义的常量,它们表示 FMC 控制器的两个不同的地址空间。FMC_BANK0_SIZE 指的是 FMC 控制器的 BANK0 地址空间的大小,而 FMC_SIZE 则指的是整个 FMC 控制器的地址空间的大小。因此,如果 FMC_BANK0_SIZE 小于 FMC_SIZE,则说明 FMC 控制器的 BANK0 地址空间不能完全覆盖整个 FMC 控制器的地址空间,此时可能需要使用其他的地址空间来存储数据。
上述说到的检查FMC_STATx寄存器的BUSY位,使用fmc_bank0_ready_wait()函数。

对于以下几个步骤 3. 置位FMC_CTLx寄存器的PER位; 4. 将待擦除页的绝对地址(0x08XX XXXX)写到FMC_ADDRx寄存器; 5. 通过将FMC_CTLx寄存器的START位置1来发送页擦除命令到FMC; 6. 等待擦除指令执行完毕,FMC_STATx寄存器的BUSY位清0;
在fmc_page_erase()都有对应操作。

写数据
解锁和擦除之后,就可以对flash进行写数据的操作。

其中第一步确保FMC_CTLx寄存器不处于锁定状态已在上面解锁了,所以直接进行第二步,检查FMC_STATx寄存器的BUSY位来判定闪存是否正处于擦写访问状态,若BUSY位为1,则需等待该操作结束,BUSY位变为0; 对于写函数,使用fmc_word_program();

解锁FMC_CTL0寄存器的可选字节操作位和等待FMC_CTL0寄存器的OBWEN位置1在解锁时候已经操作了,故进入第五步。

读数据

对于读数据,可以直接访问地址进行读取。
上锁
上锁可以使用fmc_lock()函数。

当上锁时,对控制寄存器 0 (FMC_CTL0)的第7位写1。


变量定义
如果要对FLASH进行写入数据,需要执行以下四步:
解锁FLASH
擦除FLASH
写入FLASH
锁住FLASH
擦除只能是按页或者整块擦除。 GD32F103ZET6的Flash容量是512KB,所以只有255页,每页2KB。 我们可以写入到页255中,即0x0807F800-0x0807FFFF中。 由于单片机是32位,故连续写入多个uint32_t的数据时,地址应该依次增加4。
主程序
演示效果
可以看见,对于高容量,页的大小位2k,故写入addr1时候,addr的数据就被擦除了。
