STM32+IAP方案 实现网络升级应用固件

发布者:自由思考最新更新时间:2017-09-29 关键字:STM32  IAP  网络升级 手机看文章 扫描二维码
随时随地手机看文章

关注了这个概念有些日子了,这段时间总算有机会实战==网络升级应用固件,这里记录下遇到的问题,及解决方案。 
原理与网上流传的串口作为传输手段 一致;不同之处,无非我这里使用了网络设备传输。==(lwip)TFTP客户端的应用. 
参考: 
IAR环境下STM32+IAP方案的实现 
STM32浅谈之IAP.pdf 
基于IAP和Keil MDK的远程升级设计 
keil MDK中如何生成*.bin格式的文件


概况:

  • 什么是IAP,为什么要IAP

  • 可实现的原理

  • 实现过程

  • 细节及实现 
    以上基本都可以从【IAR环境下STM32+IAP方案的实现】中找到答案。这里只是贴图,醒目: 
    IAP框架布局: 
    这里写图片描述 
    STM32F103ZET6的启动方式有三种:内置FLASH启动、内置SRAM启动、系统存储器ROM启动,通过BOOT0和BOOT1引脚的设置可以选择从哪中方式启动,这里选择内置的FLASH启动。其FLASH的地址为0x08000000—0x0807ffff,共512KB,这些都能从芯片数据手册中直接得到。而这里首要的一个问题是中断的问题。正常情况下发生中断的过程为:发生中断(中断请求),到中断向量表查找中断函数入口地址,跳转到中断函数,执行中断函数,中断返回。也就是说在STM32的内置的Flash中有一个中断向量表来存放各个中断服务函数的入口地址,内置Flash的分配情况大致如下图2-1。 
    这里写图片描述 
    这里写图片描述 
    这里写图片描述 
    这里写图片描述 
    在内置的Flash里面添加一个BootLoader程序,BootLoader程序和user application各有一个中断向量表,假设BootLoader程序占用的空间为N+M字节,则程序的走向应该如图2-2所示(借用网友的原图并做改动,其中虚线部分为原图步骤④⑤的走向,本人改为指向灰色部分)。 
    这里写图片描述 
    上电初始程序依然从0x08000004处取出复位中断向量地址,执行复位中断函数后跳转到IAP的main(标号①所示),在IAP的main函数执行完成后强制跳转到0x08000004+N+M处(标号②所示),最后跳转到新的main函数中来(标号③所示),当发生中断请求后,程序跳转到新的中断向量表中取出新的中断函数入口地址,再跳转到新的中断服务函数中执行(标号④⑤所示),执行完中断函数后再返回到main函数中来(标号⑥所示)。 
    对于步骤④⑤,网友认为是:“在main执行的过程中,如果CPU得到一个中断请求,PC指针仍强制跳转到地址0x08000004中断向量表处,而不是新的中断向量表,如图标号④所示,程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示”。我对此的理解是:“当发生中断后,程序从0x08000004(旧)处的中断向量表中得到相应的中断服务函数入口地址,继而跳转到相应的中断服务程序”。但是旧的中断向量列表里边存放的是IAP程序中断函数的入口地址,它是如何得到user程序中断函数的入口地址呢?所以我觉得此种说法是错误的。“当发生中断时PC指针强制会跳转到0x08000004处”这种说法并没有错,只是忽略了后续的一些知识要点而导致这个说法出现矛盾。 
    对于步骤④⑤我认为的是,在main函数的执行过程中,如果CPU得到一个中断请求,PC指针本来应该跳转到0x08000004处的中断向量表,由于我们设置了中断向量表偏移量为N+M,因此PC指针被强制跳转到0x08000004+N+M处的中断向量表中得到相应的中断函数地址(待求证),再跳转到相应新的中断服务函数,执行结束后返回到main函数中来。


IAP流程描述:

1、IAP的bootloader引导程序

