#include "gd32f10x.h" #include "fmc.h" /*-------------------------------------------------*/ /*函数名:擦除FLASH 一个扇区1KB,共3*1024个扇区 */ /*参 数:start:擦除起始页 num:擦几个页 */ /*返回值:无 */ /* flash结构: 0x08000000~0x0807FFFF bank0(2KB一页,0~255页,共256页)共512KB 0x08080000~0x082FFFFF bank1(4KB一页,256~895页,共640页)共2.5MB */ /*-------------------------------------------------*/ void GD32_EraseFlash(uint16_t start, uint16_t num) { uint16_t i; //用于for循环 uint16_t j = 0; fmc_unlock(); //解锁 if ((start < 256) && ((start + num) < 256)) { for(i = 0; i < num; i++) //循环num次,一个页一个页的擦除 { fmc_page_erase((0x08000000 + start * 2048) + (2048 * i)); //擦除bank0一个页2KB } } else if ((start < 256) && ((start + num) > 256)) { for(i = 0; i < num; i++) //循环num次,一个页一个页的擦除 { if((start + i) < 256) { fmc_page_erase((0x08000000 + start * 2 * 1024) + (2 * 1024 * i)); //擦除bank0一个页2KB } else { fmc_page_erase(0x08080000 + (4 * 1024 * j)); //擦除bank1一个页4KB j++; } } } else if (start > 256) { for(i = 0; i < num; i++) //循环num次,一个页一个页的擦除 { fmc_page_erase((0x08080000 + (start - 256) * 4 * 1024) + (4 * 1024 * i)); //擦除bank1一个页4KB } } fmc_lock(); //上锁 } /*---------------------------------------------------------------------*/ /*函数名:写入FLASH */ /*参 数:saddr:写入地址 wdata:写入数据指针 wnum:写入多少个字节 */ /*返回值:无 */ /*---------------------------------------------------------------------*/ void GD32_WriteFlash(uint32_t saddr, uint32_t *wdata, uint32_t wnum) { fmc_unlock(); //解锁 while(wnum){ //循环写入,知道num等于0退出while,表示写入完毕 fmc_word_program(saddr,*wdata); //写入一个字(4个字节) wnum-=4; //写入字节数量-4 saddr+=4; //写入地址+4 wdata++; //写入数据的指针,往后挪动一次 } fmc_lock(); //上锁 }