STM32F4 串口IAP程序要点
1. IAP(bootloader)程序
1.1 内部Flash地址分配
/* Start of the Flash address */
#define STM32_FLASH_BASE 0x08000000
/* End of the Flash address */
#define STM32_FLASH_END_ADDRESS 0x081FFFFF //Flash Size 2MB
/* Define the IAP application size */
#define IAP_FLASH_SIZE 0x8000 //bootloader size 32KB
/* Define the address from where user application will be loaded. */
#define FLASH_APP_ADDR (uint32_t)(STM32_FLASH_BASE+IAP_FLASH_SIZE)
/* Define the user application size */
#define FLASH_APP_SIZE (STM32_FLASH_END_ADDRESS - FLASH_APP_ADDR + 1)
1)设置内部Flash起始地址(STM32_FLASH_BASE):固定值0x0800 0000
2)设置内部Flash结束地址(STM32_FLASH_END_ADDRESS):根据实际使用的芯片闪存大小进行设置,因为我使用的是STM32F429ZIT6,其闪存大小为2MB,这里设置为0x081F FFFF
3)设置IAP程序Size(IAP_FLASH_SIZE):一般为16Kb左右(0x4000)。这里设置为0x8000即32KB(0x0800 0000~0x0800 7FFF),占用扇区0和扇区1。
4)设置APP程序起始地址(FLASH_APP_ADDR):STM32F4内部Flash起始地址 + IAP程序Size=0x0800 8000
5)设置APP程序Size(FLASH_APP_SIZE):内部Flash结束地址 - APP程序起始地址 + 1
1.2 MDK编译器中设置IAP程序下载起始地址与大小

这里设置将IAP程序下载到STM32_FLASH_BASE = 0x0800 0000,大小IAP_FLASH_SIZE = 0x8000(这里设置和IAP_FLASH_SIZE值一致,可以保证当IAP程序大于32KB时,编译器会报错,这时你需要考虑修改IAP_FLASH_SIZE的值,或者精简代码)
1.3 设置中断向量表起始地址
在main()函数开始的位置加入以下代码,设置中断向量表存放在SCB->VTOR + 4 = 0x0800 0004起始的地址:
SCB->VTOR = FLASH_BASE | 0x00;//设置中断向量表偏移量. 也可以在SystemInit() 里设置VECT_TAB_OFFSET
2. APP应用程序
2.1 MDK编译器中设置APP程序下载起始地址与大小

