.c部分

#include "gd32_flash.h"
#if GD32_FLASH_WREN //如果使能了写
static uint16_t GDFLASH_BUF [ GD_SECTOR_SIZE / 2 ];//最多是2K字节
#endif/*** 函数功能: 读取指定地址的半字(16位数据)* 输入参数: faddr:读地址(此地址必须为2的倍数!!)* 返 回 值: 返回值:对应数据.* 说    明:无*/
uint16_t GDFLASH_ReadHalfWord (uint32_t faddr)
{return *(__IO uint16_t*)faddr;
}#if GD32_FLASH_WREN    //如果使能了写
/*** 函数功能: 不检查的写入* 输入参数: WriteAddr:起始地址*           pBuffer:数据指针*           NumToWrite:半字(16位)数* 返 回 值: 无* 说    明:无*/
void GDFLASH_Write_NoCheck ( uint32_t WriteAddr, uint16_t * pBuffer, uint16_t NumToWrite )
{                    uint16_t i;    fmc_unlock();//解锁for(i=0;i<NumToWrite;i++){fmc_halfword_program(WriteAddr,pBuffer[i]);WriteAddr+=2;                                    //地址增加2.}  fmc_lock();//上锁
} /*** 函数功能: 从指定地址开始写入指定长度的数据* 输入参数: WriteAddr:起始地址(此地址必须为2的倍数!!)*           pBuffer:数据指针*           NumToWrite:半字(16位)数(就是要写入的16位数据的个数.)* 返 回 值: 无* 说    明:无*/
void GDFLASH_Write ( uint32_t WriteAddr, uint16_t * pBuffer, uint16_t NumToWrite )
{uint16_t secoff;      //扇区内偏移地址(16位字计算)uint16_t secremain; //扇区内剩余地址(16位字计算)      uint16_t i;    uint32_t secpos;     //扇区地址uint32_t offaddr;   //去掉0X08000000后的地址if(WriteAddr<FLASH_BASE||(WriteAddr>=(FLASH_BASE+1024*GD32_FLASH_SIZE)))return;//非法地址fmc_unlock();                       //解锁offaddr   = WriteAddr-FLASH_BASE;          //实际偏移地址.secpos    = offaddr/GD_SECTOR_SIZE;           //扇区地址  0~127 for GD32F103CBT6secoff    = (offaddr%GD_SECTOR_SIZE)/2;  //在扇区内的偏移(2个字节为基本单位.)secremain = GD_SECTOR_SIZE/2-secoff;      //扇区剩余空间大小   if(NumToWrite<=secremain)secremain=NumToWrite;//不大于该扇区范围while(1) {    //读取整个扇区数据GDFLASH_Read(secpos*GD_SECTOR_SIZE+FLASH_BASE,GDFLASH_BUF,GD_SECTOR_SIZE/2);for(i=0;i<secremain;i++)//校验数据{if(GDFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除       }if(i<secremain)//需要擦除{//擦除这个扇区fmc_page_erase(secpos);for(i=0;i<secremain;i++)//复制{GDFLASH_BUF[i+secoff]=pBuffer[i];     }GDFLASH_Write_NoCheck(secpos*GD_SECTOR_SIZE+FLASH_BASE,GDFLASH_BUF,GD_SECTOR_SIZE/2);//写入整个扇区  }else{GDFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间.                  }if(NumToWrite==secremain)break;//写入结束了else//写入未结束{secpos++;             //扇区地址增1secoff=0;              //偏移位置为0     pBuffer+=secremain;      //指针偏移WriteAddr+=secremain;   //写地址偏移    NumToWrite-=secremain;  //字节(16位)数递减if(NumToWrite>(GD_SECTOR_SIZE/2))secremain=GD_SECTOR_SIZE/2;//下一个扇区还是写不完else secremain=NumToWrite;//下一个扇区可以写完了}     }; fmc_lock();//上锁
}
#endif/*** 函数功能: 从指定地址开始读出指定长度的数据* 输入参数: ReadAddr:起始地址*           pBuffer:数据指针*           NumToRead:半字(16位)数* 返 回 值: 无* 说    明:无*/
void GDFLASH_Read( uint32_t ReadAddr, uint16_t *pBuffer, uint16_t NumToRead )
{uint16_t i;for(i=0;i<NumToRead;i++){pBuffer[i]=GDFLASH_ReadHalfWord(ReadAddr);//读取2个字节.ReadAddr+=2;//偏移2个字节.  }
}

.h部分

#ifndef _GD32_FLASH_H_
#define _GD32_FLASH_H_#define GD32_FLASH_SIZE        128  // 所选STM32的FLASH容量大小(单位为K)
#define GD32_FLASH_WREN        1    // stm32芯片内容FLASH 写入使能(0,禁用;1,使能)#if GD32_FLASH_SIZE < 256#define GD_SECTOR_SIZE  1024 //字节
#else #define GD_SECTOR_SIZE     2048
#endifuint16_t GDFLASH_ReadHalfWord(uint32_t faddr);          //读出半字
void GDFLASH_Write_NoCheck ( uint32_t WriteAddr, uint16_t * pBuffer, uint16_t NumToWrite );      //指定地址开始写入指定长度的数据
void GDFLASH_Write( uint32_t WriteAddr, uint16_t * pBuffer, uint16_t NumToWrite );      //从指定地址开始写入指定长度的数据
void GDFLASH_Read( uint32_t ReadAddr, uint16_t * pBuffer, uint16_t NumToRead );     //从指定地址开始读出指定长度的数据#endif //_GD32_FLASH_H_

GD32F103单片机内部FLASH按半字读写驱动相关推荐

  1. 单片机编程php,STC单片机内部FLASH读写程序(最新整理)

    <STC单片机内部FLASH读写程序(最新整理)>由会员分享,可在线阅读,更多相关<STC单片机内部FLASH读写程序(最新整理)(6页珍藏版)>请在人人文库网上搜索. 1.S ...

  2. STM32单片机内部FLASH使用注意事项

    目录 1.前言 2.STM32 F1.F4.L1系列内部FLASH分区及大小 1.STM32F1系列 2.STM32F4系列 3.STM32L1系列 3.STM32 F1.F4.L1系列内部FLASH ...

  3. STM32HAL库-内部Flash在指定页读写保护示例

    概述 本篇文章介绍如何使用STM32HAL库,内部Flash在特定页读写保护示例. 硬件:STM32F103CBU6最小系统板 软件:Keil 5.29  + STM32CubeMX5.6.1 一.使 ...

  4. STM32F系列单片机内部FLASH编程

    STM32F系列单片机内部含有较大容量的FLASH存储器,但没有EEPROM存储器,有时候对于参数的保存不得不另外加一片EEPROM芯片.这对于现如今大部分MCU都是FLASH+EEPROM的配置而言 ...

  5. stm32内部Flash读写

    文章目录 1.stm32内部flash介绍 2.读写驱动编写 3.源码 上篇文章讲到了STM32来驱动外部flah的操作,flash真是好东西啊,内存大,能存的东西多,这样我们就可以用它来做一些大点的 ...

  6. STM32F10X、HK32F030单片机的Flash学习

    STM32 | 使用STM32内部Flash额外的空间来存储数据(Flash模仿EEPROM) 单片机内部是NORflash,擦除只能整页擦除,当然写可以按"字"写.这款芯片fla ...

  7. map文件分析 stm32_使用STM32内部Flash额外的空间来存储数据

    本次分享关于STM32内部FLASH的笔记. STM32 芯片内部的 FLASH 存储器,主要用于存储我们代码.如果内部FLASH存储完我们的代码还有剩余的空间,那么这些剩余的空间我们就可以利用起来, ...

  8. HC32F460 内部flash驱动

    内部flash写入的时候,需要将代码分配到内存中执行,烧写flash时,程序无法从flash执行的,这一点确实比STM32差一些: /********************************* ...

  9. APM32F103VCT6 写内部Flash失败解决方案(亲试可用)

    文章目录 1 前言 2 APM32F103xCxDxE 与 Sxx32F103xCxDxE 差异 3 两种解决方案 3.1 解决方案1 - 换芯片型号 3.2 解决方案2 - 改代码 4. 想说的话 ...

  10. c语言 将结构体放在flash,stm32的内部flash读写操作(含结构体的保存)

    不同的stm32单片机的flash大小不同,这个需要查阅芯片手册或者查看STM32CubeMX软件. stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实 ...

最新文章

  1. linux内核网络协议栈--数据包的数据收发简略流程图(二十八)
  2. javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
  3. phpcms 添加memcache支持
  4. 第四周实践项目4 建立算法库——双链表
  5. 简单几步即可判断Linux系统有无被DDOS攻击的方法
  6. java在文本区输出方法_Java文件的几种读取、输出方式
  7. 面向对象VS面向过程
  8. springboot Autowired BeanNotOfRequiredTypeException
  9. [转载] [硕.Love Python] QuickSort(快速排序)
  10. python里数字怎么表示_Python 中的数字—Python 学习笔记
  11. WINDOWS下如何让NPAPI插件生效
  12. [Cocos Creator] 制作简版消消乐(四):实现消除算法
  13. cisco路由器进入rommon模式
  14. 《我是北大旁听生/郑球洋》
  15. 车联网智能终端GB/T 32960国标协议规范 、国标新能源车联网终端GB/T32960标准T-BOX应用
  16. C++设计一个长方形类
  17. Excel办公中的应用(中秋快乐学习)(注意:全部为英文符号)
  18. 融合通信无人值守系统解决方案
  19. 认证 (authentication) 和授权 (authorization)小记
  20. 图像的 matlab代码,常用的一些图像处理Matlab源代码

热门文章

  1. linux vim中文使用教程
  2. 回声消除技术原理与解决办法
  3. 震旦打印机打不开首选项
  4. 数据库系统概念 第三章 习题答案
  5. 各省历年排污费入库金额(2008-2017年)
  6. 反向跟单讲解4:用什么跟单软件
  7. 微信小程序需要的软件下载
  8. badbody下_BadboyInstaller下载-录制脚本工具Badboy下载2.2.5 官方最新版-西西软件下载...
  9. mysql数据库命令从哪里输入_mysql数据库操作命令
  10. Android个人日常消费理财_财务软件