程序需要GD32库,用到了 "gd32f10x.h"、"gd32f10x_fmc.h"
params_manage.h
#ifndef __PARAMS_MANAGE_H__
#define __PARAMS_MANAGE_H__
#include "gd32f10x.h"
#define FMC_WRITE_START_ADDR ((uint32_t)0x08000D00)
#define FMC_WRITE_END_ADDR ((uint32_t)0x080FFFFF)
void fmc_erase_page(void);
void fmc_program(uint32_t* str, uint8_t len);
#endif
params_manage.c
#include
#include
#include "params_manage.h"
void fmc_erase_page(void)
{
fmc_unlock(); //fmc解锁
/* clear all pending flags */
fmc_flag_clear(FMC_FLAG_BANK0_END);
fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
/* erase the flash pages */
fmc_page_erase(FMC_WRITE_START_ADDR);
/* clear all pending flags */
fmc_flag_clear(FMC_FLAG_BANK0_END);
fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
fmc_lock(); //fmc上锁
}
void fmc_write(uint32_t* str, uint8_t len)
{
/* unlock the flash program/erase controller */
fmc_unlock();
uint32_t address = FMC_WRITE_START_ADDR;
uint8_t i = 0;
/* program flash */
while(address < FMC_WRITE_END_ADDR && i < len){
fmc_word_program(address, str[i]);
address += 4;
i++;
fmc_flag_clear(FMC_FLAG_BANK0_END);
fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
}
fmc_word_program(address, '\0');
address += 4;
i++;
fmc_flag_clear(FMC_FLAG_BANK0_END);
fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
/* lock the main FMC after the program operation */
fmc_lock();
}
void fmc_program(uint32_t* str, uint8_t len)
{
/* unlock the flash program/erase controller */
fmc_unlock();
uint32_t address = FMC_WRITE_START_ADDR;
uint8_t i = 0;
/* program flash */
while(address < FMC_WRITE_END_ADDR && i < len){
fmc_word_program(address, str[i]);
address += 4;
i++;
fmc_flag_clear(FMC_FLAG_BANK0_END);
fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
}
fmc_word_program(address, '\0');
address += 4;
i++;
fmc_flag_clear(FMC_FLAG_BANK0_END);
fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
/* lock the main FMC after the program operation */
fmc_lock();
}
调用
int main(void)
{
//写Flash
fmc_erase_page();
char str[32]="ss";
fmc_program((uint32_t*)str, strlen(str));
//读Flash
char str2[32]={0};
unsigned char *ptr = (unsigned char *)FMC_WRITE_START_ADDR;
memcpy(str2, ptr, sizeof(str2));
int i = strlen(str2);
}