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://www.tpcf.cn/bicheng/89214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PPO:近端策略优化算法

温馨提示&#xff1a; 本篇文章已同步至"AI专题精讲" PPO&#xff1a;近端策略优化算法 摘要 我们提出了一类新的用于强化学习的 policy gradient 方法&#xff0c;该方法在与环境交互以采样数据和使用随机梯度上升优化一个“代理”目标函数之间交替进行。与标准的…

数据结构的算法分析与线性表<1>

一、算法分析&#xff1a; 由于语句执行一次的实际所需时间与机器的软硬件有关&#xff0c;则算法分析是针对语句执行次数&#xff0c;而非执行时间。 时间复杂度 计算时间复杂度&#xff1a; 常量阶 如果算法中的n是固定的&#xff0c;或者说n是常数&#xff0c;或者时间复杂…

esp32使用ESP-IDF在Linux下的升级步骤,和遇到的坑Traceback (most recent call last):,及解决

因为之前使用的是ESP-IDF5.3版本。而5.3版本又不支持ESP32P4。而V5.4版本开始正式对P4的支持。所以我把ESP-IDF 升级到V5.4.2的release版本。 一、升级版本&#xff1a;【根据乐鑫官方的方式升级】ESP-IDF 版本简介 - ESP32-P4 - — ESP-IDF 编程指南 v5.4.2 文档 更新至一个稳…

【算法】贪心算法:最大数C++

文章目录前言题目解析算法原理字典序代码示例策略证明前言 题目的链接&#xff0c;大家可以先试着去做一下再来看一下思路。179. 最大数 - 力扣&#xff08;LeetCode&#xff09; 题目解析 还是老样子&#xff0c;把题目读懂&#xff0c;画出有用信息。 认真看示例&#xff0…

网络安全职业指南:探索网络安全领域的各种角色

本文旨在为对网络安全领域感兴趣的粉丝读者提供一份全面的职业指南。我们将探讨网络安全领域中各种不同的职业角色&#xff0c;包括其职责、所需技能以及职业发展路径&#xff0c;帮助你了解网络安全领域的职业选择&#xff0c;并为你的职业规划提供参考。网络安全职业概览 身处…

Design Vision:显示扇入/扇出逻辑

相关阅读 Design Visionhttps://blog.csdn.net/weixin_45791458/category_13006970.html?spm1001.2014.3001.5482 在使用Design Vision中查看示意图时&#xff0c;可以在示意图中查看所选单元(Cell)、引脚(Pin)、端口(Port)或线网(Net)的扇入/扇出逻辑。用户可以在当前激活的…

13.7 Meta LLaMA2-Chat核心技术突破:三重强化学习实现91.4%安全评分,超越ChatGPT的对话模型架构全解析

Meta LLaMA2-Chat核心技术突破:三重强化学习实现91.4%安全评分,超越ChatGPT的对话模型架构全解析 指令微调模型:LLaMA2-Chat 技术深度解析 LLaMA2-Chat 作为 Meta 推出的对话优化大模型,其技术实现展现了大模型对齐(Alignment)领域的前沿突破。与基础版 LLaMA2 相比,该…

二维仿射变换笔记

二维仿射变换笔记 1. 数学基础 1.1 变换矩阵 二维仿射变换使用3x3的齐次坐标矩阵表示: [a b tx] [c d ty] [0 0 1 ]其中: [a b; c d] 是线性变换部分,表示旋转、缩放和错切[tx; ty] 是平移部分最后一行 [0 0 1] 是齐次坐标的固定形式1.2 基本变换 1.2.1 平移变换 将点…

创建自定义Dataset类与多分类问题实战

codes 文章目录&#x1f31f; 6 多分类问题与卷积模型的优化&#x1f9e9; 6.1 创建自定义Dataset类⚠️ 数据集特点&#xff1a;&#x1f511; 关键实现步骤&#xff1a;&#x1f6e0;️ 自定义Dataset类实现&#x1f4ca; 数据集划分与可视化&#x1f9e0; 6.2 基础卷积模型&…

