基于YModem协议的IAP配置详解
写在前面
最近由于项目需要实现IAP的远程在线升级,看了网上的教程发现都不是很详细,不少地方存在错误,对新手带来许多困扰。在此写下这篇IAP配置详解希望能帮助大家少走弯路。废话不多说,开始正题。
说明
- 采用的单片机型号:STM32F103RCT6(其他型号的配置步骤基本相同)
- 需要用到的工具:SecureCRT、keil5、ST-Link\J-link、串口助手等等
Bootloader配置
这里不再介绍什么是IAP,不懂的可以去看正点原子的视频。
1.首先下载官方的IAP程序,本文基于官方示例进行修改,在文章末尾有链接。
(官方的程序是基于hal库的,这没什么关系)
2.这是文件的目录结构,第一步修改启动文件,
如: STM32F103RCT6选择startup_stm32f103xe.s
STM32F103C8T6选择startup_stm32f103xb.s
。。。
文件在工程目录下的
Bootloader\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm中
3.在keil中打开工程后,点击魔术棒开始配置
进入device,选择你的芯片型号。
选完以后会在你的工程目录下出现一个绿色的菱形块,这是keil默认帮我们自动导入的工程文件,我们需要将它删除。右键,选择第一个Options for Component Class …然后将它remove
来到Target下,这里需要修改两个地方。
IROM1中start不变,Size改为0xC000(根据自己实际需要修改)。意思是给bootloader程序留大约48kb的flash。
在右侧IRAM1的地方保持默认即可,我使用的芯片SRAM为48kb,所以size就是C000。
注意:ST在程序中规定Size的大小必须是0x200的整数倍数,也就是512kb的整数倍。这里不能随意填写。
Linker中将图中的勾打上,具体为什么我也不清楚。(我当上就因为这个勾没打debug了三个晚上)
打开flash_if.h定位到图中这里进行修改。
打开menu.c,按图中增加if判断、关闭所有中断( __disable_irq(); )。
其他: 1.在bootloader中不用设置中断相连偏移。
2.在main函数中可以自行写逻辑,判断何时进入升级程序
APP配置
对比bootload配置更为简单,打开一个已有的工程。
这里以正点原子最简单的跑马灯程序为例。
1.打开main函数,在开头加上__enable_irq();(打开全部中断,刚刚我们在bootload中关闭了,所以这里要重新打开)
2.修改IROM中的Start和size(需要参照刚刚bootloader中的设置,Size大小必须<=总内存大小与bootloader大小之差)
IRAM不变
接下来设置User,用于生产bin文件,第一步,按图示勾选,填什么内容这里不再展开(百度keil生成bin文件)。
仍然必须勾上User Memory Layout from Target Dialog
进入到system_stm32f10x.c文件,修改中断向量偏移(默认是0x0,需要按自己的实际偏移量修改
测试
小灯开始闪烁,app写入成功