STM32F09x不使用BOOT脚实现System Bootloader升级代码

合集下载

STM32F09x不使用BOOT脚实现System Bootloader升级代码

STM32F09x不使用BOOT脚实现System Bootloader升级代码
/* 先解锁 */
FLASH_Unlock(); FLASH_OB_Unlock();
/* 再擦除,擦除完成后对 option bytes 进行修改更新*/ /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); if(status == FLASH_COMPLETE) {
2.方案设计
既然 STM32F04x 和 STM32F09x 甚至可以将 BOOT0 通过 Option Byte 中的 nBOOT0 来配置,那么基本的思路就是: 1) 在用户代码中,设置进入串口升级的条件(比如说使用复合按键,或者接收到串口发来的一串命令,等等);一旦 条件成立,就将 Option Byte 中关于 BOOT 的配置设置为:BOOT_SEL=0(BOOT0 信号由 nBOOT0 选项位定义), nBOOT1=1 & nBOOT0=0。然后进行复位,重载 Option Byte,这个时候系统就会进入 System Memory 中去运行 Bootloader。 2) 此时,打开 Flash Loader Demonstrator,可以进行下载,在下载之前我们要设置在烧写完程序后从 Bootloader 跳转 到用户代码,因为我们需要在用户代码中去将 BOOT 的配置修改为从 Main Flash memory 启动。如果不这么做,那 么每次复位后都将从 System memory 启动。 3) 从第二步可以看到,我们还需要在用户代码的最前面加入判断,如果 BOOT 的配置不是从 Main Flash memory 启动 的话,必须对 Option Byte 进行改写,将 BOOT 的配置设置为从 Main Flash memory 启动:BOOT_SEL=0 (BOOT0 信号由 nBOOT0 选项位定义),nBOOT1=1 & nBOOT0=1。

STM32单片机在线升级设计及实现

STM32单片机在线升级设计及实现
如 图 1 所示 ,有线方式系统通过RS232/485总线直接和 电脑连接,通 过 串 口 直 接 向 单 片 机 錢 更 新 数 据 。在无线升 级方式中配有G P R S 模块 ,通 过 G P R S 无线网络连接到上位 机 服 务 器 ,在 远 程 即 可 实 现 升 级 操 作 ,不 需 要 到 现 场 ,更加 便 捷 ,适用于设备安装分散或远距离的场合
本文以广泛应用的S T M 3 2 单片机为例,说明单片机在线 升级(即IAP—InApplicationProgramming)的设计及实现方式。 1 系统结构
S T M 3 2 单片机在线升级,一 般 通 过 U S A R T 串口将编译 后 的 新 代 码 数 据 发 送 到 单 片 机 实 现 ,有 线 、无 线 方 式 均 可 。可 以采用边发送边更新的方式,也可以采用“发送-存储-验证-更 新 ”的 方 式 ,后 者 将 数 据 存 储 在 Flash或 外 部 存 储 器 中 备 份 存 储 ,所有数据发送完并经检査确认无误后再更新到单片机,安 全 性 更 高 ,更 具 有 应 用 价 值 。
Flash主 存储区
员号
地址
页 0 0x0600 0000 - OxOGOO 07FF
ቤተ መጻሕፍቲ ባይዱ


页9 OxOSOO 4SOO - OxOSOO 4FFF
贝 10 0x0800 5000 - 0x0800 57FF
页 11 0x0800 5800 - 0x0800 5FFF


束 255 0x0B07 FSOO - 0x0807 FFFF
中图分类号:TP368.1
文献标识码:A
文章编号:1673-1131(2017 )06-0110-02

STM32-bootloader流程解析

STM32-bootloader流程解析

STM32 bootloader 流程解析stm32在内部有硬件bootloader,但那是在生产烧录时使用的。

stm32在flash开头的4K程序空间是可以设置成防擦除的,是天生的bootloader存放区。

我的思想是在开头的4K空间(0x8000000-0x8000FFF)放置一个独立程序,主程序编译地址放在0x8001000后端。

上电时,bootloader程序先判断是否满足升级条件(IO电平判断),然后选择是循环等待升级,或者直接跳转到主程序区。

现给出流程如下,大家可交流探讨。

BOOT流程.JPG (11.13 KB)boot程序流程程序流程详细.JPG (35.79 KB)程序详细流程说的太过简单笼统了,经过一个来星期的调试,总算完成了这个东西..调试中发现一个问题,在已经开始执行BOOT程序之后,再进行切换到应用程序时,有些中断会出问题.而在BOOT启动时(所有软硬件操作都没开始)马上切换到应用程序就不会出问题.一直没找到怎么解决.最后只好把IAP程序和应用程序合在一起使用,在上电后的短时间内执行IAP,无响应就进入应用程序,没有所谓的BOOT区了.stm32在flash开头的4K程序空间是可以设置成防擦除的,是天生的bootloader存放区。

