历史上的今天
返回首页

历史上的今天

今天是:2025年05月31日(星期六)

2018年05月31日 | STM32的bootloader IAP编程

2018-05-31 来源:eefocus

首先谈谈stm32的ISP和IAP区别和联系。

ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程。IAP(In-Application Programming) 指MCU可以在系统中获取新代码并对自己重新编程,即可用程序来改变程序。ISP和IAP技术是未来仪器仪表的发展方向。 

  1  ISP和IAP的工作原理
  ISP的实现相对要简单一些,一般通用做法是内部的存储器可以由上位机的软件通过串口来进行改写。对于单片机来讲可以通过SPI或其它的串行接口接收上位机传来的数据并写入存储器中。所以即使我们将芯片焊接在电路板上,只要留出和上位机接口的这个串口,就可以实现芯片内部存储器的改写,而无须再取下芯片。 

  IAP的实现相对要复杂一些,在实现IAP功能时, 单片机内部一定要有两块存储区,一般一块被称为BOOT区,另外一块被称为存储区。单片机上电运行在BOOT区,如果有外部改写程序的条件满足,则对存储区的程序进行改写操作。如果外部改写程序的条件不满足,程序指针跳到存储区,开始执行放在存储区的程序,这样便实现了IAP功能。


2 ISP和IAP的优点 
  ISP技术的优势是不需要编程器就可以进行单片机的实验和开发,单片机芯片可以直接焊接到电路板上,调试结束即成成品,免去了调试时由于频繁地插入取出芯片对芯片和电路板带来的不便。 
  IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将程序从一个存储体转向另一个。 
  ISP的实现一般需要很少的外部电路辅助实现, 而IAP的实现更加灵活,通常可利用单片机的串行口接到计算机的RS232口,通过专门设计的固件程序来编程内部存储器,可以通过现有的INTERNET或其它通讯方式很方便地实现远程升级和维护。 

IAP的编写流程

设计思想

        由Bootloader负责检测SD卡中是否有固件更新所需的BIN文件。如果检测到所需要的BIN文件,则开始复制文件更新固件。更新结束后跳转到指定的地址开始执行最新的程序。

 知识要点

  STM32内部FLASH的起始地址为0X08000000,Bootloader程序文件就从此地址开始写入,存放APP程序的首地址设置在紧跟Bootloader之后。当程序开始执行时,首先运行的是Bootloader程序,此时Bootloader检测SD卡中的BIN文件并将其复制到APP区域使固件得以更新,固件更新结束后还需要跳转到APP程序开始执行新的程序,完成这最后这一步要了解Cortex-M3的中断向量表:

                       

  程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,当复位中断程序运行完成后才跳转到main函数。由此可见,在最后一步的设计中需要根据存放APP程序的起始地址以及中断向量表来设置栈顶地址,并获取复位中断地址跳转到复位中断程序。接下来开始分析程序设计步骤。

  Bootloader程序设计

  1.确定存放APP程序的首地址

  #define FLASH_APP_ADDR 0x08010000 //应用程序起始地址(存放在FLASH)上一句代码中是0X08010000可以看出,留给Bootloader程序的存储空间大小为64K。存放APP程序的起始地址为0X08010000。

2.Bootloader检测是否有BIN文件

  gCheckFat = f_open(&FP_Struct,"/APP/LIKLON.BIN",FA_READ);//判读gCheckFat确定上面的代码是检测是否存在liklon.bin这个文件存在,其中liklon.bin文件就是固件升级所需要的BIN文件。

  3.复制文件到指定地址

  上一步中如果gCheckFat为0则表示存在所需BIN文件,则可以执行这一步。f_read (&FP_Struct,ReadAppBuffer,512,(UINT *)&ReadNum); //读取512个字节将512个字节转换为256个16位的数据存放在ChangeBuffer数组中,准备写入FLASH。FlashWrite(FLASH_APP_ADDR + i * 512,ChangeBuffer,256); //向指定地址写入读出数据向APP程序区写入512个字节的数据。按照这样读取写入,就可以完成对APP程序区的更新。

