GD32F103C读写flash

程序需要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 <stdio.h>
#include <string.h>
#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);
}

猜你喜欢

转载自blog.csdn.net/zouxin_88/article/details/124912624