我的思想是在开头的4K空间(0x8000000-0x8000FFF)放置一个独立程序,主程序编译地址放在0x8001000后端。

楼主所说的stm32在flash开头的4K程序空间是可以设置成防擦除的,如何设置?而且主程序编译地址放在0x8001000后端,如何实现啊,望指教!!!我最近也在做类似的事情,但是在跳转到功能程序出问题了。

功能程序应该如何设置?如果一个程序不从默认的Flash地址开始存储,需要设置哪些东西,在Keil 开发环境中。

谢谢!。

用IAP技术在线升级STM32单片机固件

用IAP技术在线升级STM32单片机固件

用IAP技术在线升级STM32单片机固件唐鹏程;汪旭明;胡力【摘要】针对嵌入式产品程序更新问题,提出了一种基于IAP技术的STM32单片机在线固件升级方案,设计了STM32单片机最小系统硬件电路和USB转串口通信电路,并给出了Bootloader程序、APP程序、PC上机程序的实现流程.实验结果表明,该方案具有简单实用、稳定性高、维护成本低和设备使用效率高的特点,适用于嵌入式产品升级.【期刊名称】《吉首大学学报(自然科学版)》【年(卷),期】2019(040)001【总页数】6页(P21-26)【关键词】嵌入式产品;IAP;STM32;固件升级;串口【作者】唐鹏程;汪旭明;胡力【作者单位】吉首大学物理与机电工程学院,湖南吉首416000;吉首大学物理与机电工程学院,湖南吉首416000;吉首大学信息科学与工程学院,湖南吉首416000【正文语种】中文【中图分类】TP311.1嵌入式产品在智慧医疗、智能家居、智慧城市等领域得到了广泛应用[1].STM32单片机具有运行速度快、片内资源丰富、成本低和功耗低的特点,因此国内诸多厂家越来越多地使用其开发嵌入式产品.嵌入式产品在使用过程中,因客户需求变化、产品升级等原因,需要对原有程序进行重新烧写.如果通过拆解设备来重新烧写新版本程序,势必造成系统开发及维护成本的急剧增加.在应用中编程(In Application Programming,IAP)技术利用总线或无线方式可以很方便地完成嵌入式产品的固件升级,从而降低维护成本.因此,笔者拟采用IAP技术在线升级STM32F103VET6单片机固件,并给出具体的实现方法.1 IAP技术原理IAP技术可以对存储APP程序的Falsh区域进行重新烧写[2],因此,利用IAP技术可以方便地通过预留的通信端口对嵌入式产品中的APP程序进行更新升级.相比传统方式,基于IAP技术的固件升级不需要拆解设备,不需要使用专用下载器[3],但需要将STM32F103VET6单片机内部的Flash手动划分为3个区域,用以存放Bootloader程序、升级参数及APP程序.在产品出厂时,需要使用ST-Link或者JTAG仿真器将Bootloader程序烧写到预先规划好的指定区域[4],并对该区域进行读写保护,防止升级过程中的误操作把Bootloader程序擦除.当需要对设备进行固件升级时,APP程序跳转到Bootloader程序.Bootloader程序首先擦除旧版本的APP程序,然后从串口读取新的固件数据,并将其写入APP程序所属的Flash区域中,从而完成APP程序的更新.2 硬件设计图1 升级方案的硬件结构Fig. 1 Hardware Structure of the Upgrade Scheme基于IAP技术的STM32单片机固件在线升级方案的硬件结构如图1所示.它主要由STM32微控制器、时钟电路、复位电路、SWD电路、USB转串口通信电路及电源电路组成.PC上位机通过USB数据线与USB转串口芯片相连,USB转串口芯片与STM32单片机的UART接口相连.PC上位机给STM32单片机发送升级命令,STM32单片机接收到升级指令后等待接收上位机发送升级的固件数据,从而实现固件的更新.2.1 STM32最小系统硬件电路升级系统使用型号为STM32F103VET6的微控制器,该芯片采用高性能的Cortex-M3 32位RISC内核,具有体积小、功耗低和片内资源丰富的特点[5].STM32最小系统硬件电路如图2所示,其工作电压范围为+2.0~+3.6 V,内核工作频率高达72 MHz.内置高速存储器,即512 kB的Flash和48 kB的SRAM.该芯片片上外设丰富,包含1个12位的ADC、4个通用16位定时器、2个I2C接口、3个SPI接口和5个USART接口.图2 STM32最小系统硬件电路Fig. 2 STM32 Minimum System Hardware CircuitSTM32单片机采用低电平复位,复位电路由10 kΩ电阻、0.1 μF电容及按键构成.当系统上电或按键按下时,NRST引脚和地相接,NRST被拉为低电平信号,从而实现复位.STM32的外部时钟源可以接高速(HSE)和低速(LSE)2组外部时钟:HSE 频率8 MHz,为整个系统提供时钟;LSE频率32.768 kHz,为RTC提供时钟.外部时钟通常由晶体振荡器产生,HSE和LSE都采用无源晶振,晶振的两侧有2个起振电容.为提高系统抗干扰能力,每组电源引脚下面放1个0.1 μF的滤波电容,模拟电源与数字电源用10 μH磁珠隔离,模拟电源与参考电源并联.2.2 SWD电路及启动配置电路图3 Bootloader程序固化电路Fig. 3 Bootloader Program Download Circuit 嵌入式产品出厂时需要将Bootloader程序固化在STM32芯片内,笔者采用SWD接口完成Bootloader程序的固化.在高速模式下SWD模式比JTAG更加可靠,且需要的引脚少,电路简单.Bootloader程序固化电路如图3所示,其中3V3与单片机电源相连,NRST与单片机复位引脚相连,SWDIO(数据线)和SWCLK(时钟线)分别与PA13和PA14相连.产品出厂时将ST-Link V2仿真器与嵌入设备的SWD接口相连,使用ST-Link utility软件完成Bootloader程序的固化.STM32单片机有3种不同的启动方式,其参数设置列于表1.BOOT启动电路如图4所示.从图4可以看出,BOOT0和BOOT1引脚分别串联10 kΩ电阻.电路中的R11和R12不需要焊接,STM32从内部的FLASH启动.表1 参数设置Table 1 Parameter SettingBOOT0BOOT1启动方式 0X内部FLASH10系统存储器/ISP模式11内部SRAM图4 BOOT启动电路Fig. 4 BOOT Launch Configuration Circuit2.3 USB转串口电路为确保PC上位机与STM32单片机正常通信,本升级系统采用型号为CH340G的USB转口芯片.STM32单片机的USART1经过CH340芯片与PC上位机的USB口相连.USB转串口电路如图5所示.其中Y3是频率为12 MHz的石英晶体,C27和C28是容量为22 pF的高频瓷片电容,CH340是一个USB总线的转接芯片.CH340芯片内置了USB上拉电阻,UD+和UD-引脚直接连接到USB总线上,V3引脚外接0.1 μF的电源退耦电容,TXD和RXD分别与STM32单片机的PA10和PA9连接.图5 USB转串口电路Fig. 5 USB to UART Interface Circuit2.4 电源电路STM32单片机的工作电压为3.3 V,本设计中使用的电源转换芯片是AS1117-3.3.系统使用外接DC5V电源,并串联1个拨动开关来控制整个电源的通断.为了增强电源的抗干扰能力,5 V直流电源经电容C1和C2滤波,再经AS1117-3.3稳压为3.3 V后,输出给STM32单片机最小系统.电源电路如图6所示,其中绿色发光二极管D1为电源指示灯,自恢复保险F1起短路保护作用,瞬态抑制二极管D2可防止电源反接.图6 电源电路Fig. 6 Power Circuit3 软件设计笔者设计的在线升级系统需要对STM32单片机内部的Flash进行预先规划,系统软件主要由Bootloader程序、APP程序和PC上机程序组成.Bootloader程序和APP程序使用C语言编程,具有非常好的可移植性和可读性.3.1 Flash空间划分图7 STM32F103VET6内部Flash的存储地址分配Fig. 7 Code Layout in Flash Memory of STM32F103VET6STM32F103VET6的Flash总大小为512 kB,地址范围从0x0800 0000-0x0807 FFFF.根据STM32单片机固件在线升级的需要,将其划分为3个作用不同的区域,具体划分如图7所示.Bootloader程序的存储地址为0x0800 0000-0x0800 27FF,共10 kB;升级标志信息的存储地址为0x0800 2800-0x0800 2FFF,共2kB;APP程序的存储地址为0x0800 3000-0x0807 FFFF,共500 kB.Bootloader程序和APP程序的存储区域相互独立,只存在简单的跳转关系.为了使程序从Flash启动,需要将启动配置电路的BOOT0和BOOT1引脚配置为0.3.2 Bootloader程序设计图8 Bootloader程序流程Fig. 8 Flow Chart of Bootloader Program Bootloader程序存储在STM32F103VET6单片机内部Flash的0x0800 0000-0x0800 27FF区域.系统上电或复位后,Bootloader程序从0x0800 0000地址处开始执行.系统初始化完成之后,便读取存储在0x0800 2800-0x0800 2FFF的升级标志信息[6] .Bootloader程序根据升级标志Updata_flag的值来判断是否需要更新程序[7],若升级标志Updata_flag的值是0x55,则进入升级状态.首先擦除APP程序区域;然后循环接收更新的固件数据,并将其写入指定的APP程序区域;接收完成后修改Updata_flag值为0xAA,并执行跳转子程序以引导运行新版的APP程序.若Updata_flag的值是0xAA,则不需要升级,继续运行旧版的APP程序.Bootloader程序的流程如图8所示,其中跳转子程序C语言代码的主要部分如下:if (((*(_IO uint32_t*)ApplicationAddress) & 0x2FFE0000) == 0x20000000) {JumpAddress = *(_IO uint32_t*) (ApplicationAddress + 4);Jump_To_Application = (pFunction) JumpAddress;_set_MSP(*(_IO uint32_t*) ApplicationAddress);Jump_To_Application();}3.3 APP程序设计图9 APP程序流程Fig. 9 Flow Chart of APPAPP程序存储在STM32F103VET6单片机内部Flash的0x0800 3000-0x0807 FFFF区域,除了执行正常的功能程序外,还能够时刻检测PC上位机发送过来的升级指令.当系统接收到升级指令之后,APP程序首先将存储在升级参数区域的升级标记Updata_flag的值修改为0x55,然后进行软件复位,程序便重新从0x0800 0000处运行Bootloader程序.APP程序的流程如图9所示,参数设置如下:(1)设置偏移向量表.需要在程序中使用库函数NVIC_SetVectorTable(ApplicationAddress,IAP_FLASH_SIZE)来设置偏移向量表,其中ApplicationAddress设置为0x0800 3000,IAP_FLASH_SIZE设置为0x2800.(2)设置软件复位方法.使用库函数NVIC_SystemReset()实现软件复位.(3)修改ROM范围.APP程序ROM区域的起始地址为0x0800 3000,大小为0x7D000,即500 kB.3.4 PC上位机程序设计图10 PC上位机界面Fig. 10 PC Upper Computer Interface上位机开发平台使用的是Visual Studio 2015,开发语言为C#.C#是一种简单、先进、面向对象和类型安全的编程语言,具有开发速度快的优点[8].为了实现基于IAP技术的STM32单片机固件在线升级,上位机通过USB数据线与STM32F103VET6进行通信.设计的上位机软件界面如图10所示.上位机操作流程如下:(ⅰ)用户连接好设备,在PC机上运行上位机软件,波特率设置为115 200,选择COM口,打开串口.(ⅱ)升级固件bin文件.用户点击打开文件按钮,从本地PC机中选择编译好的bin 文件.利用 MDK 软件自带的格式转换工具fromelf.exe实现axf文件到bin文件的转换.(ⅲ)用户点击下载固件按钮,上位机发送“Up_date_APP”命令;STM32单片机接收升级指令后,立即跳转到Bootlaoder程序接收升级固件的数据.4 升级测试实验为了验证基于IAP技术的单片机固件升级方案的稳定性和可靠性,笔者选择不同大小的固件文件进行升级测试.固件文件类型为bin文件,单个固件文件下载次数为50次,被测试的硬件实物如图11所示.测试结果表明,当固件文件的大小为25,39,53,71,135 kB时,成功升级率均达到了100%.图11 硬件实物Fig. 11 Picture of the Hardware5 结语基于IAP技术的STM32单片机固件升级的实现,使得STM32嵌入式产品的固件更新更加便捷和高效,降低了系统开发和设备维护成本.实验测试证明,该技术方案具有较好的可行性、稳定性和可靠性,可以广泛地应用于STM32嵌入式设备的固件升级,具有很好的实际应用价值.参考文献:【相关文献】[1] 杜沂东,刘兆栋.大型嵌入式设备运行能耗在线控制仿真[J].计算机仿真,2018,35(3):225-308.[2] XU Q.A Design and Implement of IAP Based on HTTP[C].International Conference on Computer Science and Service System.Nanjing,China:IEEE,2011:1 918-1 922.[3] 刘根贤,龚雪容,生拥宏,等.基于高频RFID的微处理器IAP技术[J].电子技术应用,2013,39(4):29-31.[4] 曹欲晓,韩冬,徐金宝.一种基于CPUID和AES算法的STM32固件升级方案[J].电子技术应用,2015,41(3):28-30.[5] 康燕萍,程小辉,黄鹏.基于STM32系列电子产品的IAP研究[J].现代电子技术,2017,40(22):142-144.[6] 诸德宏,张介环.具有远程升级功能的小区电能监测系统[J].电子器件,2014(4):733-736.[7] 童世华,李毅,谢磊.无线传感器网络节点远程升级设计与实现[J].电子器件,2017,40(5):1 287-1 291.[8] 杨勇,李晶.基于无线传感网络的矿井水质在线监测系统开发与试验[J].电子器件,2018,41(1):219-224.。