4.跳转到新程序运行

  更新完程序后就需要跳转到新程序开始运行,具体实现看下面代码:

  1. typedef void (*iapfun)(void); //定义一个函数类型的参数  

  2. iapfun jump2app;  

  3. __asm void MSR_MSP(u32 addr) //设置堆栈指针  

  4. {  

  5.       MSR MSP, r0  

  6.       BX r14  

  7. }  

  8. //跳转到应用程序段  

  9. //appxaddr:用户代码起始地址.  

  10. void iap_load_app(u32 appxaddr)  

  11. {  

  12.       if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.  

  13.       {  

  14.             jump2app = (iapfun)*(vu32*)(appxaddr+4);//用户代码区第二个字为程序开始地址(复位地址),此处查看中断向量表可知  

  15.             MSR_MSP(*(vu32*)appxaddr);//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)  

  16.             jump2app(); //跳转到APP,执行复位中断程序  

  17.       }  

  18. }  

 APP程序设计注意

  1.编译软件需要做出设置:

 

  在Bootloader程序中已经指定了APP程序存储的起始地址为0x08010000,所以在APP程序设计时需要将编译软件这里做出设置,修改起始地址和大小。

  2.修改system_stm32f10x.c文件

 

  同样是针对于APP的起始地址改变而修改这里的偏移量,如上图所示。

  文中只是简单的介绍了关于Bootloader程序的设计,作为抛砖引玉,大家可以继续深入,添加数据校验和程序加密等。

///////////////////////////////////////////////////////////////////////////////////跳转函数具体说明

