打印

求GD32F103的片内Flash模拟EEPROM程序

[复制链接]
1661|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mcuatmel|  楼主 | 2021-1-6 22:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
需要存些参数,所以想用片内Flash存,不知怎么操作,求版主或用过的人给指点!

使用特权

评论回复
沙发
zeshoufx| | 2021-1-7 08:49 | 只看该作者
#include "fmc.h" 

  
#define GD32_FLASH_BASE     0x08000000   
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;   
#define FMC_PAGE_SIZE                ((u16)0x800)   
   
vu32 zNbrOfPage = 0x00;   
u32 Address = 0x00 ,wrp = 0,wrp2 = 0;   
volatile fmc_state_enum zFMCStatus = FMC_READY;   
volatile TestStatus zMemoryProgramStatus = PASSED;   
u32*ptrd;   
__IO TestStatus zTransferStatus = FAILED;   
   
   
   
u32 GDFLASH_ReadWord(u32 faddr)   
{   
    return *(vu32*)faddr;   
}     
   
u8 GDFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)   
{   
//    uint32_t addrx=0;   
    uint32_t endaddr=0;   
//    uint32_t i;   
    fmc_unlock();   
//    addrx=WriteAddr;   
    endaddr=WriteAddr+NumToWrite*4;
       
    fmc_flag_clear(FMC_FLAG_BANK0_END);
    fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
    fmc_flag_clear(FMC_FLAG_BANK0_PGERR);   
       
    while(WriteAddr<endaddr)   
    {   
        zFMCStatus = fmc_word_program(WriteAddr,*pBuffer);  
               
        fmc_flag_clear(FMC_FLAG_BANK0_END);
                fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
                fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
               
        WriteAddr+=4;   
        pBuffer++;   
    }   
    fmc_lock();   
    return zFMCStatus;   
}   
   
u8 GDFMC_ErasePage(u32 PageAddr)   
{   
//    uint8_t i;   
    zTransferStatus = PASSED;   
    fmc_unlock();   
       
    fmc_flag_clear(FMC_FLAG_BANK0_END);
    fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
    fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
       
    zFMCStatus=fmc_page_erase(PageAddr);//GD32_FLASH_BASE + (FMC_PAGE_SIZE * PageAddr));   
       
    fmc_flag_clear(FMC_FLAG_BANK0_END);
    fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
    fmc_flag_clear(FMC_FLAG_BANK0_PGERR);   
       
    fmc_lock();   
   
    return zFMCStatus;   
}   
   
void GDFLASH_Read(u32 ReadAddr,u32 *pBuffer,u32 NumToRead)         
{   
    u32 i;   
    for(i=0;i<NumToRead;i++)   
    {   
        pBuffer[i]=GDFLASH_ReadWord(ReadAddr);   
        ReadAddr+=4;   
    }   
}   
   
仅供参考

使用特权

评论回复
板凳
mcuatmel|  楼主 | 2021-1-7 11:54 | 只看该作者
谢楼上!

使用特权

评论回复
地板
mcuatmel|  楼主 | 2021-1-7 13:07 | 只看该作者
请问zeshoufx,GD32F103的Flashd页是1K页还是2K页?我看资料好像是1K页,所以你那个页大小参数是不是应该是0x400?

使用特权

评论回复
5
zeshoufx| | 2021-1-7 13:59 | 只看该作者
mcuatmel 发表于 2021-1-7 13:07
请问zeshoufx,GD32F103的Flashd页是1K页还是2K页?我看资料好像是1K页,所以你那个页大小参数是不是应该是 ...

我的是303rc,,,,参考修改

使用特权

评论回复
6
mcuatmel|  楼主 | 2021-1-7 15:27 | 只看该作者
哦,明白,谢谢!目前可以用了。

使用特权

评论回复
7
随风而去吧| | 2021-1-7 20:31 | 只看该作者
很棒棒哦,值得学习

使用特权

评论回复
8
zfazhan| | 2021-1-7 21:03 | 只看该作者
楼主是用在什么地方的,有没有用到中断呢? FMC操作过程中会存在中断不响应的情况,具体要看对项目有么有影响。

使用特权

评论回复
9
想学MCU| | 2021-1-12 22:54 | 只看该作者
请问zeshoufx大佬,FMC是不是写入之前也需要判断是否是0xFFFFFFFF,不是应该擦除再写入

使用特权

评论回复
10
wsdmzz| | 2022-8-25 15:37 | 只看该作者

GD32F103RCT6  移植发现写入不了   求教

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

512

主题

1456

帖子

2

粉丝