STM32F0的BOOT配置及相关话题

STM32F0的BOOT配置及相关话题

STM32F0的BOOT配置及相关话题关于STM32F0 系列的启动配置,有人说有点看不太懂,貌似有两套启动方式,又是脚又是选项位的。

其实,它跟其它STM32 系列一样也是有三种启动模式,只是配置方式上有其特色。

它有两种配置方式,第一种是利用BOOT0物理脚和Nboot1、Boot_Sel 选项位来确定启动模式;第二种只使用Boot_Sel、Nboot1 、Nboot0 三个选项位来确定启动模式,完全省却了物理脚,多出一根脚给用户应用。

对于第一种配置方式,所有STM32F0 系列的芯片都适用。

第二种配置方式仅适用于STM32F04X 和STM32F09X 系列的器件。

下图是STM32F0系列启动模式配置表。

红色方框内就是上面所指的第一种配置方式,对所有STM32F0芯片适用。

图表中的灰色区域就是前面所说的仅适用于STM32F04X 和STM32F09X 的配置方式,可以看出,对于STM32F04X 和STM32F09X 到底使用哪种配置方式取决于Boot_Sel 选项位。

对于非STM32F04X 和STM32F09X 的32F0 系列芯片,配置方式只能使用第一种配置方式,此时Boot_Sel 固定为1。

