GD32E505 Flash:
设备唯一ID(UNIQUE ID ,96bit,只能按字32位访问),基地址:0x1FFF_F7E8
闪存的前512K字节空间内,CPU执行指令需要0~4个等待时间。
闪存页大小为8KB,支持32位字/16位半字编程,页擦除和整片擦除。
2K字节 OTP块(一次性编程),用于存储用户数据。
16字节的选项字节,根据用户需求配置,当系统复位时,选项字节被加载到选项字节控制寄存器。
GD32E505_CL闪存基地址和构成:
闪存 名称 地址范围 大小 主闪存 Page0 0x0800_0000~0x0800_1FFF 8KB 主闪存 Page1 0x0800_2000~0x0800_3FFF 8KB 主闪存 ….. ….. 8KB 主闪存 Page63 0x0807_E000~0x0807_FFFF 8KB 信息块 CL 引导Bootloader 0x1FFF_B000~0x1FFF_F7FF 18KB 选项字节 选项字节 0x1FFF_F800~0x1FFF_F80F 16B 一次性编程 OTP 0x1FFF_7000~0x1FFF_77FF 2KB 选项字节说明 : 每次系统复位后,选项字节被重载到FMC_OBSTAT和FMC_WP寄存器后,选项字节生效。选项字节的补字节具体为选项字节取反。当选项字被重载时,如果选项字节的补字节和选项字节补匹配,FMC_OBSTAT的OBERR位将被置1,选项字节被强制设置为0xFF。若选项字节和其补字节同为0xFF,则OBERR位补置位。
地址 名称 说明 0x1FFF_F800 SPC 选项字节安全保护值,0xA5未保护,除0xA5和0xCC外的任何值:保护级别低,0xCC:保护级别高 0x1FFF_F801 SPC_N SPC补字节 0x1FFF_F802 USER [7:6] : BOR_TH ,BOR复位阈值
[5:3] : 保留
[2] : nRST_STDBY,0:设置待机模式时产生复位而不是进入待机模式。1:设置待机模式时进入待机模式而不产生复位。
[1] : nRST_DPSLP,0:设置深度睡眠模式时产生复位而不进入深度睡眠模式。1:设置深度睡眠模式时进入深度睡眠模式而不产生复位。
[0] : nWDG_HW, 0:硬件是能独立看门狗功能。1:软件使能独立看门狗功能。0x1FFF_F803 USER_N SPC补字节 0x1FFF_F804 DATA[7:0] 用户定义数据7到0位 0x1FFF_F805 DATA_N[7:0] DATA补字节的7到0位 0x1FFF_F806 DATA[15:8] 用户定义数据15到8位 0x1FFF_F807 DATA_N[15:8] DATA补字节的15到8位 0x1FFF_F808 WP[7:0] 页擦除/编程保护值的7到0位
[0] : 保护生效
[1] : 未保护0x1FFF_F809 WP_N[7:0] WP补字节的7到0位 0x1FFF_F80A WP[15:8] 页擦除/编程保护值的15到8位 0x1FFF_F80B WP_N[15:8] WP补字节的15到8位 0x1FFF_F80C WP[23:16] 页擦除/编程保护值的23到16位 0x1FFF_F80D WP_N[23:16] WP补字节的23到16位 0x1FFF_F80E WP[31:24] 页擦除/编程保护值的31到24位 0x1FFF_F80F WP_N[31:24] WP补字节的31到24位 安全防护:
未保护状态:当将SPC字节和它的补字节设置为0x5AA5,系统复位后闪存将处于非安全保护状态,主存储器和选项字节可以被所有操作模式访问。
保护等级低:当设置SPC字节为任何除0xA5或0xCC外的值,系统复位以后,低安全保护状态生效。需要注意的是,若修改过程中,MCU的调试模块依然和外部JTAG/SWD设备相连,需要用上电复位代替系统复位以使得修改后的保护状态生效。在低安全保护状态下,主存储闪存块仅能被用户代码访问且前8KB的闪存自动处于页擦除/编程保护状态下。在调试模式下,或从SRAM中启动时,以及从boot loader区启动时,这些模式下对主存储块的操作都被禁止。如果在这些模式下读主存储块,将产生总线错误。如果在这些模式下,对主存储块进行编程或擦除操作,FMC_STAT寄存器的WPERR位将被置1。但这些模式下都可以对选项字节进行操作,从而可以通过该方式失能安全保护功能。如果将SPC字节和它的补字节设置为0x5AA5,安全保护功能将失效,并自动触发一次整片擦除操作。
保护等级高:当设置SPC字节为0xCC,激活高安全保护等级。当编程选择该保护等级时,调试模式,从SRAM中启动,或者从boot loader启动都被禁止。主存储闪存块可由用户代码的所有操作进行访问。SPC字节禁止再次编程。所以,如果高保护等级被激活,将不能再降回到低保护等级或无保护等级。空芯片默认该值为0xFF?所以无法烧写程序??蛋疼的设计!!
例程分析
Examples/FMC中有三个例程;
- Erase_Program: 提供了fmc_erase_pages和fmc_program的操作例程。
- Security_protection: 设置Security和解unSecurity。
- Write_Protection: 设置写保护,参考意义不大。
基于以上这三个例程,基本上对flash的操作就不是事了。