stm32F1使用SD卡实现IAP

最近在做一个项目,想使用uSD卡来实现在应用编程,首先需要一些知识

  我所使用的单片机是STM32F103ZE,内部flash,超始地址为0x8000000,大小为0x80000(0x80000/1024也就是512kByte)要实现IAP,那么我需要一个bootloader,什么是bootloader呢,其实可以理解为我们PC的引导程序,我们需要在flash中为这个引导程序分配一个空间,起始于flash的起始地址(0x80000000)结束于0x80007F00,这样就分配了32KByte的空间,注意这个空间的分配一定要大于等于bootloader所占用的flash空间的大小。可以用stlink Utility来确定实际大小,也可以用编译工具编译结束后输出的信息。

  除了bootloader还有最终单片机需要跑的用户应用程序。这个程序就可以分配在bootloader之后的空间里,从0x80008000开始,到0x80080000全部可用。

了解了上面的信息,那么可以知道它的实现原理:单片机上电,运行bootloader,检查某一个按钮是否按下,如果按下,就做一些初始化的工作,比如SDIO,FATFS,完成后读取SD卡中指定的BIN文件,并转移到开始地址为0x80008000的FLASH中。如果按钮没有按下,bootloader去检查0x80008000为首的FLASH区域是否有应用程序,如果有就执行。

else//未检测到按钮
  {/*检查用户应用程序的起始地址是否有正确的内容*/if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000){/* Jump to user application */JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);JumpToApplication = (pFunction) JumpAddress;/* Initialize user application's Stack Pointer */__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);JumpToApplication();}}

 

PS:

  BIN文件的生成

在调试好应用程序之后,方可生成BIN文件拷贝到SD卡中,那么如何生成这个文件呢,还是MDK ARM工具 OPTION->USER->Run #1 打勾,填入

E:\Keil\ARM\ARMCC\bin\fromelf.exe --bin -o .\STM3210E_EVAL\STM3210E_EVAL.bin .\STM3210E_EVAL\STM3210E_EVAL.axf

以上具体的路径根据自己的实际情况更改,只不过生志的BIN文件和AXF文件需要和MDK工程名一致这点要注意。

  更改生成文件的超始地址:

Option->Target->IROM1 的起始地址是否为0x80008000。

还有最重要的一点,用户应用程序在调试好之后生成BIN文件之前,需要更改中断向量表的偏移,使用STM32 HAL库的情况下,找到system_stm32f1xx.c这个文件,修改宏定义:

#define VECT_TAB_OFFSET 0x0 /*!< Vector Table base offset field.
                  This value must be a multiple of 0x200. */

以上是默认值,这里需要更改为你所设置的偏移量,在这里就是用户应用程序相对于基址0x80000000的偏移,用户应用的基址是0x80008000,那么偏移量为0x8000所以这里改成:

#define VECT_TAB_OFFSET 0X8000

转载于:https://www.cnblogs.com/jackweibe/p/5623670.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470459.shtml

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

相关文章

父组件访问子组件中的数据(父子组件通信案例:父组件访问子组件$refs[‘子组件‘],子组件传递数据给父组件(父组件中使用v-model))

一、需求 二、在父组件upload-cover中&#xff1a; 通过$refs[子组件的ref属性值]就能拿到子组件对象 三、在子组件imgae-list&#xff08;相对于父组件upload-cover来说&#xff0c;image-list组件是子组件&#xff09;中 通过在data中定义一个selected&#xff0c;来保存…

[设计模式]6. C++与职责链模式(chain of rsponsibility pattern)

默默地EEer&#xff0c;原文地址&#xff1a; http://www.cnblogs.com/hebaichuanyeah/p/5625233.html 职责链模式指使多个对象多有机会处理请求&#xff0c;避免请求发送者和接受者的耦合关系。 将这些接受处理的对象连成一条链&#xff0c;并沿着该链处理请求。 一个传说中的…

python删除为空值的列_python如何删除列为空的行

1.摘要 dropna()方法&#xff0c;能够找到DataFrame类型数据的空值&#xff08;缺失值&#xff09;&#xff0c;将空值所在的行/列删除后&#xff0c;将新的DataFrame作为返回值返回。 2.函数详解 函数形式&#xff1a;dropna(axis0, howany, threshNone, subsetNone, inplaceF…

axios请求拦截器、响应拦截器、vue-router路由导航守卫的使用(案例)

axios官方文档 一、请求拦截器 设置headers,给所有请求加上Authorization&#xff1a;token值 二、响应拦截器 直接去访问/article,发现可以进入到article内容管理页面 原因是在vue路由拦截器中&#xff0c;我们是这样来判断用户是否有权限访问除了登录页面之外的其他页面&a…

gdb交叉编译

gdb交叉编译网上有很多教程&#xff0c;在编译时&#xff0c;会碰到一条错误&#xff1a; configure: error: no termcap library found一般的解决是下载termcap代码&#xff0c;然后编译成目标系统的lib&#xff0c;放入目标系统编译环境中&#xff0c;但是—————— 有时…

Vue项目部署,打包发布上线

参考vuecli官方文档 一、构建打包 在发布上线之前&#xff0c;我们需要执行构建打包&#xff0c;将 .less、.vue、.js 等相关资源进行编译打包&#xff0c;转换成浏览器可以直接识别运行的普通 css、js、html。 # yarn run build 或者 yarn build npm run buildVueCLI 会把打…