这里不妨说说第一种配置方式,该方式对所有STM32F0芯片都适用。

BOOT0 脚置高、置低简单,Nboot1、Boot_Sel 选项位怎么定的呢?Nboot0 、Nboot1、Boot_Sel 选项位在用户选项字节里,一起来看看。

显然,从其出厂的默认初始值可以看出,Nboot0、Nboot1、Boot_Sel 选项位的默认值均为1,即默认为第一种配置方式。

如果此时BOOT0 脚为1则从system memory 启动,即从芯片内嵌的BOOTLOADER 启动。

如果此时BOOT0 脚为0,则从main flash memory 启动,进入用户程序。

针对STM32F04X/STM32F09X 的第二种配置方式,这里就不多说了。

手把手教你写STM32bootloader(SDIO读取TF更新Bootloader)

手把手教你写STM32bootloader(SDIO读取TF更新Bootloader)

手把手教你写STM32的bootloader(SDIO读取TF卡更新固件)作者:谭建裕1、bootloader的简介及作用什么是bootloader?本人不知道该怎么说,反正会来看这篇都是知道自己要干嘛的。

不过bootloader的作用还是要提提的,bootloader最直观的作用就方便,比如你用单片机给人家做了一款产品,后期你的产品固件需要更新的时候,你总不能带着电脑直接去客户那里拆开产品给单片机下程序吧?也不能教客户怎么给单片机下程序吧?用户体验感太差。