APP起始地址和上面1.1.4)中FLASH_APP_ADDR的值一致,Size设置为0x0020 0000,即2MB。
2.2 设置中断向量表起始地址
在main()函数开始的位置加入以下代码,设置中断向量表存放在SCB->VTOR + 4 = 0x0800 8004起始的地址:
#define IAP_FLASH_SIZE 0x8000 //bootloader size 32KB
SCB->VTOR = FLASH_BASE | IAP_FLASH_SIZE;//设置偏移量 FLASH_BASE | 0x8000
这里请注意:中断向量表存放的位置必须是0x200的倍数,因此,这里IAP_FLASH_SIZE 也必须是0x200的倍数,即0x00, 0x200, 0x400 ...
3. 在MDK生成.bin文件
D:\keil5\ARM\ARMCC\bin\fromelf.exe --bin --output ../OBJ/PWM.bin ../OBJ/PWM.axf
说明:
fromelf: D:\keil5\ARM\ARMCC\bin\fromelf.exe
MDK自带工具路径,笔者的路径如上所示,请修改为自己的路径(或者点击右边的文件夹小图标,找到该工具)。
[options]: --bin --output ../OBJ/PWM.bin
生成bin文件命令,想把生成的bin文件放在什么地方(记住路径最前面是 ../(两个点),而不是 ./(一个点),之前就被坑了)。
input_file: ../OBJ/PWM.axf
输入文件,这里是用axf格式的文件转换为bin文件,找到你工程里的axf文件所在位置,填上去就可以了。
STM32F4 串口IAP程序要点的更多相关文章
- STM32F103 串口-IAP程序升级
STM32F103 串口-IAP程序升级 通常情况下我们给STM32系列的单片机烧录程序文件的时候,使用SWD.J-link或者通过设置BOOT引脚后,使用串口进行程序下载,这样的方式直接一次性将程序 ...
- STM32F103/429串口IAP+Ymodem升级
起因: 串口IAP升级在正点原子的例程中有讲解,正点原子的方法是:在RAM中开辟一个120K的数据空间,用来存放bin文件,bin文件通过串口一次性发送到单片机,然后再实现程序的跳转.但是这种方法在实 ...
- STM32之串口IAP更新升级
一.IAP简介 IAP是应用编程,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级,后续产品发布后,更新程序我只需要把.bin文件通过串口发送给芯片就可以执行更 新,很方 ...
- STM32串口IAP分享
什么是IAP? IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通 ...
- STM32 Bootloader基于ymodem传输协议串口IAP升级详解
硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 文章目录 1 预备知识 2 Bootloader 2.1 启动流程 2.2 校验跳转地址是否有效 ...
- C语言PIC16 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新PIC16 Boot ...
- C#--简单的串口通信程序
前几天做毕业设计,其中要用到串口和下位机进行通信,于是自己捣鼓了一个简单的串口通信程序. 在做通信之前要先弄一个SerialPort组件出来,当然也可以通过程序来创建.本次设计中采用的是拖的winfo ...
- 创建C#串口通信程序详解
在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports.这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信.我们将使用标准 ...
- Apple Watch: WatchKit 应用程序要点
Apple Watch: WatchKit 应用程序要点 本文译自:Apple Watch: WatchKit App Essentials WatchKit 应用程序架构 上一篇文章简单介绍了 Wa ...
随机推荐
- Java学习笔记(2)--- 对象和类入门,java包,this 和 super区别
1.对象和类(Object and class): 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作. 面对对象编程是java非常重要的一部分,作者本身之前学过c ...
- ioctl操作
在本书中有两个地方都对这个函数进行了介绍,其实还有很多地方需要这个函数.ioclt函数传统上一直作为纳西而不适合归入其他精细定义类别的特性的系统接口.网络程序(特别是服务器程序)经常在程序启动执行后使 ...
- LeetCode 分治算法
分治算法:是将问题划分为一些独立的子问题,递归的求解个子问题,然后合并子问题的解而得到原问题的解. 分治算法步骤 step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题: ...
- CF1185F Two Pizzas
CF1185F Two Pizzas 洛谷评测传送门 题目描述 A company of nn friends wants to order exactly two pizzas. It is kno ...
- 解决VMware15 centos7 桥接模式ssh突然不能访问的问题
因为想让虚拟机拥有自己的局域网IP, 所以用了桥接, 这样方便测试. 问题来了: 1.ssh突然连接不上了,虚拟机上的项目也无法访问了. 2.虚拟机照常联网,与主机互ping什么的也都没问题,以前从来 ...
- jdk 自带命令行工具
jps工具 虚拟机进程状况工具 工具主要选项 jstat: 虚拟机统计信息监视工具 jinfo: Java配置信息工具 jinfo( Configuration Info for Java) 的作用是 ...
- IPv6地址编址
- 记一次SQL调优
insert优化 如果你在某一时刻有大量的insert操作,一条一条插入是非常耗时的.insert语句本身支持一次插入很多条记录,插入记录数上限受sql语句长度限制,一般一次插个几千条是没问题的.在我 ...
- Python连载41-yield from详解、委派生成器
一. 1.yield from (1)调用协程为了得到返回值,协程必须正常终止 (2)生成器正常终止会发出StopIteration异常,异常对象的value属性保存返回值. (3)yield fro ...
- HTML连载40-盒子宽度和高度的练习、box-sizing属性
一.判断方法 1.判断是否元素宽高为200的盒子 只需要看:边框+内边距+内容宽度/内容高度的值是否等于200 2.判断是否内容宽高为100的盒子 只需要看:width和heght的值是否等于100 ...
