GD32F303 往FLASH写入数据失败的问题

 最近项目中有一个需求,需要将数据写入GD32F303的FLASH中保存,由于之前是使用的STM32F301,而其同系列产品STM32F303是可以和GD32F303 Pin to Pin的,所以就根据GD提供的库直接将代码移植了过来。

 为了不影响程序的下载,将数据存在MCU FLASH的最后几页中。根据GD的参考手册,GD32F303CC拥有512K的FLASH,每一页有2KB,共256页,地址从0x0800 0000 - 0x0808 0FFF。于是选择了最后4页来存放数据,即地址从0x0807 E000 -0x0808 0FFF。

 代码编译成功后,进行仿真,打开内存窗口查看指定地址0x0807 E000,发现数据仍是默认的FF,并未写入成功。
在这里插入图片描述

 但是程序编译并未出问题,也可正常运行,于是又回头查看芯片的参考手册,发现了之前没有注意到的一句话:
在这里插入图片描述

 即在前256K的字节内,CPU执行指令没有延迟,但是超出这个范围后,当CPU抓取指令时就会有一个较长的延迟。这时,我又查看了Keil的target option的IROM定义和工程的Memory map:
在这里插入图片描述
在这里插入图片描述

 发现这两处的IROM大小为0x40000,转换后也就是256K,也就是说,虽然该芯片有512K的FLASH,但是默认是只用前256K的,或许就是因此,往后面几页地址写入数据就失败了。于是修改了数据的存放地址为0x0803 E000-0x080 40000,也就是前256K字节的末尾几页,之后再次进行烧写调试,结果成功写入:
在这里插入图片描述

 可以看到,从0x0803 E000开始的一片地址被成功写入了0 (字节数刚好等于我写入的数据字节大小)