其实本质上bootloader的也是一个完整的程序,也有main函数,有自己的中断向量表,栈顶指针,它可以检查有没有新的固件,如果有,则将新的固件的数据写入到我们指定的flash地址中,之后跳到新的程序中去就OK了。

此时bootloader的优势就来了,bootloade更新固件有很多种方式,本人在这里只详细讲解一种,搞懂一种之后,其它的都好办,因为它们的思路都是一样的。

Bootloader 的主体原理是:首先将bin文件的数据复制到特定的地址。

然后设置中断向量表,设置MSP主堆栈指针(具体请看CM3权威指南),设置复位向量。

然后就没有然后了。

2、bootloader 涉及的知识本人在此讲解的是STM32通过读取TF 内的bin 文件数据来更新固件。

这里牵扯到STM32的SDI0外设,FATFS 文件系统,STM32的flash 读写操作。

2.1SDIOSDIO 是STM32的外设,需要注意的是只有100引脚及以上的才 有。

电路原理图如图2-1-1所示。

图2-1-1注意:在使用TF 之前必须保证TF 卡格式为FAT32,单元大小为2048。

如图2-1-2所示。

PC10 PC11 PD2" PC12 PC8 PC9T3V3图2-1-2记得在stm32f10x_it.c文件中添加中断函数。

如图2-1-3所示。

