IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32通过SD卡IAP -> 正文阅读

[嵌入式]STM32通过SD卡IAP

STM32通过SD卡IAP(仅介绍应用层)

1.先确定是否插入了SD卡,否则直接进入app

read_sd_check()

2.进行SD卡初始化

SD_Init();

3.挂载SD卡

FRESULT f_mount (FATFS* fs,const TCHAR* path,BYTE opt)

参数分别为:工作区指针、磁盘路径、驱动器号(0为稍后注册,1为立即注册)。当工作区指针为NULL,则为注销函数。
如:f_mount(&fatfs,"0:",1); 

4.打开记录app数据的txt文件,并读取版本、大小、MD5

#define SD_INFO_PATH "/program/slave/info.txt"	//更新消息文本地址

f_open(&updateProgFile,SD_INFO_PATH,FA_READ); //只读类型打开文件

copy_between_characters((char *)&readBuf,(char*)&updateInfoTypeDef.version,"#","$ ");//获取版本
copy_between_characters((char *)&readBuf,(char *)&updateInfoTypeDef.size,"$ ","@");//获取大小
copy_between_characters((char *)&readBuf,(char *)&updateInfoTypeDef.md5,"@","&");//获取MD5

f_close (&updateProgFile); //关闭文件

5.读取Flash中原本的app数据,并判断版本

#define SAVE_DATA_ADDR    0x08018800          //数据内部存储起始地址

STMFLASH_Read(SAVE_DATA_ADDR,(u16 *)buf,sizeof(innerSaveTypeDef));

if(strcmp((const char *)&updateInfoTypeDef.version,(const char*)&innerSaveTypeDef.ProgVersion)!=0) 
 //版本号不一样

6.版本不一样,则打开bin文件

#define SD_PROG_PATH "/program/slave/"					//更新程序地址

sprintf((char *)buf,"%s%s%s",SD_PROG_PATH,updateInfoTypeDef.version,".bin");  //组合成路径+文件名
fileOperionResult = f_open(&updateProgFile,buf,FA_READ); 
//只读类型打开文件

7.将读取的bin文件写入flash

#define SAVE_PROGRAM_ADDR 0x08019000	//程序内部存储起始地址

fileOperionResult = f_open(&updateProgFile,buf,FA_READ); //只读类型打开文件
i=updateProgFile.fsize;
progWriteAddr=SAVE_PROGRAM_ADDR;

while(1)
	if(i<2048){
		fileOperionResult =	f_read (&updateProgFile, &readBuf,i, &br); //读取文件
		if(fileOperionResult!=FR_OK)									//文件打开失败
			goto ERROR;	
		iap_write_appbin(progWriteAddr,readBuf,i);          //更新FLASH代码 
		break;
	}else{
		fileOperionResult =	f_read (&updateProgFile, &readBuf,2048, &br); //读取文件
		if(fileOperionResult!=FR_OK)									//文件打开失败
			goto ERROR;	
		iap_write_appbin(progWriteAddr,readBuf,sizeof(readBuf));          //更新FLASH代码  
		i-=2048;
		progWriteAddr+=2048;
	}
}
fileOperionResult =	f_close (&updateProgFile); //关闭文件

8.校验MD5

#define SAVE_PROGRAM_ADDR 0x08019000	//程序内部存储起始地址

progFileSize = atoi16((char *)updateInfoTypeDef.size,10);//把文件大小的字符转换为整数
get_bin_md5(SAVE_PROGRAM_ADDR,progFileSize,buf);	     //校验程序MD5值

if(strcmp((const char *)&updateInfoTypeDef.md5,(const char *)buf)==0) //程序校验成功

9.校验正确,则更新Flash内的app数据

#define SAVE_DATA_ADDR    0x08018800    //数据内部存储起始地址

memcpy(innerSaveTypeDef.ProgVersion,updateInfoTypeDef.version,sizeof(innerSaveTypeDef.ProgVersion));//记录版本号
memcpy(innerSaveTypeDef.ProgSize,updateInfoTypeDef.size,sizeof(innerSaveTypeDef.ProgSize));			//记录文件大小
memcpy(innerSaveTypeDef.progMd5,updateInfoTypeDef.md5,sizeof(innerSaveTypeDef.progMd5));			//记录MD5值
memcpy(innerSaveTypeDef.progDate,buf,sizeof(innerSaveTypeDef.progDate));							//记录更新日期

STMFLASH_Write(SAVE_DATA_ADDR,(uint16 *)readBuf,sizeof(innerSaveTypeDef));                          //更新成功存储更新信息

10.完成后进入app即可

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-13 12:59:30  更:2021-12-13 12:59:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 2:11:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码