历史上的今天
返回首页

历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2018年08月26日 | STM32 Bootloader原理和设计

2018-08-26 来源:eefocus

不需要拆机就能对产品进行固件升级是很多人想要的效果,不仅方便而且节省精力和成本。那么如何完成这项工作呢?接下来所介绍的Bootloader就可以完成这项工作,通过Bootloader引导程序完成固件的升级。下面来浅析STM32 Bootloader设计。

首先谈谈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.跳转到新程序运行

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

  typedef void (*iapfun)(void); //定义一个函数类型的参数
  iapfun jump2app;
  __asm void MSR_MSP(u32 addr) //设置堆栈指针
  {
        MSR MSP, r0
        BX r14
  }
  //跳转到应用程序段
  //appxaddr:用户代码起始地址.
  void iap_load_app(u32 appxaddr)
  {
        if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
        {
              jump2app = (iapfun)*(vu32*)(appxaddr+4);//用户代码区第二个字为程序开始地址(复位地址),此处查看中断向量表可知
              MSR_MSP(*(vu32*)appxaddr);//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
              jump2app(); //跳转到APP,执行复位中断程序
        }
  }


  APP程序设计注意

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


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

  2.修改system_stm32f10x.c文件


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

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

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

1、函数原型:

void Jump_Address(void)

{

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

{

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

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

Jump_To_Application = (pFunction) JumpAddress;

__set_MSP(*(volatile u32*) ApplicationAddress);

                Jump_To_Application();

}

}

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点的写法。


推荐阅读

史海拾趣

Gould Ami公司的发展小趣事
包括电路板损坏、元件老化、接触不良等问题,可能导致脉冲信号异常或无法发出。
Furukawa Electric Co Ltd公司的发展小趣事
检查水泵电机是否损坏,轴承是否磨损。如有必要,可拆卸水泵进行检修或更换损坏部件。
德国ACAM公司的发展小趣事

2014年,ACAM公司迎来了一个重要的里程碑事件——被奥地利微电子股份有限公司收购。这次收购极大地增强了ACAM公司在时间数字转换器(TDC)技术领域的实力。奥地利微电子在半导体行业有着深厚的积累和丰富的经验,与ACAM公司的技术优势相结合,进一步提升了ACAM公司在市场上的竞争力。

DOMINANT公司的发展小趣事

为了进一步提升市场竞争力,统明亮公司在2016年推出了一款新型直角DomiLED产品。这款LED产品具有高光照强度、低热阻等特点,广泛应用于测光照明领域。新型直角DomiLED的推出,不仅丰富了统明亮的产品线,也进一步巩固了其在LED市场的领先地位。这款产品的成功推出,也充分展示了统明亮公司在LED技术创新方面的实力。

Data Translation Inc公司的发展小趣事

Data Translation Inc公司成立于1973年,初期专注于数据采集和处理技术的研发。在成立初期,公司就凭借对技术的深刻理解和敏锐的市场洞察力,成功开发了一系列具有创新性的数据采集和处理产品。这些产品不仅满足了当时工业界对高精度、高速度数据采集的需求,还引领了整个行业的发展方向。随着技术的不断进步和市场需求的不断变化,Data Translation不断推出新产品,逐渐确立了其在数据采集和处理领域的领先地位。

HAHN - Elektrobau GmbH & Co KG公司的发展小趣事

在高通的发展历程中,公司多次面临来自竞争对手的专利纠纷。面对这些挑战,高通积极应诉,通过长达数年的法律斗争,最终捍卫了自己的CDMA创新成果。这些胜利不仅彰显了高通在通信技术领域的深厚积累,也进一步巩固了其在行业中的技术领导地位。高通持续投入大量资源进行研发创新,确保了公司在全球蜂窝通信技术领域的领先地位。

问答坊 | AI 解惑

可视化超级耳挖勺

功能上可放大3500倍的放大率不用担心眼花看不清的问题,照明度又可调节、操作简单便捷很是划算的一款产品。而且能看见里面的样子。但是因为耳朵里面像迷宫一样曲曲折折,要不时地调整一下角度才能让自己看清 具有3500万像素,五倍放大率,而且亮度 ...…

查看全部问答>

利用FPGA 对外部芯片进行直通连线遇到的问题

背景介绍:        硬件架构FPGA+DSP ,   DSP的管脚信号wen,rdn,cs 通过FPGA IO 连接到外部RAM 中,这样做的目的考虑到FPGA可以访问DSP,或者设计为DSP也可以访问外部RAM,硬件设计兼容,不用修改硬件。 调试时遇 ...…

查看全部问答>

CCePngButtonST在数字屏中透明背景的png图片出现背景

CCePngButtonST在模拟屏中显示透明背景的png图片没有问题,但是换成数字屏之后应该透明的背景变成非透明的了,谁遇到过这种问题,应该如何解决?…

查看全部问答>

怎样学好网络技术?以黑客为目标

怎样学好网络技术 怎样学好网络技术?以黑客为目标 怎样一步一步的学习? 最好把应该学的东西从底到高列出来. 谢谢先。 …

查看全部问答>

新手请教USB烧录问题

君正4750的开发板烧录wince,按照提供的手册先后烧入boot.nb0和nk.nb0。 重启后,启动信息如下,一直停在DHCP那里进不了系统,请高手看一下是什么问题,谢谢! Microsoft Windows CE Ethernet Bootloader Common Library Version 1.1 Built Jan ...…

查看全部问答>

WPI BJ TI M3 Day - Stellaris family 技术培训会

         世平集团代理产品线 TI 的 Stellaris 产品系列凭借行业标准 ARM Cortex-M3 内核的通用处理能力和高级通信功能(包括 10/100 以太网MAC+PHY、CAN、USB OTG、USB 主机/器件、SSI/SPI、UART、I2S 和 I2C) 来满 ...…

查看全部问答>

帮忙解是一个问题!!!!

这是我的程序编译结束后的部分提示信息!!!我想知道两次提示存储器占用信息都是表示什么意思,两次有什么区别。谢谢!!!!! Copyright 1996-2004 IAR Systems. All rights reserved. Warning[Pe550]: varia××e \"year\" was set but neve ...…

查看全部问答>

怎样确认计算机并口工作正常啊?

连接好MSP-FET430P140仿真系统,但就是认不出FET device,不知道是不是并口的问题?…

查看全部问答>

我也来晒晒【POS机套件】

今天收到快递来的【POS机套件】,我也来晒晒,开始研究研究,还望有高手带领DIY最好: …

查看全部问答>