用vue自定义指令设置页面权限

1.按钮权限处理/*** v-hasPermi 按钮权限处理*/import store from /storeexport default {inserted(el, binding, vnode) {const { value } bindingconst all_permission "*:*:*";const permissions store.getters && store.getters.permissionsif (value…

JPA / Hibernate

1. JPA 和 Hibernate 有什么区别&#xff1f;JPA 是 Java 官方提出的一套 ORM 规范&#xff0c;它只定义了实体映射、关系管理、查询接口等标准&#xff0c;不包含具体实现。Hibernate 是对 JPA 规范的最常用实现&#xff0c;提供了完整的 ORM 功能&#xff0c;并扩展了许多 JP…

kibana显示未准备就绪

kibana显示未准备就绪 最近在研究新版本的ELK&#xff08;Elasticsearch, Logstash, Kibana&#xff09;栈时遇到了一个问题&#xff1a;虽然服务器本身能够访问ELK服务&#xff0c;但通过浏览器尝试访问时却无法成功。这里我将分享一些可能的排查步骤和解决方案。连接es的地址…

语音对话秒译 + 视频悬浮字 + 相机即拍即译:ViiTor 如何破局跨语言场景?

在跨语言信息获取场景中&#xff0c;语言壁垒常导致效率降低。ViiTor Translate 试图通过 “场景化功能布局” &#xff0c;覆盖 语音、视频、图像、文本 四大维度翻译需求。以下基于产品功能展示&#xff0c;拆解其核心能力&#xff1a; 1. 实时语音对话翻译&#xff1a;打破交…

国内第一梯队终端安全产品解析:技术与场景实践

国内终端安全市场的第一梯队产品&#xff0c;通常具备技术领先性、场景覆盖度和规模化落地能力。结合 2025 年最新行业动态与实战案例&#xff0c;以下从技术架构、核心能力和典型应用三个维度&#xff0c;解析当前市场的头部产品及其差异化价值。一、技术架构与市场格局国内终…

FTP 备份,一种更安全的备份方式

备份数据后最重要的任务是确保备份安全存储&#xff0c;最好是异地存储。您可以通过物理方式将备份介质&#xff08;例如磁带和 CD/DVD&#xff09;移动到异地位置。这是一个乏味、耗时、不方便且不可靠的方式。更简单的解决方案是通过 FTP 备份到保存在异地的服务器。什么是 F…

理解 HTTP POST 请求中的 json 和 data 参数

在使用 Python 发送 HTTP POST 请求时&#xff08;无论是使用 requests 还是 aiohttp&#xff09;&#xff0c;json 和 data 参数有明确的区别和使用场景。理解这些区别对正确构建请求至关重要。关键区别特性json 参数data 参数内容类型自动设置为 application/json需要手动设置…

C#反射机制与Activator.CreateInstance

本文仅作为参考大佬们文章的总结。 反射是C#和.NET框架中一项强大的功能&#xff0c;允许程序在运行时检查、创建和操作类型、方法、属性等元数据。作为反射机制的核心组件&#xff0c;Activator.CreateInstance提供了动态实例化对象的灵活方式。本文将全面剖析C#反射的原理、…

Linux的用户和用户组与权限解析、环境变量说明与配置、sudo配置解析和使用

一、Linux的用户及用户组与权限 1.1、Linux的用户和用户组内容介绍 Linux的用户角色分类序号Linux的用户角色说明1超级用户拥有对系统的最高管理权限&#xff0c;可执行任意操作&#xff0c;默认是root用户2普通用户只能对自己目录下的文件进行访问和修改&#xff0c;具有登录系…

图解LeetCode:79递归实现单词搜索

网格 (board): 单词搜索 中等 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”…

2025 R3CTF

文章目录EvalgelistSilent Profit&#xff08;复现&#xff09;Evalgelist <?phpif (isset($_GET[input])) {echo <div class"output">;$filtered str_replace([$, (, ), , ", "", "", ":", "/", "!&…