基于YModem协议的IAP配置详解

写在前面

最近由于项目需要实现IAP的远程在线升级,看了网上的教程发现都不是很详细,不少地方存在错误,对新手带来许多困扰。在此写下这篇IAP配置详解希望能帮助大家少走弯路。废话不多说,开始正题。

说明

  1. 采用的单片机型号:STM32F103RCT6(其他型号的配置步骤基本相同)
  2. 需要用到的工具: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 DialogUser

进入到system_stm32f10x.c文件,修改中断向量偏移(默认是0x0,需要按自己的实际偏移量修改
在这里插入图片描述

测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
小灯开始闪烁,app写入成功

对STM32F103C8T6的补充

在使用STM32F103C8T6的时候发现APP无法进入中断的问题。
解决方法:
1.进入APP的main后首先需初始化系统时钟SystemInit();
2。开启总中断__enable_irq();
3.确保已经设置过中断向量偏移
实测在STM32F103RCT6中不会出现上述情况

//STM32F103C8T6 APP配置
int main(void)
{
/*初始化部分 start */
	SystemInit(); //初始化系统时钟
	__enable_irq();//或使用__ASM("CPSIE  I"); 
	//IAP_Init();//初始化IAP
	delay_init(72);//延时函数初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	USART_DeInit(USART2);
	uart2_init(115200);//串口初始化。设置波特率115200
/*初始化部分 end */

/*用户初始化部分 start */
	RELAY_Init();				//LED初始化
/*用户初始化部分 end */

/* 其他 start */

/* 其他 end */
	while(1)
	{
	/* 逻辑部分 start */
		RELAY0=0;
		delay_ms(300);
		RELAY0=1;
		delay_ms(300);
	/* 逻辑部分 end */
	}
}

程序源码

https://download.csdn.net/download/qq_44348665/12140046

上位机在线升级软件

基于上述开发了一款上位机软件,可搭配使用进行在线升级,代替了SecureCRT的YModem文件传输功能,还可以进行串口通讯。
链接:https://pan.baidu.com/s/1GsdSelnwSLoAxTJ_8ruZOg
提取码:8888
复制这段内容后打开百度网盘手机App,操作更方便哦

如果链接失效:
https://download.csdn.net/download/qq_44348665/12254541

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值