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程序要点的更多相关文章

  1. STM32F103 串口-IAP程序升级

    STM32F103 串口-IAP程序升级 通常情况下我们给STM32系列的单片机烧录程序文件的时候,使用SWD.J-link或者通过设置BOOT引脚后,使用串口进行程序下载,这样的方式直接一次性将程序 ...

  2. STM32F103/429串口IAP+Ymodem升级

    起因: 串口IAP升级在正点原子的例程中有讲解,正点原子的方法是:在RAM中开辟一个120K的数据空间,用来存放bin文件,bin文件通过串口一次性发送到单片机,然后再实现程序的跳转.但是这种方法在实 ...

  3. STM32之串口IAP更新升级

    一.IAP简介 IAP是应用编程,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级,后续产品发布后,更新程序我只需要把.bin文件通过串口发送给芯片就可以执行更 新,很方 ...

  4. STM32串口IAP分享

    什么是IAP? IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通 ...

  5. STM32 Bootloader基于ymodem传输协议串口IAP升级详解

    硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 文章目录 1 预备知识 2 Bootloader 2.1 启动流程 2.2 校验跳转地址是否有效 ...

  6. C语言PIC16 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新PIC16 Boot ...

  7. C#--简单的串口通信程序

    前几天做毕业设计,其中要用到串口和下位机进行通信,于是自己捣鼓了一个简单的串口通信程序. 在做通信之前要先弄一个SerialPort组件出来,当然也可以通过程序来创建.本次设计中采用的是拖的winfo ...

  8. 创建C#串口通信程序详解

    在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports.这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信.我们将使用标准 ...

  9. Apple Watch: WatchKit 应用程序要点

    Apple Watch: WatchKit 应用程序要点 本文译自:Apple Watch: WatchKit App Essentials WatchKit 应用程序架构 上一篇文章简单介绍了 Wa ...

随机推荐

  1. nginx 安装 lua_nginx_module 模块(nginx——lua 学习笔记1)

    插入两个网站: nginx + lua 的OpenResty 开发 跟我学OpenResty(Nginx+Lua)开发目录贴 两个都是 可以根据目录一步步学习的. 1. 版本下载 nginx版本为 n ...

  2. HTTP与HTTPS初识

    HTTP HTTP是一个属于应用层的协议,特点是简介.快速   HTTP客户端发起请求,创建端口HTTP服务器在端口监听客户端请求HTTP服务器向客户端返回状态和内容 网络请求,页面渲染 1.域名解析 ...

  3. php安全字段和防止XSS跨站脚本攻击过滤函数

    function escape($string) { global $_POST; $search = array ( '/</i', '/>/i', '/\">/i', ...

  4. android appium微信等自动化的那些坑儿

    1.下载appium自动化安装环境: appium客户端 python语言支持 android studio(包含android sdk和adb) java开发环境 2.微信x5内核调试(网上有详细配 ...

  5. Vue v-if,v-else-if,v-else的使用

    v-else-if 要紧跟 v-if v-else要紧跟v-else-if 或 v-if 代码: <!doctype html> <html lang="en"& ...

  6. stm32配置led

    前言:我们学习一门新语言的时候都是先从hello world入门,stm32也有自己的入门方式,那就是流水灯的配置. 在配置之前我们需要先配置好编译环境,我们需要手动修改头文件中的一些内容. 1.首先 ...

  7. 《一起学mysql》3

    索引和查询优化   为什么要索引? 想想我们上小学的时候是怎么查字典的,比方查 理想的 “理”,首先在索引里找到声母 “l”,再找到 “li” 找到 “li”所在的页数,   我们之前建的所有mysq ...

  8. LeetCode 234:回文链表 Palindrome Linked List

    ​ 请判断一个链表是否为回文链表. Given a singly linked list, determine if it is a palindrome. 示例 1: 输入: 1->2 输出: ...

  9. 阿里云CentOS7.x安装nodejs及pm2

    对之前文章的修订 您将了解 CentOS下如何安装nodejs CentOS下如何安装NVM CentOS下如何安装git CentOS下如何安装pm2 适用对象 本文档介绍如何在阿里云CentOS系 ...

  10. locally weighted regression - CS229

    欠拟合和过拟合 看下方的三张图 第一幅拟合为了 y=θ0+θ1xy=θ0+θ1x 的一次函数 第二幅拟合为了y=θ0+θ1x+θ2x2y=θ0+θ1x+θ2x2 的二次函数 第三幅拟合为了 y=∑5j ...