1.0 主要特征
高达3M字节的片上闪存可用于存储指令或数据;
在闪存的前256K字节空间内, CPU执行指令零等待, 在此范围外, CPU读取指令存在较
长延时;
对于GD32F30x_CL和GD32F30x_XD,使用了两片闪存, 前512KB容量在第一片闪存
(bank0)中,后续的容量在第二片闪存( bank1)中;
对于主存储闪存容量不多于512KB的GD32F30x_CL和GD32F30x_HD,只使用了bank0。
对于GD32F30x_CL和GD32F30x_HD, GD32F30x_XD, bank0的闪存页大小为2KB,
bank1的闪存页大小为4KB;
支持32位整字/16位半字/位编程,页擦除和整片擦除操作;
大小为16字节的可选字节块可根据用户需求配置;
每次系统复位后选项字节中的内容将重新加载到选项字节控制寄存器中;
具有安全保护状态,可阻止对代码或数据的非法读访问;
具有擦除和编程保护状态,可阻止意外写操作。
闪存的前256k字节空间内,CPU执行指令0等待,超过256k字节CPU的执行效率会低一点
flash的起始地址
flash的起始地址不是从0这个地址开始的而是从800 000 这个地址开始的?
flash读操作
闪存可以像普通存储空间一样直接寻址访问。对闪存取指令和取数据分别使用CPU的IBUS或DBUS总线。
flash读操作
FMC_CTLx 寄存器解锁
复位后, FMC_CTL0寄存器进入锁定状态, LK位置为1。通过先后向FMC_KEY0寄存器写入0x45670123和0xCDEF89AB,可以使得FMC_CTL0寄存器解锁。两次写操作后, FMC_CTL0寄存器的LK位被硬件清0。可以通过软件设置FMC_CTL0寄存器的LK位为1再次锁定FMC_CTL0寄存器。任何对FMC_KEY0寄存器的错误操作都会将LK位置1,从而锁定FMC_CTL0寄存器,并引发一个总线错误。
FMC_CTL0寄存器的OBPG位和OBER位在FMC_CTL0寄存器第一层解锁后,仍然需要第二层解锁。第二层解锁过程也是两次写操作,向FMC_OBKEY寄存器先后写入0x45670123和0xCDEF89AB,然后硬件将FMC_CTL0寄存器的OBWEN位置1。软件可以将FMC_CTL0的OBWEN位清0来锁定FMC_CTL0的OBPG位和OBER位。
对于GD32F30x_CL和GD32F30x_XD, FMC_CTL0寄存器用来设置对bank0和选项字节块的操作, FMC_CTL1寄存器用来设置对bank1的擦写操作。 FMC_CTL1的解锁和锁定机制和FMC_CTL0类似。对FMC_KEY1写解锁序列可解除FMC_CTL1的锁定。
flash 页擦除
FMC的页擦除功能使得主存储闪存的页内容初始化为高电平。 每一页都可以被独立擦除,而不影响其他页内容。 FMC擦除页步骤如下:
1. 确保FMC_CTLx寄存器不处于锁定状态;
2. 检查FMC_STATx寄存器的BUSY位来判定闪存是否正处于擦写访问状态,若BUSY位为1,
则需等待该操作结束, BUSY位变为0;
3. 置位FMC_CTLx寄存器的PER位;
4. 将待擦除页的绝对地址(0x08XX XXXX)写到FMC_ADDRx寄存器;
5. 通过将FMC_CTLx寄存器的START位置1来发送页擦除命令到FMC;
6. 等待擦除指令执行完毕, FMC_STATx寄存器的BUSY位清0;
7. 如果需要,使用DBUS读并验证该页是否擦除成功。
当页擦除成功执行, FMC_STATx寄存器的ENDF位将置位。若FMC_CTLx寄存器的ENDIE位被置1,则FMC将触发一个中断。需要注意的是,用户需确保写入的是正确的擦除地址, 否则当待擦除页的地址被用来取指令或访问数据时,软件将会跑飞。该情况下, FMC不会提供任何出错通知。另一方面,对擦写保护的页进行擦除操作将无效。如果FMC_CTLx寄存器的ERRIE位被置位,该操作将触发操作出错中断。中断服务程序可通过检测FMC_STATx寄存器的WPERR位来判断该中断是否发生。 图2-1. 页擦除操作流程显示了页擦除操作流程。
2.0 写入数据
1. 确保FMC_CTLx寄存器不处于锁定状态;
2. 等待FMC_STATx寄存器的BUSY位变为0;
3. 置位FMC_CTLx寄存器的PG位;
4. DBUS写一个32位整字/16位半字到目的绝对地址(0x08XX XXXX)使用指针的方式写入数据
5. 等待编程指令执行完毕, FMC_STATx寄存器的BUSY位清0;
6. 如果需要,使用DBUS读并验证是否编程成功。
3.0 安全保护
FMC提供了一个安全保护功能来阻止非法读取闪存。此功能可以很好地保护软件和固件免受非法的用户操作。
未保护状态:当将SPC字节和它的补字节被设置为0x5AA5,系统复位以后,闪存将处于非安全保护状态。主存储块和可选字节块可以被所有操作模式访问。
已保护状态:当设置SPC字节和它的补字节值为任何除0x5AA5外的值,系统复位以后,安全保护状态生效。需要注意的是,若该修改过程中, MCU的调试模块依然和外部JTAG/SWD设备相连,需要用上电复位代替系统复位以使得修改后的保护状态生效。在安全保护状态下,主存储闪存块仅能被用户代码访问且前4KB的闪存自动处于页擦除/编程保护状态下。在调试模式下,或从SRAM中启动时,以及从boot loader区启动时,这些模式下对主存储块的操作都被禁止。如果在这些模式下读主存储块,将产生总线错误。如果在这些模式下,对主存储块进行编程或擦除操作, FMC_STAT寄存器的WPERR位将被置1。但这些模式下都可以对可选字节块进行操作,从而可以通过该方式失能安全保护功能。如果将SPC字节和它的补字节设置为0x5AA5,安全保护功能将失效,并自动触发一次整片擦除操作。
4.0 内部 flash驱动实现
...