STM8S全解析之系列文章4—STM8S芯片项目升级引导程序(使用中断接收升级数据)
《STM8S全解析之系列文章1—STM8S芯片项目需求与解决方案》
《STM8S全解析之系列文章2—在IAR上新建STM8S芯片项目》
《STM8S全解析之系列文章3—STM8S芯片项目软件框架的搭建》
《STM8S全解析之系列文章4—STM8S芯片项目升级引导程序(使用中断接收升级数据)》
持续更新中 ^ _ ^
文章目录
前言
用过STM8S都知道它没有中断向量重定向,也就意味着STM8S的中断向量没办法指向其他的位置,间接说明升级的引导程序没办法使用中断。其实这个不对的,有方法可以使用。。。那就是将中断向量固定的0x8000地址指向某个固定的地址(堆里的),然后通过改变堆里的地址指向我们项目中的中断向量地址就可以完成中断向量重定向。
一、Flash划分boot和App
以STM8S207R8为例,Flash带下0x08000 – 0x17FFF 共64K
这里需要配置Flash就需要用到lnkstm8s207r8.icf这个文件啦,在IAR文件夹下新建文件夹Linker留用
首先配置下IAR里的芯片,项目右键Options -> General Options -> Target -> Device 里面选择你使用的芯片(我这里是STM8S207R8)
同样在Options -> Linker -> Config -> Linker configeration file下选择相应芯片型号的文件,并将此文件复制到刚创建的文件夹Linker下,再把地址改成Linker下的地址,可以使用相对地址,见图
首先打开STM8S_Demo_Boot文件夹下面的lnkstm8s207r8.icf文件,增加一个IntvecData,修改一点Flash范围
同样STM8S_Demo_App文件夹下面的lnkstm8s207r8.icf文件也要进行相应的调整
这样的话,项目就修改完成了,下面开始撸代码
二、如何配置升级代码呢
1.Boot代码配置
新建一个app_iap.c 一个app_iap.h文件,加到include.h文件下,app_iap.c添加如下代码
///==============================================================BootFlag======
#pragma location = ".reintvec"
__no_init volatile SCH_U32 intvec[32];
__root const long reintvec[]@".intvec"=
{
0x82008080,0x82000004,0x82000008,0x8200000c,
0x82000010,0x82000014,0x82000018,0x8200001c,
0x82000020,0x82000024