GD32F103单片机内部FLASH按半字读写驱动
.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按半字读写驱动相关推荐
- 单片机编程php,STC单片机内部FLASH读写程序(最新整理)
<STC单片机内部FLASH读写程序(最新整理)>由会员分享,可在线阅读,更多相关<STC单片机内部FLASH读写程序(最新整理)(6页珍藏版)>请在人人文库网上搜索. 1.S ...
- STM32单片机内部FLASH使用注意事项
目录 1.前言 2.STM32 F1.F4.L1系列内部FLASH分区及大小 1.STM32F1系列 2.STM32F4系列 3.STM32L1系列 3.STM32 F1.F4.L1系列内部FLASH ...
- STM32HAL库-内部Flash在指定页读写保护示例
概述 本篇文章介绍如何使用STM32HAL库,内部Flash在特定页读写保护示例. 硬件:STM32F103CBU6最小系统板 软件:Keil 5.29 + STM32CubeMX5.6.1 一.使 ...
- STM32F系列单片机内部FLASH编程
STM32F系列单片机内部含有较大容量的FLASH存储器,但没有EEPROM存储器,有时候对于参数的保存不得不另外加一片EEPROM芯片.这对于现如今大部分MCU都是FLASH+EEPROM的配置而言 ...
- stm32内部Flash读写
文章目录 1.stm32内部flash介绍 2.读写驱动编写 3.源码 上篇文章讲到了STM32来驱动外部flah的操作,flash真是好东西啊,内存大,能存的东西多,这样我们就可以用它来做一些大点的 ...
- STM32F10X、HK32F030单片机的Flash学习
STM32 | 使用STM32内部Flash额外的空间来存储数据(Flash模仿EEPROM) 单片机内部是NORflash,擦除只能整页擦除,当然写可以按"字"写.这款芯片fla ...
- map文件分析 stm32_使用STM32内部Flash额外的空间来存储数据
本次分享关于STM32内部FLASH的笔记. STM32 芯片内部的 FLASH 存储器,主要用于存储我们代码.如果内部FLASH存储完我们的代码还有剩余的空间,那么这些剩余的空间我们就可以利用起来, ...
- HC32F460 内部flash驱动
内部flash写入的时候,需要将代码分配到内存中执行,烧写flash时,程序无法从flash执行的,这一点确实比STM32差一些: /********************************* ...
- APM32F103VCT6 写内部Flash失败解决方案(亲试可用)
文章目录 1 前言 2 APM32F103xCxDxE 与 Sxx32F103xCxDxE 差异 3 两种解决方案 3.1 解决方案1 - 换芯片型号 3.2 解决方案2 - 改代码 4. 想说的话 ...
- c语言 将结构体放在flash,stm32的内部flash读写操作(含结构体的保存)
不同的stm32单片机的flash大小不同,这个需要查阅芯片手册或者查看STM32CubeMX软件. stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实 ...
最新文章
- linux内核网络协议栈--数据包的数据收发简略流程图(二十八)
- javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
- phpcms 添加memcache支持
- 第四周实践项目4 建立算法库——双链表
- 简单几步即可判断Linux系统有无被DDOS攻击的方法
- java在文本区输出方法_Java文件的几种读取、输出方式
- 面向对象VS面向过程
- springboot Autowired BeanNotOfRequiredTypeException
- [转载] [硕.Love Python] QuickSort(快速排序)
- python里数字怎么表示_Python 中的数字—Python 学习笔记
- WINDOWS下如何让NPAPI插件生效
- [Cocos Creator] 制作简版消消乐(四):实现消除算法
- cisco路由器进入rommon模式
- 《我是北大旁听生/郑球洋》
- 车联网智能终端GB/T 32960国标协议规范 、国标新能源车联网终端GB/T32960标准T-BOX应用
- C++设计一个长方形类
- Excel办公中的应用(中秋快乐学习)(注意:全部为英文符号)
- 融合通信无人值守系统解决方案
- 认证 (authentication) 和授权 (authorization)小记
- 图像的 matlab代码,常用的一些图像处理Matlab源代码