系列文章目录
提示:STM32系列芯片应用学习,所遇问题的解决过程记录
例如:串口升级篇
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
STM32F765VGT6程序升级
提示:以下是本篇文章正文内容,下面案例可供参考
一、期望目标
能够通过串口、CAN口等外部接口通信方式,更新用户应用程序,方便产品批量化的固件升级和产品升级维护。
二、STM32中程序的组织和执行过程
1.一般程序的执行过程
STM32的内部(FLASH)地址起始于0x08000000,一般情况下,程序就从此地址开始写入。
STM32的微控制器,其内部通过一张“中断向量表”来响应中断。程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而这张“中断向量表”的起始地址是0x08000004,当中断来临,STM32的内部硬件机制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。
在上图中,STM32在复位后,先从0x08000004地址取出复位中断向量的地址,并跳转到复位中断服务程序,如图标号①所示;
在复位中断服务程序执行完之后,会跳转到我们的main函数,如图标号②所示;
而我们的main函数一般都是一个死循环,在main函数执行过程中,如果收到中断请求(发生中断),此时STM32强制将PC指针指向中断向量表处,如图标号③所示;
然后根据中断源进入相应的中断服务程序,如图标号④所示;
在执行完中断服务程序以后,程序再次返回main函数执行,如图⑤所示。
试想一下,如果没有中断情况,程序会在MAIN中一直循环执行下去(假设第一次跳转是系统所为,且能正常跳到main中),由于有了中断,程序必须跳转,如果能够通过某种方式,使得程序每次跳转都成功无误,程序也会正确的执行下去。为什么要如此强调中断跳转成功,因为,在后续的升级方案中,就是设置其跳转成功就OK的。
想象一下,我们要对程序升级,并且升级后的程序要正确运行。1、升级过程,芯片本身帮不了你,即升级过程也是开发者自己写的程序来完成的,所以这个地方有一份程序;2、用户应用程序,即真正实现功能的程序,这也是一份程序;这两份程序都在芯片中,在不同情况下,运行不同的程序;
在升级方案里,有把以上两份程序看做一个整体,在开发工程里只用一个工程来开发,然后升级的时候,擦除特定区域,更新特定区域(一般来说是用户应用程序区域),工程本身的中断跳转没有改变,程序能正常运行;
在我的方案里,我把上述两份程序,当做两个工程来开发,即是常见的BOOT区和APP区;正常运行APP区域程序就要用到我上述提到的中断正常跳转。
两个程序都是独立的程序,都有栈顶地址、复位中断向量等;BOOT在程序开始的地址,即0800 0000,运行,而APP在另外一个地址,假定是0808 0000
————————————————
版权声明:本文为CSDN博主「Car12」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010261063/article/details/124234496
2.升级设置
我们需要有几个设置:
1、在BOOT中,能够跳转到APP区域地址中去,要不然程序一直在BOOT中运行,而APP得不到运行;
pFunction JumpToApplication;
/* Jump to user application */
/*中断向量表第二项存放复位地址*/
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
/*指向复位地址*/
JumpToApplication = (pFunction) JumpAddress;
APPLICATION_ADDRESS 就是0808 0000
2、在编译APP时将程序起始地址设置为0808 0000:
3、在APP中设置中断向量偏移地址
这个很重要,因为中断跳转就是基址+偏移量,我们正常程序(即类似BOOT一样的程序,从开始地址0800 0000运行的程序)其偏移量默认是0,所以它的跳转每次都跳到0800 000那个地方,但是有了偏移量,它就能跳到APP开始的那个地址,则APP就能正常运行。
总结
1、boot中设置跳转;
2、APP编译地址改变;
3、APP中设置中断偏移量;
4、在STM32F1XX中,中断偏移量设置: