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 ...
随机推荐
- unbuntu更换软件源
编辑/etc/apt/sources.list文件,将文件中原有的国外源全部注释掉,文件头添加以下内容 ##中科大源 deb https://mirrors.ustc.edu.cn/ubuntu/ b ...
- 2018年蓝桥杯A组C/C++决赛题目
2018年蓝桥杯A组C/C++决赛题目 2018年蓝桥杯A组C/C++决赛题解 1:三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3, 2.5) (6.4, 3.1) (5 ...
- httpd虚拟主机起不来!!
前几天在公司,练习负载均衡配置.在配置虚拟主机的web服务(apache) ,创建好虚拟主机的配置文件 ss -tnl 查看监控端口80已起来,通过本地浏览器访问一直显示默认的欢迎页... 一个下午 ...
- python3.5.3rc1学习二
#if else示例x = 5y = 8 if x > y: print("x is greater than y")else: print("x is not g ...
- Appium自动化WebView中元素的操作
在App开发过程中,很容易用到第三方的WebView控件,这个属于移动端混合型App.在我们做自动化测试的过程中,就要对这种情况进行处理,最通用的办法就是先将appium切换到webview模式然后按 ...
- CF1146D Frog Jumping
CF1146D Frog Jumping 洛谷评测传送门 题目描述 A frog is initially at position 00 on the number line. The frog ha ...
- luoguP4254 [JSOI2008]Blue Mary开公司
题意 李超树裸题,注意一开始截距是\(S-P\). code: #include<bits/stdc++.h> using namespace std; #define ls(p) (p& ...
- VS2017项目升级 error LNK2005: "public: __thiscall ATL::CTime::
我是将项目升级到从VS2012 升级VS2017, 报错如下 1>atlsd.lib(atltime.obj) : error LNK2005: "public: __thiscall ...
- linux 硬盘满了后,查看使用目录占用空间情况
cd 切换到目录, du -ah --max-depth=1 查看当前目录下的 文件夹 占用情况
- Anaconda--在虚拟环境中安装CUDA and cudnn
在conda虚拟环境中安装CUDAconda install cudatoolkit=8.0 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs ...