140/*Addherethe工literruptHandlerfortliEusedperiph^141/*availaloLeperipheralinterrupthandler1snameplea:142/*file(startup_stm32f'10x_xx.s).1A Q/±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±■:144□/*145* 146* 147148149150 函数名:SDIO_IRQ:EiBIlGllE工描述:在SDlO_lTConfig()这个函数开启了sdio中断,数据传输结東时产主中断输入:无输出:无151^include1T sd.iosdcard.h,T 152void SDIO_IRQHandler(void) 153E]{154 155 156L}/*ProcessAllSDIO:Eiiterrupt SD_ProcessIRQSrc();Sources图2-1-32.2FATFS文件系统移植和使用文件系统使用的是FATFS9,源码在压缩包的ff9文件夹,如图2-2-1所示。

STM32两个BOOT引脚的作用

STM32两个BOOT引脚的作用STM32微控制器系列中的两个BOOT引脚是用于控制启动模式的引脚,它们分别是BOOT0和BOOT1引脚。

这两个引脚在不同的组合下可以选择不同的启动模式,包括从Flash、从系统存储区域、从备份域、从系统升级、从用户程序或者从外部设备启动等。

下面是对这两个引脚的详细介绍及其作用。

1.BOOT0引脚:BOOT0引脚用于选择系统启动模式。

它是一个IO引脚,通过外部电平高低来选择启动模式。

a. 当BOOT0引脚为低电平时,STM32芯片将以普通模式启动,即从Flash存储器中加载应用程序代码来启动。

b. 当BOOT0引脚为高电平时,STM32芯片将进入Bootloader或System memory模式启动。

2.BOOT1引脚:BOOT1引脚用于选择系统存储器。

它是一个IO引脚,通过外部电平高低来选择存储器类型。

a. 当BOOT1引脚为低电平时,STM32芯片将从主Flash存储器中启动。

b. 当BOOT1引脚为高电平时,STM32芯片将从系统存储器或备份存储器中启动。

这个存储器可以是Flash、RAM或EEPROM等。

两个BOOT引脚的不同组合可以选择不同的启动模式,如下所示:1. 低电平 + 低电平:普通模式启动,从Flash存储器启动。

2. 高电平 + 低电平:Bootloader模式启动,从Flash存储器启动。

3. 高电平 + 高电平:System memory模式启动,从系统存储器启动。

总结来说,BOOT0和BOOT1引脚用于选择STM32芯片的启动模式和存储器类型。

通过简单的高低电平的设置,可以选择从不同的存储器中启动,并灵活应对各种应用需求。

这种灵活性使得STM32微控制器系列在软件开发、固件升级等方面具有较大的可定制性和可扩展性。

如何使用STM32通用Bootloader让OTA更加Easy

如何使用STM32通用Bootloader让OTA更加Easy
 随着物联网时代到来,越来越多的智能设备拥有了在线升级的能力,无论是系统更新,产品功能迭代还是漏洞修复都能在第一时间抵达用户手中的智能设备。

 在线升级功能需要使用OTA (Over-the-Air) 技术,OTA 技术简单地说就是通过网络来升级手中的智能设备,进而使用设备最新版本的功能。

而OTA 技术中必不可少的一环就是通过Bootloader 来管理、升级设备固件。


 由于OTA 功能由多种复杂技术组成,因此添加OTA 功能有一定的技术门槛。

很多开发者遇到莫名其妙的问题,进而导致OTA 升级失败,常见问题如下:
 升级过程缺少专业的安全机制
 APP 无法正常启动
 程序莫名跑飞,出现hardfault。

STM32在复杂系统中实现固件自动升级的方法

STM32在复杂系统中实现固件自动升级的方法宋宇宁【摘要】In the paper,a method of firmware automatic updating in complicated hardware system through STM32 microcontroller is proposed.The ARM architecture STM32 microcontroller firmware transmission,storage and automatic upgrade are achieved through Ethernet and SPI interface.Spartan-6 series FPGA of Xilinx firmware download and upgrade are achieved through the STM32 microcontroller and JTAG protocol.In the paper,the realization principle and development flow of the firmware automatic upgrade method are introduced in detail.Some source codes and program flow chart are also provided.By the actual product verification,the method greatly enhances the efficiency of on-site hardware updating and maintenance,saves the service costs,and improves the stability of the product effectively.%提供了一种应用STM32微控制器实现在复杂的硬件系统中完成固件自动升级的方法.通过以太网和SPI接口实现了ARM架构STM32微控制器固件的传输、存储和自动升级;通过JTAG接口协议实现了STM32微控制器对Xil-inx公司Spartan-6系列FPGA固件的下载和升级.文中详细介绍了固件自动升级方法的实现原理和开发流程,并提供了部分源码及程序流程图.经实际产品验证,该方法极大提升了现场升级维护硬件的效率,节约了服务成本,提高了产品的稳定性.【期刊名称】《单片机与嵌入式系统应用》【年(卷),期】2017(017)011【总页数】5页(P22-26)【关键词】固件自动升级;STM32;微控制器;以太网;FPGA【作者】宋宇宁【作者单位】沈阳新松机器人自动化股份有限公司,沈阳110168【正文语种】中文【中图分类】TP368.1伴随着市场上工业自动化及大型医疗器械产品的竞争加剧,产品的毛利润不断压缩,降低产品的服务成本、提升产品的服务收益已经成为企业利润成长的重要形式。

STM32的程序升级

STM32的程序升级ISP,IAP,DFU:ISP:是为了解决烧写MCU必须将芯⽚从⽬标板拆下来才能烧写的问题;ISP下每家芯⽚内部的的bootload 都不同,不通⽤。

bootloader在芯⽚复位(或者上电)时,会优先于⽤户⾃⼰的代码启动。

这段代码会⾸先检测芯⽚的指定引脚上有没有特定的信号,如果没有,则跳⼊⽤户程序执⾏。

否则就按照bootloader特定的通信协议,与计算机进⾏握⼿,并最终触发计算机将新的程序通过通⽤接⼝(如串⼝)传送到芯⽚。

IAP:芯⽚内部有⼚家的固定boot,但bootloader需要在固定引脚,通过串⼝,以固定的协议传送程序。

如果你对这个过程的任何⼀点不满意,那你就要⾃定义bootloader、DFU:也就是usb boot,usb在单⽚机上和pc有两种配合⽅法:VCP模式:PC端通过安装VCP usb drive和MCU的APP进⾏业务通信DFU模式:PC端通过安装DFU usb drive和MCU的bootload(⾃定义)进⾏通信。

此时进⼊boot有两种模式:reset复位或者电源掉电的硬件⽅式;或者MCU解析PC发送的内容后进⾏的软复位⽅式。

程序升级的⽂件:HEX、binHEX⽂件:特点:适合ISP,不适合FOTA(因为HEX开始有ISP升级的头字段);KEIL中的⽣成:Options -> Output 下勾选Create HEX File BIN⽂件:真正升级的⼆进制⽂件字节流,尺⼨⼩,适合FOTA;KEIL中⽣成⽅法:User选项卡下⾯的 After Build/Rebuild 设置并打钩:fromelf --bin !L -o .\BIN\FOTA.bin。

程序升级过程:在APP运⾏过程中,如果条件触发(按键按下、串⼝收到指定命令或者字符,从指定存储位置读取的版本号⽐当前新),此时APP会从指定的源头(/USB/SD/⽹页服务器)把APP_new.bin⽂件⼀次性或者分包拷贝到MCU的备份区(MCU的flash备份区、外部FLASH),置位需要更新程序的标志到⾮易失存储位置(RTC的BKP区、MCU的EEPROM/FLASH区、外部的eerom/flash区),然后让程序跳转到IAP程序中(复位跳转、直接跳转);在IAP程序中,若有升级标志则先擦除APP_RUN—FLASH,然后将备份区的内容拷贝到此运⾏区并做好校验,然后继续跳转会运⾏程序区(复位、直接跳转);若⽆升级标志或者过⼀定时间⽆操作则跳会APP运⾏程序区;运⾏APP程序(开始注意NVIC需要重定向NVIC_SetVectorTable(NVIC_VectTab_FLASH,APP_StartAddr),并继续监控是否需要升级。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.程序设计 main()主程序如下:
int main(void) {
/*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f0xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f0xx.c file
“Grey options are available on STM32F04x and STM32F09x devices only.”
意思是说,灰色部分对 STM32F04x 和 STM32F09x 是有效的。也就是说,除了 BOOT1 是在 Option Byte 中的 nBOOT1 配置 之外,STM32F04x 和 STM32F09x 甚至可以将 BOOT0 通过 Option Byte 中的 nBOOT0 来配置,只要将 Option Byte 中的 BOOT_SEL 位配置为 0。这使得纯粹使用软件来实现进入 System Memory 中的 Bootloader 来进行串口升级成为可能。
OB->DATA0 = ob[2];
status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
if(status == FLASH_TIMEOUT)
while(1) ;
//ERROR
FLASH->CR &= ~FLASH_CR_OPTPG;
FLASH->CR |= FLASH_CR_OPTPG;
status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
if(status == FLASH_TIMEOUT)
while(1) ;
//ERROR
FLASH->CR &= ~FLASH_CR_OPTPG;
FLASH->CR |= FLASH_CR_OPTPG;
调研
1.认识一下 STMF09x 和 STM32F04x 在 Boot Configuration 中的新特性
打开参考手册 RM0091,翻到 Boot Configuration 那一节,我们可以看到 Table 3 中对 Boot Mode 进行了描述,如下:
从表格中,我们先来看一下第 1 条注释:
STM32F09x 不使用 BOOT 脚实现 System Bootloader 升级代码
前言
众所周知,使用 STM32 时,当需要使用 System Memory 中的 Bootloader 进行代码升级的时候,需要将 BOOT0 脚拉高,复 位后才能进入 Bootloader 程序,使用 Flash Loader Demonstrator 等工具进行串口烧写升级。这就需要在 BOOT0 这个引脚上 留出按键或者是跳线脚。但是,STM32F09x 具有一项新的特性,使不必使用 BOOT 脚而进行串口升级成为可能。我们来共 同探讨一下。
OB->USER = ob[1];
status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
if(status == FLASH_TIMEOUT)
while>CR &= ~FLASH_CR_OPTPG;
FLASH->CR |= FLASH_CR_OPTPG;
*/ /* 以下两行代码,是将向量表映射为 Main Flash memory,否则从 Bootloader 跳转到用户
代码时,将无法正常工作。如有不清楚之处,请参考另外一份文档: 《STM32F091 从自举程序向应用程序跳转的问题与解决》 */ RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; SYSCFG->CFGR1 = (uint32_t)0x00000000;
FLASH->CR |= FLASH_CR_OPTPG;
OB->WRP0 = ob[4];
status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
从这个思路出发,我们可以得到需要设计的流程图。
主程序的流程图如下:
当进入串口升级的条件成立时,其流程如下:
实验
1.设计目标
使用 NUCLEO-F091RC 来实现此实验。空片进行第一次烧写时使用 SWD 进行烧写,之后所有的.hex 文件再次烧写都将使用 Flash Loader Demonstrator 进行下载。不使用 BOOT0 脚。由于只是实验,这里用按下 USER 按键来代表进入串口烧写的条 件,用户代码运行 LD2 闪烁的功能。
2.方案设计
既然 STM32F04x 和 STM32F09x 甚至可以将 BOOT0 通过 Option Byte 中的 nBOOT0 来配置,那么基本的思路就是: 1) 在用户代码中,设置进入串口升级的条件(比如说使用复合按键,或者接收到串口发来的一串命令,等等);一旦 条件成立,就将 Option Byte 中关于 BOOT 的配置设置为:BOOT_SEL=0(BOOT0 信号由 nBOOT0 选项位定义), nBOOT1=1 & nBOOT0=0。然后进行复位,重载 Option Byte,这个时候系统就会进入 System Memory 中去运行 Bootloader。 2) 此时,打开 Flash Loader Demonstrator,可以进行下载,在下载之前我们要设置在烧写完程序后从 Bootloader 跳转 到用户代码,因为我们需要在用户代码中去将 BOOT 的配置修改为从 Main Flash memory 启动。如果不这么做,那 么每次复位后都将从 System memory 启动。 3) 从第二步可以看到,我们还需要在用户代码的最前面加入判断,如果 BOOT 的配置不是从 Main Flash memory 启动 的话,必须对 Option Byte 进行改写,将 BOOT 的配置设置为从 Main Flash memory 启动:BOOT_SEL=0 (BOOT0 信号由 nBOOT0 选项位定义),nBOOT1=1 & nBOOT0=1。
//RDP //USER //DATA0 //DATA1 //WRP0 //WRP1 //WRP2 //WPR3
/* 判断 BOOT 配置是否正确并更新 */ /* 当从串口烧写完代码之后,从 Bootloader 跳转到用户代码,我们需要将 BOOT 配置设置回来,
修改为从 Main Flash memory 启动;平时已经是此设置的时候,就不需要修改了 */ if((ob[1] & 0x0098) != 0x0018)//判断是否是“BOOT_SEL=0 且 nBOOT1=1 且 nBOOT0=1”, 否则更新 {
问题
某客户在其产品的设计中,使用了 STM32F091RCT6,产品在出厂后将来可能由于功能的升级需要升级代码。由于外观的需 要,客户不希望留一个用于升级的按键或是跳线槽在外边。希望能够是通过接收串口命令来实现启动升级,又希望能够直接 使用 System Memory 中的 Bootloader 进行代码升级。
void BOOTCONF_User(void) {
FLASH_Status status = FLASH_COMPLETE; /* 定义一个 8 个半字的数组用来存放 option bytes 的数据 */ uint16_t ob[8];
/* 读取 Option Bytes 的数据 */ ob[0] = *(uint16_t*)(0x1FFFF800); ob[1] = *(uint16_t*)(0x1FFFF802); ob[2] = *(uint16_t*)(0x1FFFF804); ob[3] = *(uint16_t*)(0x1FFFF806); ob[4] = *(uint16_t*)(0x1FFFF808); ob[5] = *(uint16_t*)(0x1FFFF80A); ob[6] = *(uint16_t*)(0x1FFFF80C); ob[7] = *(uint16_t*)(0x1FFFF80E);
/* Enable the Option Bytes Programming operation */
FLASH->CR |= FLASH_CR_OPTPG;
/* Restore the last read protection Option Byte value */
OB->RDP = ob[0];
/* 主循环进行闪灯,随时等待按键中断以启动串口烧写 */ while (1) {
/* Toggle LD2 */ STM_NUCLEO_LD2Toggle(); /* Inset delay */ Delay(0xAFFFF); } }
BOOTCONF_User()就是我们思路中的第 3)步,也是我们所关心的,我们来仔细看代码:
OB->DATA1 = ob[3];
status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
if(status == FLASH_TIMEOUT)
while(1) ;
//ERROR
FLASH->CR &= ~FLASH_CR_OPTPG;
/* 先解锁 */
相关文档
最新文档