python将数组写入文件_python – 将numpy数组的大小写入二进制文件

我需要将2D numpy数组写入文件,包括其尺寸,以便我可以从C程序中读取它并创建相应的数组. 我已经编写了一些保存数组的简单代码,可以从C中读取,但如果我首先尝试编写数组的大小,它总会给我一个错误. 这是我的简单python代码&#xff1a; 1 file open("V.bin","w…

spring源码编译和导入eclipse

1、下载源码并解压 https://github.com/spring-projects/spring-framework/tree/v3.2.5.RELEASE 2、源码编译 cmd进入spring源码根目录&#xff0c;执行编译源码&#xff1a;gradlew build可能出现问题&#xff1a;&#xff08;1&#xff09;如果出现某些方法找不到&#xff0…

大学python教材思维导图_Python核心知识体系的14张思维导图

本文主要涵盖了 Python 编程的核心知识&#xff08;暂不包括标准库及第三方库&#xff09;。 按顺序依次展示了以下内容的一系列思维导图&#xff1a;基础知识&#xff0c;数据类型&#xff08;数字&#xff0c;字符串&#xff0c;列表&#xff0c;元组&#xff0c;字典&#x…

华为OJ平台——整形数组合并

题目描述&#xff1a; 将两个整型数组按照升序合并&#xff0c;并且过滤掉重复数组元素 输入&#xff1a; 输入说明&#xff0c;按下列顺序输入&#xff1a;    1 输入第一个数组的个数    2 输入第一个数组的数值    3 输入第二个数组的个数    4 输入第二个数…

python 函数式编程包_python 函数支持函数式编程的包operator partial

itemgetter和attrgetter能替代从序列中取出元素或读取对象属性的lambda表达式&#xff0c;会自动构建函数 itemgetter 1&#xff0c;根据元组某个字段给元组列表排序&#xff0c;下例中 itemgetter(1) lambda field : field[1] 2,如果把多个参数传给itemgetter ,它构建的函数会…

Node中使用token(基于第三方包jsonwebtoken)

一、jsonwebtoken 用于生成token&#xff08;加密&#xff09; > jsonwebtoken 1. 安装 npm i jsonwebtoken --save 2. 使用 2.1 引入 2.2 加密 用户登录成功后&#xff0c;后端生成token&#xff0c;返回给前端 二、passport、passport-jwt 用于验证token&#xff0…

写了cookie阻止通过输入地址直接访问下一个html,但是直接输入地址访问时,会闪一下下一个页面,怎么回事啊????、...

描述&#xff1a;做了两个页面login.html index.html 在index的body加了onload事件&#xff0c;调用一个js&#xff0c;js中有cookie的判断&#xff0c;防止没有登录就打开index.html&#xff0c;如果没有登录跳回到login.html 但是&#xff01;&#xff01;&#xff01;&am…

concurrently同时开启多个监听服务

当我们使用nodejs和vue混合开发的时候。当要同时启动后台服务&#xff0c;和前端服务的时候&#xff0c;我们可以使用concurrently 一、安装concurrently包 npm install concurrently --save-dev 二、配置 配置vuecli创建的项目中的packag.json文件&#xff1a; 2. 配置node…

es6 数组合并_JavaScript学习笔记(十九)-- ES6

ES6新增的内容之前的都是 ES5 的内容接下来我们聊一下 ES6 的内容let 和 const 关键字我们以前都是使用 var 关键字来声明变量的在 ES6 的时候&#xff0c;多了两个关键字 let 和 const&#xff0c;也是用来声明变量的只不过和 var 有一些区别1、let 和 const 不允许重复声明变…

常用的加密解密算法

import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;/*** Java常用的对密码加密的方法 对摘要信息进行加密编码*/ public class PasswordUtil {private final static String[] hexDigits { "0", "1", "2", &q…

vue-cli4.x 中 配置允许跨域请求

在项目根目录下创建vue.config.js文件&#xff1a; vue.config.js: module.exports {devServer: {host: localhost,port: 8080,https: false,open: false, // 配置自动启动浏览器hotOnly: true, // 是否热更新proxy: {/api: { // 路径中有 /api 的请求都会走这个代理target: …

怎样不停请求接口实现实时刷新_快狗打车实时数仓和基于Hologres的数据服务建设...

前言 数据的实时化是最近几年数据行业很重要的趋势&#xff0c;我们在去年底也建立起新一代的实时数仓&#xff0c;但是在数据应用上一直没有取得很大的突破&#xff0c;我们希望实时数仓不仅仅是支撑大屏、核心实时报表、个别实时应用等简单的场景&#xff0c;希望更大…

c/c++参考文档

http://www.cplusplus.com/reference/cstdio/ 转载于:https://www.cnblogs.com/haxianhe/p/9271192.html

Vuex在项目中使用

案例1&#xff1a; 案例2&#xff1a; Token 是用户登录成功之后服务端返回的一个身份令牌&#xff0c;在项目中的多个业务中需要使用到 校验页面的访问权限 访问需要授权的 API 接口 … 但是我们只有在第一次用户登录成功之后才能拿到 Token。 所以为了能在其它模块中获取…