STM32 IAP 设计实例 (一)

发布者:精灵宠儿最新更新时间:2016-05-26 来源: eefocus关键字:STM32  IAP 手机看文章 扫描二维码
随时随地手机看文章
项目需要,需要开发一款手持设备,对产品进行软件升级。现在的产品都是使用STM32,所以可以很方便的应用STM32的 IAP功能对软件进行在线升级。

总体需求就是,主机Master通过CAN接口,发送数据给从机Slave。从机在接收到应用程序APP后,把接收的数据覆盖掉原来的应用程序区。从而实现Master对Slave的在线升级。

 

这里先介绍IAP,对IAP的整体实现有个了解,方便后续开发。参考了原子STM32开发板,对IAP功能的介绍。

 

要实现IAP,需要有两个项目代码。第一个称之为Bootloader程序,第二个称之为APP程序。Bootloader负责引导APP程序启动,以及需要在线更新APP时,接收主机发送的APP文件,将接收的APP覆盖掉原来的APP。

关于IAP的具体内容,可以参考原子STM32开发板的开发指南的五十三章。

下面是自己对IAP有大概了解之后,进行的实验。1,编写bootloader程序测试程序,用来引导指定位置的APP。2,修改原来的一个应用程序,使之可以用该bootloader引导。3,通过jlink下载器,分别下载bootloader和APP。

 

一,bootloader程序。

主要代码如下,流水灯之后,执行跳转到APP区域的命令

 

[cpp] view plain copy
 
  1. int main(void)  
  2. {     
  3.     delay_init();  
  4.     LED_Init();  
  5.   
  6.     LED1 = 0;  
  7.     delay_ms(200);  //延时  
  8.     LED2 = 0;  
  9.     delay_ms(200);  //延时  
  10.     LED3 = 0;  
  11.     delay_ms(200);  //延时  
  12.     LED4 = 0;  
  13.     delay_ms(200);  //延时  
  14.       
  15.     LED1 = 1;          
  16.     delay_ms(200);  //延时  
  17.     LED2 = 1;  
  18.     delay_ms(200);  //延时  
  19.     LED3 = 1;  
  20.     delay_ms(200);  //延时  
  21.     LED4 = 1;  
  22.     delay_ms(200);  //延时      
  23.   
  24.     iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码  
  25. }  
[cpp] view plain copy
 
  1. #define FLASH_APP1_ADDR     0x08003C00      //第一个应用程序起始地址(存放在FLASH)  
  2.                      //保留前15K的空间 做为bootloader区  
FLASH的起始地址是0x0800 0000,所以0x0800 0000~0x0800 3C00用于存放Bootloader。

二、APP程序区。

 

 

完成中断向量表的重定位。工程配置下载位置

 

[cpp] view plain copy
 
  1. int main(void)  
  2. {  
  3.   SCB->VTOR = FLASH_BASE | 0x3C00;  
  4.   /* Infinite loop */  
  5.   while (1)  
  6.   {  
  7.     OSInit();  
  8.     OSTaskCreate(Start_Task,   
  9.                 (void*)0,   
  10.                 &Start_Task_Stk[START_TASK_STK_SIZE-1],   
  11.                  START_TASK_PRIO);  
  12.       
  13.     OSStart();  
  14.     return 0;  
  15.   }  
  16. }  
在main函数,最开始处加入SCB->VTOR = FLASH_BASE | 0x3C00;这里的0x3C00,即在bootloader中设定的Bootloader区域。

 

 

jlink下载的地址配置成起始地址是0x0800 3C00。 这样下载的时候不会把bootloader区域擦除。

 

最后在keil下, 分别下载bootloader , APP两个工程, 可以看到bootloader流水灯最后,APP程序被启动。
 

通过该实验,可以实现bootloader程序对APP的引导。后续可以再实现主机通过CAN发送数据给从机,从机更新APP数据到flash,即可实现升级。

bootloader的示例代码,APP的代码在公司原来的工程上改,不方便公开,只要按照上面的说明进行配置,即可以进行实验。

关键字:STM32  IAP 引用地址:STM32 IAP 设计实例 (一)

上一篇:基于STM32的USB枚举过程学习笔记(五)
下一篇:STM32 IAP 设计实例 (二)

推荐阅读最新更新时间:2024-03-16 14:55

