STM32+IAP⽅案实现⽹络升级应⽤固件
关注了这个概念有些⽇⼦了,这段时间总算有机会实战==⽹络升级应⽤固件,这⾥记录下遇到的问题,及解决⽅案。
原理与⽹上流传的串⼝作为传输⼿段 ⼀致;不同之处,⽆⾮我这⾥使⽤了⽹络设备传输。==(lwip)TFTP客户端的应⽤.
参考:电视机的发展史
概况:
什么是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);
1
2
其中,app应⽤固件的分区地址:
#define USER_FLASH_FIRST_PAGE_ADDRESS 0x08009000
1
2、app应⽤固件
需要两处的更改,不然错误未知
IROM设置如图:
中断向量表偏移:
NVIC_SetVectorTable(NVIC_VectTab_FLASH,VectorTable_Offset);
1
其中:
#define NVIC_VectTab_FLASH ((uint32_t)0x08000000)
#define VectorTable_Offset 0x9000
1
2
查错:
如果做了上边的⼯作,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;巴西龟肺炎
1
2
3
附:
1、如需要.hex⽂件转.bin,参见上边的⽂章
当然,就算使⽤.hex⽂件,同样可以升级,只是需要修改IAP中判定已经升级的⽂件是否有效,⽂件条件部分的代码,
if(((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论