IAP在应用中编程,可以拓展成远程网络更新应用固件。 
片内的flash,至少划分成2个分区,对应至少两个完整的程序; 
低地址分区端推荐放入IAP程序==bootloader引导程序(这里边的手段可以是串口、网络等不同的方式),高地址分区端推荐烧写app固件。 
关键点提及: 
IAP程序中,当满足跳转条件(被触发)时,执行跳转代码到app应用固件程序,跳转代码流程: 
至少需要设定跳转目的地的app应用固件 栈顶指针,:

/* Initialize user application's Stack Pointer */__set_MSP(*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);12

其中,app应用固件的分区地址:

#define USER_FLASH_FIRST_PAGE_ADDRESS 0x080090001

2、app应用固件

需要两处的更改,不然错误未知 
IROM设置如图: 
这里写图片描述 
中断向量表偏移: 
这里写图片描述

NVIC_SetVectorTable(NVIC_VectTab_FLASH,VectorTable_Offset);1

其中:

#define NVIC_VectTab_FLASH           ((uint32_t)0x08000000)#define VectorTable_Offset  0x9000 12

查错:

如果做了上边的工作,IAP依然无法顺利执行跳转至app应用程序,可以查看.map和.bin文件,确定是否如实的改变的中断向量表的偏移和栈顶指针,如图: 
这里写图片描述 
.bin文件: 
这里写图片描述 
可以看到,主栈顶MSP地址=0x2000C8C8、reset_handler地址=0x08009189 
如此,才能生效,否则,可能原因: 
修改后的向量表偏移,在之后的程序中,又再次被还原,通过如下的函数:

void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);void SystemInit (void);
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;123

附:

1、如需要.hex文件转.bin,参见上边的文章 
当然,就算使用.hex文件,同样可以升级,只是需要修改IAP中判定已经升级的文件是否有效,文件条件部分的代码,

