STM32 IAP能把徕卡q最新固件版本存在en25q32里面吗

之前做了一个不带系统的IAP与APP互相跳转在网上找了资料后,很顺畅就完成了后来在IAR集成开发环境下,IAP无系统APP用UCOS系统做互相跳转出现了很多问题。现将IAP学习过程和实际遇到问题总结一下

Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的徕卡q最新固件版本程序进行哽新升级通常实现IAP功能时,即用户程序运行中作自身的更新操作需要在设计徕卡q最新固件版本程序时编写两个项目代码,第一个项目程序不执行正常的功能操作而只是通过某种通信方式(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码

以上内容摘自原子的开发指南。说的通俗一点要做IAP功能(也可以说成是远程升级功能),需要有两段程序一个是IAP程序(也可以稱为BootLoader)另一个是APP程序(主应用程序)。通过USB、串口、CAN等通讯方式向STM32发送要升级的程序文件数据(按自定的协议)IAP程序中将接收到的数據写到APP程序的地址实现将APP程序的升级。这是大致的流程

此文档只做互相跳转的总结不包含接收数据、FLASH写入等操作。

说到IAP升级不得不说两個图(图片引自原子的开发指南)

第一个是正常运行时的流程图

STM32的FLASH地址起始于0x程序文件就从此地址开始写入。此外STM32内部通过“中断向量表”来响应中断程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动而“中断向量表”的起始地址是0x,当中断来临STM32的内部硬件机制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序

根据上圖分析启动和运行过程,

① STM32在复位后先从0X地址取出复位中断向量的地址,并跳转到复位中断服务程序

② 在复位中断服务程序执行完之後,会跳转到的main函数(如使用KEIL MDK调试时一下载进程序会发现需要运行几次下一步才会跳转到main函数的位置)

③ main函数一般都是超循环体(while(1)死循環),在main函数执行过程中如果收到中断请求(发生重中断),此时STM32强制将PC指针指回中断向量表处

④ 根据中断源进入相应的中断服务程序

⑤ 在执行完中断服务程序以后,程序再次返回main函数执行

第二个是加入IAP功能后的流程图

根据上图分析加入IAP后的起动和运行过程

① STM32复位后,还是从0X地址取出复位中断向量的地址并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到IAP的main函数如将IAP看作是一个APP的話,那么此部分和正常起动是一样的此步相当于正常运行的①和②。

② 在执行完IAP以后(如需要将新的APP代码写入STM32的FLASH或没有更新直接跳转APP嘚复位中断向量起始地址为0X+N+M),跳转至APP的复位向量表

③ 取出APP的复位中断向量的地址并跳转执行新程序的复位中断服务程序,随后跳转至APP嘚main函数

④ 同样main函数为一个超循环并且注意到此时STM32的FLASH,在不同位置上共有两个中断向量表。在main函数执行过程中如果CPU得到一个中断请求,PC指针仍强制跳转到地址0X中断向量表处而不是APP程序的中断向量表。

⑤ 程序再根据我们设置的中断向量表偏移量跳转到对应中断源的APP中斷服务程序中,

⑥ 在执行完中断服务程序后程序返回main函数继续运行。

注意:IAP和APP跳转过程中是通过PC指针定位进行跳转,所有的寄存器都保持原有状态跳转过程中并不是做了复位。

下面是IAP和APP互相跳转程序

在IAP和APP中都需要进行中断向量表的设置如正常程序中设置一样。

再介紹一下在集成开发环境下APP程序起始地址设置

在IAP和APP均为无系统时上面程序能够很好实现互相跳转。但在IAP无系统而APP使用UCOS系统时出现了较多問题(IAR环境)。如下一一记录各种问题的解决过程

1、在程序正常设置APP的程序和向量表时后,在IAP直接调用跳转APP时程序没有正常跳转到APP中,跳入未区域具体情况现已回忆不清。但分析是因为跳转后没有找到中断向量表从而没有正常进入APP的main()函数。

但在BSP_Init()函数中确实有对複位中断向量进行了设置

说明一下,这里将中断向量表设置为 (APP1_ADDR+4)(偏移4个字节即为复位中断向量)而有的程序中设置为APP1_ADDR。实际上两種设置是一样的在

经测试发现需要在调用OSStart()的前一句重新设置复位中断向量才能正确设置。

2、 经上一步修改后IAP可以跳转到APP中,APP也能跳转箌IAP中但再重IAP就不能再跳回APP了。修改跳转函数

函数功能:跳转到IAP函数

// APP如跳转前关中断跳转到IAP后,IAP初始化后要打开中断

//进入用户级线程模式 进入软中断后才可以回到特权级线程模式

//APP如使用系统如ucos必须要有此过程否则跳到IAP后无法再次跳到APP

//初始化后要开中断,用UCOS后在起动任務后会开中断

如此调整后可以正常互相跳转。

3、 将IAP增加3秒延时后再执行跳转APP函数(使用定时器update中断(更新中断)定时)但一执行跳转就進入APP的HardFault_Handler()。

因为在IAP有初始化定时器并始能了中断而在APP中没有初始化定时器和初始化定时器的中断向量表,所以在APP中定时器仍然工作产生Φ断后没有相应中断向量表就起出现错误。(自己理解总之不管什么原因这样操作是错误的。)在执行跳转APP函数前将定时器更新中断失能并且将定时器失能可解决!

输入参数:num 定时器号

在用到STM32定时器的更新中断时,发现有些情形下只要开启定时器就立即进入一次中断准确说,只要使能更新中断允许位就立即响应一次更新中断【当然前提是相关NVIC也已经配置好】换言之,只要使能了相关定时器更新中断不管你定时间隔多长甚至不在乎你是否启动了相关定时器,它都会立即进入一次定时器更新中断服务程序这个问题比较容易忽视,有些情况下也无关紧要但有些情况可能会给应用带来困扰。

解决办法是在使能定时器更新中断前先清除更新中断标志位

在初始化定时器時使用如下代码:

记录自己的工作中遇到的问题,一是方便自己查找学习二是方便有初学者遇到相似问题,提供解决思路以前工作或學习中遇到问题没有及时记录,后来再总结时对当时的现象回忆不清。以后要及时截图记录及时总结!

我要回帖

更多关于 leica q 升级固件 的文章

 

随机推荐