GD32F103C读写flash

本文介绍了如何在GD32F10x微控制器中使用FMC闪存管理库进行页面擦除和数据编程,包括解锁、清除标志、擦除操作和锁定过程。核心内容涉及`fmc_erase_page`和`fmc_program`函数的实现及其在`params_manage.c`中的应用。
摘要由CSDN通过智能技术生成

程序需要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);
}

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值