if(((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20000000)1

2、地址偏移后的app应用程序,是否能够独立的运行? 
不能,理由: 
这里写图片描述 
可知,开机上电并不能够找到我们指定的偏移后的向量表。


关键字:STM32  IAP  网络升级 引用地址:STM32+IAP方案 实现网络升级应用固件

上一篇:STM32_SPI多机通信的实现——整理自网络
下一篇:IAR+STM32固件库 启动文件startup_stm32f10x_hd.s功用及注释

推荐阅读最新更新时间:2024-03-16 15:39

STM32笔记之十四:基本问题,来讨论一下软件架构
网上大家都在讨论和学习,但是对于架构这个基本问题却没几个人讨论。个人认为有个好的架构是写好代码的基础,可以使后期的调式工作事半功倍!! 1、 架构组成:我的程序代码分为四种结构 a) 顺序执行代码 定义:按照顺序逐行执行的代码 优点:是思路简单,代码可靠不易被干扰。 缺点:占用资源 用途:只用来各种变量、函数的定义,硬件的初始化程序 位置:main.c的开始一直到main函数的while函数之前 b) 空闲执行代码 定义:在CPU空闲的时候才执行的代码 优点:不占用资源 缺点:执行的实时性不能保证 用途:非实时任务,调试信息输出,不重要的状态指示 位置
[单片机]
STM32 控制lcm液晶ILI9341驱动的液晶驱动程序(续)
在做项目的过程中遇到了这个问题,感觉文章写得不错,共享给对FSMC的使用怀有疑惑的同伴们! LCD有如下控制线: CS:Chip Select片选,低电平有效 RS:Register Select寄存器选择 WR:Write写信号,低电平有效 RD:Read读信号,低电平有效 RESET:重启信号,低电平有效 DB0-DB15:数据线 假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多): 如果情况如下: DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。 CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效) RS为1(表示DB0-15上传递的是
[单片机]
STM32之SDIO例程
移植ST官方demo,做了部分修改 #include stm32f10x.h #include sdio_sd.h /* RCC时钟配置 */ void RCC_config(void) { ErrorStatus HSEStartUpStatus; /* RCC寄存器设置为默认配置 */ RCC_DeInit(); /* 打开外部高速时钟 */ RCC_HSEConfig(RCC_HSE_ON); /* 等待外部高速时钟稳定 */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /*
[单片机]
STM32单片机学习---PWM输出
上午花了半天时间熟悉了stm32的PWM模块。中午利用午饭时间把PWM功能调试成功。当然,很简单的东西,也许很多前辈估计都不屑一顾的东西。 今天最大的感叹就是网络资源实在是个巨大的宝库,真的很庆幸,在这个复杂的社会环境里,在一个到处充斥着私心、私利的时代,各个网站,各个论坛上的众多网友都时刻保持着开源的氛围。学习一定要和他人交流,而网络提供了这么一个极好的平台。 废话少说,言归正传。 实现功能:采用定时器2的通道2,使PA1输出频率1K,占空比40的PWM波形,用PA8随意延时取反led灯,指示程序运行。 首先熟悉一下定时器的PWM相关部分。看图最明白 其实PWM就是定时器的一个比较功能而已。 CNT里的值不断++,一
[单片机]
<font color='red'>STM32</font>单片机学习---PWM输出
STM32系列第1篇--初探
Cortex-M3属于ARM V7架构(ARM 7不等于ARM V7) ARM V7 三大系列: A系列 安卓 R系列 实时操作系统 M系列 微控制器 STM32命名规则: 参数: 3个12位AD【多达21个外部测量通道】,转换范围:0~3.6(电源电压) 2个12位DA 12个DMA通道(7+5=12; 7通道DMA1,5通道DMA2) 多达11个定时器 2个I2C接口,5个串口,3个SPI接口,1个CAN2.0,1个USB FS,1个SDIO 下载电路和启动模式: 电脑→USB/串口转换电路(CH340/PL2303)→MCU串口RX TX(PA9和PA10引脚) STM32直接通过两个引脚Bo
[单片机]
<font color='red'>STM32</font>系列第1篇--初探
STM32 I/O的耐压问题,中断问题
STM32 I/O的耐压问题 STM32 I/O的耐压问题 STM32并不是如手册所言,绝大部都是耐5V电压的,具体的要参考数据手册——我就是轻信了网络上话,犯错误了。 STM32f103c8的I/O耐压分布是这样的: 1~19 :3.3V 20~22 :5.0V 23~24 :3.3V 25~34 :5.0V 35~36 :3.3V 37~40 :5.0V 41 :3.3V 42~43 :5.0V 44 :3.3V 45~46 :5.0V 47~48 :3.3V 非5V耐压I/O,输入5V时,有很多种方法。简单的可以通过分压。
[单片机]
STM32点亮跑马灯(库函数)简洁版
用STM32的GPIO来点亮跑马灯 步骤: 1.新建工程:复制模板中的一切文件夹,注意删除USER中模板Template产生的三个文件以及OBJ中的文件(OBJ中产生的是编译过程中产生的文件)。 2.打开keil,对工程中的各县设置进行修改(包括:右键Manage Project Items里面的各个组及头文件;魔术棒中的Output选项卡中HEX文件和Folder的修改;C/C++选项卡中Define和头文件路径的修改) 3.build工程,查看设置是否正确,注意此时各个文件前面有可能没有小加号,解决办法是Translate一下,要是还不行就关了重开。 至此新建工程完成 想要对外设进行驱动就要相应的编写函数,我们在这里只将具体
[单片机]
STM32通用定时器TIM2的使用方法解析
STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。(TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生;TIM2-TIM5是普通定时器;TIM6和TIM7是基本定时器,其时钟由APB1输出产生) 本实验要实现的功能是:用普通定时器TIM2每一秒发生一次更新事件,进入中断服务程序翻转LED1的状态。 预备知识: ① STM32通用定时器TIM2是16位自动重装载计数器。 ② 向上计数模式:从0开始计数,计到自动装载寄存器(TIMx_ARR)中的数值时,清0,依次循环。 需要弄清楚的两个问题: 1
[单片机]
<font color='red'>STM32</font>通用定时器TIM2的使用方法解析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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