当前位置: 首页 > news >正文

15-STM32F103RCT6的FLASH写入

STM32F103RCT6的FLASH写入

1.


//*******************************固件升级地址信息******************************//
#define STM32_FLASH_BASE 	0x08000000	//固件起始地址
#define FLASH_APP_ADDR  	0x08005000 	//APP开始地址
#define FLASH_PARA_ADDR 	0x0803C000	//固件关键信息参数
#define FLASH_INFO_ADDR 	0x0803F000	//固件升级信息参数
#define STM_SECTOR_SIZE		2048				//页大小
#define STM32_FLASH_SIZE 	128					//总页数u16 stm32_flash_buf[STM_SECTOR_SIZE/2]={0x00};					//用于FLASH写操作,注意字节对齐,最多是2K字节
/*FLASH读出函数*****************************************************************************/
u8 STMFLASH_Read_Byte(u32 faddr)
{return *(u8*)faddr; 
}
/*FLASH写入函数*****************************************************************************/
void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 num_byte)   
{ 			 		 u16 i;for(i=0;i<num_byte;i++){FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);WriteAddr+=2;//地址增加2.}  
} 
/*FLASH写入函数*****************************************************************************/
void STMFLASH_Write(u32 WriteAddr,u8 *pBuffer,u16 num_byte)//写多少个字节	
{u16 i;u16 sec_num;	   	//一共需要写入多少扇区u16 sec_off; 			//最后一包数据个数 ////if((WriteAddr!=FLASH_INFO_ADDR)&&(WriteAddr!=FLASH_APP_ADDR)&&(WriteAddr!=FLASH_PARA_ADDR))return;//非法地址sec_num=(num_byte/STM_SECTOR_SIZE);sec_off=(num_byte%STM_SECTOR_SIZE);FLASH_Unlock();						//解锁//printf("SSSSS");////if(WriteAddr==FLASH_APP_ADDR)//写APP数据{//擦除固件区域for(i=0;i<116;i++){FLASH_ErasePage((i+10)*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除APP空间扇区}//写数据到flashfor(i=0;i<sec_num;i++){memset((u8*)stm32_flash_buf,0xFF,sizeof(stm32_flash_buf));//数据缓存buffMem_Copy((u8*)stm32_flash_buf,&pBuffer[i*STM_SECTOR_SIZE],STM_SECTOR_SIZE);//复制数据STMFLASH_Write_NoCheck((FLASH_APP_ADDR+i*STM_SECTOR_SIZE),stm32_flash_buf,STM_SECTOR_SIZE/2);} 	if(sec_off){memset((u8*)stm32_flash_buf,0xFF,sizeof(stm32_flash_buf));//数据缓存buffMem_Copy((u8*)stm32_flash_buf,&pBuffer[sec_num*STM_SECTOR_SIZE],sec_off);//复制数据STMFLASH_Write_NoCheck((FLASH_APP_ADDR+i*STM_SECTOR_SIZE),stm32_flash_buf,STM_SECTOR_SIZE/2);}}else if(WriteAddr==FLASH_INFO_ADDR)//写固件信息{FLASH_ErasePage(FLASH_INFO_ADDR);//擦除这个扇区,这个是固件信息的空间memset((u8*)stm32_flash_buf,0xFF,sizeof(stm32_flash_buf));Mem_Copy((u8*)stm32_flash_buf,pBuffer,sec_off);STMFLASH_Write_NoCheck(FLASH_INFO_ADDR,stm32_flash_buf,STM_SECTOR_SIZE/2);}else if(WriteAddr==FLASH_PARA_ADDR)//写固件信息{FLASH_ErasePage(FLASH_PARA_ADDR);//擦除这个扇区,这个是固件信息的空间memset((u8*)stm32_flash_buf,0xFF,sizeof(stm32_flash_buf));Mem_Copy((u8*)stm32_flash_buf,pBuffer,sec_off);STMFLASH_Write_NoCheck(FLASH_PARA_ADDR,stm32_flash_buf,STM_SECTOR_SIZE/2);}FLASH_Lock();//上锁
}
/*FLASH读出函数*****************************************************************************/
void STMFLASH_Read(u32 ReadAddr,u8 *pBuffer,u16 num_byte)   	
{u16 i;for(i=0;i<num_byte;i++){pBuffer[i]=STMFLASH_Read_Byte(ReadAddr);//读取2个字节.ReadAddr+=1;//偏移.	}
}
/*内存复制函数******************************************************************************/
void Mem_Copy(u8 * date1,u8 * date2,u16 len)
{u16 i;for(i=0;i<len;i++){date1[i]=date2[i];}
}

文章转载自:
http://abyss.wjrtg.cn
http://chime.wjrtg.cn
http://alcmene.wjrtg.cn
http://cashmere.wjrtg.cn
http://address.wjrtg.cn
http://binocle.wjrtg.cn
http://archegonial.wjrtg.cn
http://allopatric.wjrtg.cn
http://cambo.wjrtg.cn
http://amah.wjrtg.cn
http://buoyancy.wjrtg.cn
http://candelabrum.wjrtg.cn
http://carbonaceous.wjrtg.cn
http://annotate.wjrtg.cn
http://bacillin.wjrtg.cn
http://anthophilous.wjrtg.cn
http://bubbleheaded.wjrtg.cn
http://bowed.wjrtg.cn
http://accordionist.wjrtg.cn
http://alfine.wjrtg.cn
http://aerotactic.wjrtg.cn
http://calligrapher.wjrtg.cn
http://beebee.wjrtg.cn
http://chemosensory.wjrtg.cn
http://broadside.wjrtg.cn
http://capacitor.wjrtg.cn
http://chamberlain.wjrtg.cn
http://assumable.wjrtg.cn
http://bersagliere.wjrtg.cn
http://antienvironment.wjrtg.cn
http://www.dtcms.com/a/280980.html

相关文章:

  • 学习C++、QT---26(QT中实现记事本项目实现文件路径的提示、现在我们来学习一下C++类模板、记事本的行高亮的操作的讲解)
  • 简单易懂,操作系统的内存管理机制是如何实现的
  • Python初学者笔记第二十期 -- (文件IO)
  • kimi-k2模型配置参数
  • vector的简单实现及常用接口
  • I/O 多路复用详解笔记
  • 笔试——Day8
  • CentOS 7 Linux 离线安装 docker-compose
  • 【PTA数据结构 | C语言版】层序遍历二叉树
  • SQLlite下载以及简单使用
  • AI创作系列第19篇:海狸IM 20250714版本重磅升级 - 移动端UI全面焕新
  • linux的磁盘满了清理办法
  • 图机器学习(7)——图神经网络 (Graph Neural Network, GNN)
  • 【10】如何对图像进行分割(下)
  • 删除k8s卸载后残留挂载点目录
  • 【群晖NAS】云服务器与群晖NAS(无公网)的FRP内网穿透之旅
  • Kimi K2 替换 Claude Code 默认模型
  • AI-Compass Embedding模型模块:15+主流向量化技术的多模态语义表示生态,涵盖文本图像音频嵌入、RAG检索增强、向量数据库集成与工程化实践
  • 进程创建与退出的原理
  • 5.数据归一化
  • Paimon 删除向量
  • 元宇宙经济:虚实交融下的数字文明新范式
  • Python 函数:从“是什么”到“怎么用”的完整指南
  • 【Linux驱动-快速回顾】一文快速理解GIC内部寄存器对中断的控制
  • Claude技术全景解读:从安全聊天机器人到自主智能体的演进之路
  • 数据结构自学Day7-- 二叉树
  • 项目总体框架(servlet+axios+Mybatis)
  • ue4 houdini pivot painter 学习笔记
  • 可微分3D高斯溅射(3DGS)在医学图像三维重建中的应用
  • OpenCV 对数变换函数logTransform()