利用STM32的FLASH模拟 EEPROM(F103)系列
STM32的FLASH是用来存储主程序的,ST公司为了节约成本,没有加入 EEPROM,但是许多场合下我们需要用EEPROM;不过FLASH的容量还是可观的,我们可以利用FLASH模拟EEPROM。 根据《STM32F10X闪存编程》中的介绍,FLASH除了保存用户代码的部分,其余部分我们是可以利用其作为数据存储使用的。stm32的FLASH分为主存储块和信息块。主存储块用于保存具体的程序代码和用户数据,信息块用于负责由stm32出厂是放置2KB的启动程序(Bootloader)并锁死,用户无法更改。选项字节存储芯片的配置信息及对主存储块的保护信息。STM32的FLASH主存储块按页组织,有的产品每页1KB,有的产
[单片机]
利用<font color='red'>STM32</font>的FLASH模拟 EEPROM(F103)系列
STM32-systick系统定时器
systick系统定时器 系统定时器存在内核中,是24位的定时器,只能向下递减,嵌套在NVIC中 counter 在时钟的驱动下 在reload的初值开始向下递减计时到0,产生中断置位标志然后又从reload值开始重新递减计数,循环 定时时间计算 t=reload*(1/clk) clk=72M时,t=72*(1/72m)=1us clk=72M时,t=72000*(1/72m)=1ms clk=72M时,t=72000000*(1/72m)=1s 1s=1000MS =1000 000US=1000 000 000NS sysTick属于内核中的外设,他的中断优先级和外设的中断优先级相比,哪个
[单片机]
STM32-systick系统定时器
STM32】HAL库 STM32CubeMX教程三----外部中断(HAL库GPIO讲解)
前言 上一节我们讲解了STM32CubeMX的基本使用和工程的配置,那么这一节我们正式来学习CubeMX配置STM32的各个外设功能了 今天我们会详细的带你学习STM32CubeMX配置外部中断,并且讲解HAL库的GPIO的各种函数,带你学习不一样的STM32 那么话不多说,我们开始正式的讲解吧! 准备工作: 1、STM32开发板(我的是STM32F407ZE和STM32F103RC) 2、STM32CubeMx软件、 IDE: Keil软件 3、STM32F1xx/STM32F4xxHAL库 4、按键管脚 PA11 PB4 5 LED管脚 PC4 PC5 PB0 PB1 1新建工程 1.1New Pr
[单片机]
【<font color='red'>STM32</font>】HAL库 STM32CubeMX教程三----外部中断(HAL库GPIO讲解)
STM32之SPI库函数介绍
首先SPI的一些基本介绍参照相关芯片的库函数或者使用手册,以下介绍SPI库函数的基本用法和参数的定义。 1.SPI_DeInit函数的功能是将外设SPIx寄存器重设为默认值。输入参数SPIx可以是1和2,是用来选择SPI外设的。 2.SPI_Init函数的功能是根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器。SPI_InitDefType的结构体是定义在文件stm32f10x_spi.h里。 typedef struct { u16 SPI_Direction;//用于设置SPI单向或者双向数据模式。 u16 SPI_Mode;//用于设置SPI的工作模式; u16 SPI_Dat
[单片机]
STM32上创建链表并实现LCD滚动显示串口消息
在实现STM32开发ESP8266的时候发现ESP8266串口发送的消息行数很多, 如果使用普通的数组来存储消息需要大量的存储开销, 并且数据的显示也会损耗MCU的处理速度, 故而实现对消息的传输装入一个可以动态拓展, 并且具有灵活的调用形式的容器. 链表理所当然成为首选. 关于C语言链表的相关操作本文不再详细叙述, 若有需求请移步网址:https://blog.csdn.net/morixinguan/article/details/68951912先学习链表后再来学习在STM32创建链表. 首先粘贴STM32上链表.c文件的代码: //////roll_display.c的代码 #include roll_di
[单片机]
在<font color='red'>STM32</font>上创建链表并实现LCD滚动显示串口消息
STM32 HAL库 printf 串口重定向
在对printf重定向之前,一定不要有printf,否则程序马上跑飞。 在main函数之前加上如下代码对串口进行重定向,当然,串口一定要初始化之后再用printf,否则程序虽然不会飞,但是printf也不会有结果 #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { //具体哪个串口可以更改huart1为其它串口 HAL_UART_Transmit(&huart1 , (
[单片机]
关于STM32的USART_GetFlagStatus和USART_GetITStatus解析
前言 STM32固件库中提供了串口收发的标志位函数,包括USART_GetFlagStatus(…,…);和USART_GetITStatus(…,…);,两者容易混淆,重点区别就在于:前者返回值是中断标志位状态(读SR寄存器),后者返回值是中断发生与否的判断(读CR寄存器),以下主要对这两个函数进行分析。 一、USART_GETFlagStatus(…,…) /** * @brief Checks whether the specified USART flag is set or not. * @param USARTx: Select the USART or the UART peripheral. * Th
[单片机]
关于<font color='red'>STM32</font>的USART_GetFlagStatus和USART_GetITStatus解析
意法半导体二代STM32微处理器推动智能边缘发展,提高处理性能和工业韧性
新STM32MP2 MPUs搭载64位处理器和边缘 AI加速器 与生俱来的速度、安全性和可靠性 依托STM32生态系统,加快应用开发,安全配置网络 2024年3月12日,中国 -- 服务多重电子应用领域、全球排名前列的半导体公司意法半导体(STMicroelectronics,简称ST)发布了新一代的STM32MP2系列工业级微处理器 (MPUs),以推动智能工厂、智能医疗、智能楼宇和智能基础设施等领域未来的发展。 数字化转型席卷全球,它推动企业提高生产效率、改善医疗服务质量,加强楼宇、公用设施和交通网络的安全和能源管理。数字化的核心赋能技术包括云计算、数据分析、人工智能 (AI)和物联网 (IoT)
[单片机]
意法半导体二代<font color='red'>STM32</font>微处理器推动智能边缘发展,提高处理性能和工业韧性
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved