分享 GD32F103 FLASH 操作 无则加勉,有则改之

[复制链接]
2513|7
 楼主 | 2015-10-4 14:53 | 显示全部楼层 |阅读模式
/************************************************************************************************
        头文件
************************************************************************************************/
#include "HardWareFLASH.h"
#include "HardWareCLOCK.H"
#include "string.h"
/************************************************************************************************
        芯片型号  GD32F103RGT6   FLASH存储大端模式
        库:STM32F10X V3.5.0
        可用于IAP
************************************************************************************************/  
#define DEBUG_FLASHCHECK    1   // 异或校验 ,加快速度可不校验

#define Page1Size          2048
#define Page2Size          4096

#define Bank1StartAddr     0x08000000
#define Bank2StartAddr     (0x08000000 + 512 * 1024)
       
#define Bank1PageNum       256 //页数 0~255   一页 2k  ,2*256 = 512K
#define Bank2PageNum       128 //页数 0~127   一页 4K , 4*128 = 512k

/************************************************************************************************
        擦除 FLASH   
************************************************************************************************/
void Flash_BankErase1Page(u32 Addr32)
{       
        FLASH_ClearFlag(FLASH_FLAG_BSY);
        FLASH_ClearFlag(FLASH_FLAG_EOP);
        FLASH_ClearFlag(FLASH_FLAG_PGERR);
        FLASH_ClearFlag(FLASH_FLAG_WRPRTERR);
        FLASH_ErasePage(Addr32);
}
/************************************************************************************************
        写 FLASH   2字节  
************************************************************************************************/
void Flash_Write16(u32 Addr32,u16 Buf16)
{
        u16 H16 ,L16;
        u16 Data16;
        H16 = ( Buf16 >> 8 ) & 0x00ff;
        L16 = ( Buf16 << 8 ) & 0xff00;
        Data16 = H16 | L16;
        FLASH_ProgramHalfWord(Addr32, Data16);
}
/************************************************************************************************
        读 FLASH  2字节  
************************************************************************************************/
u16 Flash_Read16(u32 Addr32)
{
        u16 Data16 , H16 , L16;
        Data16 = *(vu16*) Addr32;
        H16 = ( Data16 << 8 )  & 0xff00;
        L16 = ( Data16 >> 8 )  & 0x00ff ;
        Data16 = H16 | L16;
        return Data16;
}
/************************************************************************************************
        擦除 FLASH    2K  一页
************************************************************************************************/
u8 Flash_Bank1Erase1Page(u16 Page)
{
        if (Page >= Bank1PageNum)
    return 0;
        Flash_BankErase1Page(Bank1StartAddr + Page*Page1Size);
        return 1;
}
/************************************************************************************************
        写 FLASH    2K  一页
************************************************************************************************/
u8 Flash_Bank1Write1Page(u16 Page, u8 *ArrayBuf )
{
  u32 PageAddr32;
        u8  Check1,Check2;
        u16 i , H16 , L16 , Data16;
  if (Page >= Bank1PageNum)
    return 0;
#if DEBUG_FLASHCHECK
        Check1 = CheckNOR(ArrayBuf , Page1Size);
#endif
  PageAddr32  = Bank1StartAddr + Page * Page1Size;
        for(i = 0;i < Page1Size/2 ; i++)
        {
                H16 = *(ArrayBuf + 2*i) ;  
                L16 = *(ArrayBuf + 2*i + 1);
                H16 = H16 << 8;
                Data16 = H16 | L16;
                Flash_Write16(PageAddr32 + 2*i , Data16);
        }
#if DEBUG_FLASHCHECK
        memset(ArrayBuf,0,Page1Size);
        Flash_Bank1Read1Page(Page,ArrayBuf);
        Check2 = CheckNOR(ArrayBuf , Page1Size);
        if ( Check1 == Check2 )
                return 1;
        return 0;
#else
  return 1;
#endif
}
/************************************************************************************************
        读 FLASH   2K  一页
************************************************************************************************/
u8 Flash_Bank1Read1Page(u16 Page,u8 *ArrayBuf)
{
        u16 i , Data16;
  u32 PageAddr32;
  if (Page >= Bank1PageNum)
    return 0;
  PageAddr32  = Bank1StartAddr + Page * Page1Size;
        for(i = 0;i < Page1Size/2 ; i++)
        {
                Data16 = Flash_Read16(PageAddr32  + 2*i);
                *(ArrayBuf + 2*i)                 =  Data16 >> 8 ;
                *(ArrayBuf + 2*i +1)  =  Data16 ;   
        }
  return 1;
}
/************************************************************************************************
        擦除 FLASH    4K  一页
************************************************************************************************/
u8 Flash_Bank2Erase1Page(u16 Page)
{
        if (Page >= Bank2PageNum)
    return 0;
        Flash_BankErase1Page(Bank2StartAddr + Page*Page2Size);
        return 1;      
}
/***********************************************************************************************
        写 FLASH    4K  一页  
************************************************************************************************/
u8 Flash_Bank2Write1Page(u16 Page, u8 *ArrayBuf )
{
        u32 PageAddr32;
        u8  Check1,Check2;
        u16 i , H16 , L16 , Data16;
  if (Page >= Bank2PageNum)
    return 0;
#if DEBUG_FLASHCHECK
  Check1 = CheckNOR(ArrayBuf , Page2Size);
#endif
  PageAddr32 = Bank2StartAddr + Page * Page2Size;
        for(i = 0;i < Page2Size/2;i++)
        {
                H16 = *(ArrayBuf + 2*i) ;  
                L16 = *(ArrayBuf + 2*i + 1);
                H16 = H16 << 8;
                Data16 = H16 | L16;
                Flash_Write16(PageAddr32 + 2*i , Data16);
        }
#if DEBUG_FLASHCHECK
        memset(ArrayBuf,0,Page2Size);
        Flash_Bank2Read1Page(Page,ArrayBuf);
        Check2 = CheckNOR(ArrayBuf , Page2Size);
        if ( Check1 == Check2 )
                return 1;
        return 0;
#else
  return 1;
#endif
}
/************************************************************************************************
        读 FLASH   4K  一页
************************************************************************************************/
u8 Flash_Bank2Read1Page(u16 Page,u8 *ArrayBuf)
{
        u16 i , Data16;
        u32 PageAddr32;
        if (Page >= Bank2PageNum)
                return 0;
        PageAddr32  = Bank2StartAddr + Page * Page2Size;
        for(i = 0;i < Page2Size/2;i++)
        {
                        Data16 = Flash_Read16(PageAddr32  + 2*i);
                        *(ArrayBuf + 2*i)                 = Data16>>8 ;
                        *(ArrayBuf + 2*i + 1) = Data16;
        }
        return 1;
}
/************************************************************************************************/
| 2015-10-7 16:45 | 显示全部楼层
这个读与写都是按照双字节进行操作的。

使用特权

评论回复
| 2015-10-7 16:46 | 显示全部楼层
楼主分享的这个读写操作很详细的。

使用特权

评论回复
| 2015-10-8 17:10 | 显示全部楼层
用的GD自己的库么?收藏下,改天跑跑例程看。

使用特权

评论回复
| 2018-9-11 17:13 | 显示全部楼层
非常有用,大佬大佬

使用特权

评论回复
| 2018-9-11 17:14 | 显示全部楼层
非常有用,大佬大佬

使用特权

评论回复
| 2019-7-4 23:32 | 显示全部楼层
官方的完整代码不知道去哪儿下

使用特权

评论回复
| 2019-7-5 09:08 | 显示全部楼层
台湾雅特力完美替代STM32/GD32系列芯片,有资料分享哟

使用特权

评论回复
扫描二维码,随时随地手机跟帖
*滑动验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表