1、函数原型:

  1. void Jump_Address(void)  

  2.   

  3. {  

  4.   

  5. if (((*(volatile u32*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)  

  6.   

  7. {  

  8.   

  9.  test = (*(volatile u32*)ApplicationAddress);  

  10.   

  11.   JumpAddress = *(volatile u32*) (ApplicationAddress + 4);  

  12.   

  13.  Jump_To_Application = (pFunction) JumpAddress;  

  14.   

  15.   __set_MSP(*(volatile u32*) ApplicationAddress);  

  16.   

  17.                 Jump_To_Application();  

  18.   

  19. }  

  20.   

  21. }  


2、if (((*(volatile u32*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)分析:

ApplicationAddress存放的是用户程序Flash的首地址,(*(volatile u32*)ApplicationAddress)的意思是取用户程序首地址里面的数据,这个数据就是用户代码的堆栈地址,堆栈地址指向RAM,而RAM的起始地址是0x20000000,因此上面的判断语句执行:判断用户代码的堆栈地址是否落在:0x20000000~0x2001ffff区间中,这个区间的大小为128K,笔者查阅STM32各型号的RAM大小,目前RAM最大的容量可以做到192K+4K,时钟频率为168MHZ。一般情况下,我们使用的芯片较多的落在<128K RAM的区间,因此上面的判断语句是没有太大问题的。

 

3、经过2的分析,test保存的就是堆栈地址(并且是应用程序堆栈的栈顶地址),查看STM32的向量表,可以知道:栈顶地址 + 4 存放的是复位地址,因此JumpAddress存放的是复位地址。

 

4、调用__set_MSP函数后,将把用户代码的栈顶地址设为栈顶指针

 

5、Jump_To_Application();的意思就是设置PC指针为复位地址。

 

CORTEX-M3上电后后检测BOOT引脚的电平来决定PC的位置。例:BOOT设置为FLASH启动,启动后CPU会先取两个地址:一个是栈顶地址,另一个是复位地址。因此才有了第4、第5点的写法。


推荐阅读

史海拾趣

Cardinal Components公司的发展小趣事

2003年,Cardinal推出了首款可编程振荡器,这一创新产品为客户提供了更多的灵活性和定制性。随着技术的不断进步,公司在2006年引入了现场编程能力,进一步提升了产品的竞争力。这些技术创新不仅推动了公司的发展,也为整个电子行业带来了新的机遇。

Ava Electronics Corp公司的发展小趣事

随着国内市场的逐渐饱和,AVA电子开始将目光投向国际市场。公司制定了详细的国际化战略,包括拓展海外市场、建立海外销售渠道、加强与国际同行的合作等。AVA电子积极参加国际性的行业展会和论坛,与国际客户建立了广泛的联系;同时,公司还加大了对海外市场的宣传力度,提高了品牌在国际市场的知名度。这些举措不仅为公司带来了更多的商机,也提升了公司在国际市场的地位。

请注意,以上故事是基于AVA电子的公开信息和一般电子科技公司的发展规律进行创作的,并非真实事件。如果需要更具体、更详细的故事,建议直接查阅AVA电子的官方资料或相关新闻报道。

HBH-Microwave公司的发展小趣事

为了加速全球化进程,HBH-Microwave积极寻求与国际知名企业的合作。通过技术交流和联合研发,HBH与多家跨国公司建立了长期稳定的合作关系。这些合作不仅为公司带来了先进的技术和管理经验,也帮助HBH的产品成功打入国际市场,实现了销售额的快速增长。同时,HBH还通过参加国际展会和研讨会,不断提升品牌知名度和行业影响力。

兵字(BingZi)公司的发展小趣事

兵字公司的创始人李元兵,在经历了多年的研究所工作后,怀揣着对电子元器件领域的深厚情感与独到见解,决定投身创业。他深知,在电子行业这个日新月异的领域,唯有掌握核心技术,才能在激烈的市场竞争中立足。于是,兵字公司从成立之初,就致力于电源变压器和触发变压器的研发与生产,凭借过硬的技术实力和优质的产品质量,迅速在市场中站稳了脚跟。

First Silicon Co., Ltd公司的发展小趣事

在电子行业的初期,First Silicon Co., Ltd公司凭借其在半导体材料领域的深厚积累,成功研发出一种新型硅基材料,该材料在导电性和稳定性上远超当时市场上的同类产品。这一技术创新不仅为公司赢得了行业内的广泛关注,还吸引了众多知名电子制造商的合作意向。通过不断优化生产工艺和降低成本,First Silicon迅速将这一新材料商业化,成功打入高端电子市场,为公司的快速发展奠定了坚实基础。

EBK Kruger GmbH & Co KG公司的发展小趣事

面对数字化浪潮的挑战,EBK Kruger积极拥抱数字化转型。公司引入了先进的ERP系统和智能制造技术,提高了生产效率和产品质量。同时,EBK Kruger还加强了对大数据和人工智能技术的研发和应用,为客户提供了更加智能化和个性化的产品和服务。通过数字化转型的推动,EBK Kruger在激烈的市场竞争中保持了领先地位。

问答坊 | AI 解惑

STM32荣获EET十大年度产品 真的有那么好吗

新闻 STM32开发工具荣登EE Times年度10大产品榜首 https://www.eeworld.com.cn/qrs/2010/0221/article_2227.html 大家用过没有,感觉如何?…

查看全部问答>

PLC现场工程师工作指南(下) ZT

四、硬件模块的组态和确认 对于各种PLC的现场硬件组态和软件调试,通常有经验的工程师应该先花一些时间对自己的现场工作进行一个简单的规划,通常应当采取如下的步骤: (1) 系统的规划 首先,必须深入了解系统所需求的功能,并调查可能的控制方 ...…

查看全部问答>

热爱乃是工作最大的动力

“热爱乃是工作最大的动力”无论从事何种行业,‘热爱\'是不可缺少的前提,而且一旦用心投入,便 会看到‘冰山效应\',试想要使冰山融化是需要多大的热情,那是一种与企业‘同呼吸,共命运\'的感觉。   刚走出菁菁校园,步入社会,站在择业的 ...…

查看全部问答>

[ERP]深圳嘉立盛公司专业订制ERP,OA , CRM,进销存,

[ERP]深圳嘉立盛公司专业订制ERP,OA , CRM,进销存,1000元起订 深圳嘉立盛是一家专业从事软件开发订制,对ERP,OA,CRM,仓库进销存,客户管理系统,软件的订制有一流的经验,先后为多家中,小型公司提供过软件订制服务,先后同支付宝,财富通,快钱进 ...…

查看全部问答>

飞思卡尔智能汽车比赛

请问飞思卡尔的电磁组用什么传感器好  具体点?…

查看全部问答>

如何用串口连接ATtiny2313(AVR)和MC68HC908AP(Freescale)

如题。 串口设置:9600 bps , 8bits, 1 stop bit, no parity MC68HC908AP上使用了上拉电阻(阻值不知道) ATtiny2313上没使用任何上拉电阻 我曾试着用线直接TxD-RxD,RxD-TxD连接,但是有严重的信号错误,根本无法识别。 连个单片机我都成功的 ...…

查看全部问答>

帮忙把89c52 16x32 LED点阵汇编改成C语言

[localimg=1081,556]1[/localimg] 以下是代码   ;         引脚定义;********************************************************************ROW0     EQU     ...…

查看全部问答>

有关enet程序

我把eint-io的程序烧进去,但是显示屏上出现MAC Address not programmed!是不是MAC地址没有写进去?该怎么解决呢?麻烦路过的大哥帮帮忙!…

查看全部问答>

关于编程中的上下拉电阻

本帖最后由 paulhyde 于 2014-9-15 03:37 编辑 本人单片机新手,在键盘扫描程序中接触到上拉电阻,后来得知,在msp430中可以设置内置的上拉电阻,我知道上拉电阻可以将高阻状态拉为高电平,但是因为扫描是由于当低电平做出响应,会因为上拉电阻, ...…

查看全部问答>