文章目录
一.概要
STM32程序升级方法有很多种,主要有以下几种:
1.将编译生成的hex/bin文件使用ST-Link/J-Link工具直接下载进 Flash 即可,Keil中点击下载就能下载,下载后的代码会存放在Flash的起始地址0x08000000处。
2.ISP(In System Programing),这个是利用了 STM32单片机自带的 Bootloader 升级程序。一般可通过USART串口对Flash重新编程,再通过电脑上的ISP下载软件导入程序。在用户参考手册中,可以看到下表,关于启动模式设置的,ISP就是BOOT1引脚为0,BOOT0引脚为1,单片机就进入ISP模式。
3. IAP(In Application Programing),即在应用编程,与之相对应的叫做ISP,两者的不同是ISP需要依靠烧写器在单片机复位离线的情况下编程,需要人工的干预,而IAP则是用户自己的程序在运行过程中对Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。
使用IAP技术能很好地降低现场工作量,实现IAP有两个很重要的前提
1.单片机程序能对自身的内部Flash 进行擦写。
2.单片机要有能够和外部进行通讯的方式,无论是网络还是别的方式,只要能传输数据就行。
二.STM32F103C8T6单片机IAP介绍
1.STM32F103C8T6单片机IAP基本原理
以STM32F103C8T6单片机为例,每次程序复位是从0x08000000的位置开始执行主程序,如果不做IAP则这64KB(0x10000)空间都可以用来存放应用程序,但为了实现IAP,需要有划出一部分空间存放BOOT程序,BOOT程序跟应用程序是两个独立的工程,BOOT程序主要功能是来接收外部通讯(串口,CAN,485等)协议传输的应用程序代码文件(bin文件),并调用FLASH写入函数把bin文件分成N个32Bit数据,写入到应用程序地址空间,就实现对应用程序的升级。
2.STM32F103C8T6单片机IAP基本流程
单片机先在BOOT工程的程序中跑,BOOT程序通过串口接收上位机发来的.bin文件(应用程序工程),检查后将.bin文件写入到Flash特定位置(0x08004000开始的地址),bin文件写完后,单片机就从BOOT程序的空间跳转到应用程序的空间运行。
三.STM32CubeMX配置一个BOOT工程
本实验配置一个只包含跳转的程序工程,不包含FLASH写入以及Y-Modem协议,这样比较简单,BOOT程序中的LED闪烁比较快,APP程序中的LED闪烁比较慢,先用STLINK烧录BOOT程序,再用STLINK烧录APP程序,就能看到LED先快速闪烁,再慢速闪烁,频率不一样。后续只要把FLASH写入以及Y-Modem协议添加进去,就能实现IAP升级。
Part Number处输入STM32F103C8,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚
PC13配置成输出
配置系统主频
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
添加代码
main代码如下:
typedef void (*pFunction)(void);
#define APPLICATION_ADDRESS (uint32_t)0x08004000 //定义APP运行地址
pFunction JumpToApplication;
uint32_t JumpAddress;
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();//初始化1毫秒 Tick
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();//外部8M晶振,系统72M主频
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
for(int i=0;i<20;i++)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);//PC13引脚翻转输出
HAL_Delay(100);//等待100ms
}
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);//定义跳转的地址
JumpToApplication = (pFunction) JumpAddress;
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);//设置主函数栈指针
JumpToApplication();//跳转到APP程序
}
/* USER CODE END 3 */
}
四.STM32CubeMX配置一个APP工程
Part Number处输入STM32F103C8,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚
PC13配置成输出
配置系统主频
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
添加代码
APP工程需要配置Keil5工程中定义程序的起始地址
修改中断向量表偏移
五.CubeMX工程源代码下载
通过百度网盘分享的文件:28.IAP实验.rar
链接:https://pan.baidu.com/s/1-X54RiRamanE2Ii4YPMPrQ
提取码:ui8x
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
六.小结
在单片机应用中,在线升级功能是必不可少的,它可以让我们在不破坏硬件的情况下对程序进行升级和修正,提高了开发效率。