s12xep100 bootloader设计要点总结

这里总结下在写s12xep100 bootloader时的一些要点。

先说说中断向量吧

中断向量总结:s12xep100 总共有(0xfe-0x10)/2+1=120 个中断通道,对应的地址分别为0x7ffffe-0x7fff10(0~~119)。

在prm 文件中,可以指定中断向量对应的入口地址,比如:

VECTOR 0 _Startup   /* reset vector: this is the default entry point for a C/C++ application. */
VECTOR 1 _Startup
VECTOR 2 _Startup

意思是将#define VectorNumber_Vcop                   2U
                #define VectorNumber_Vclkmon            1U
                #define VectorNumber_Vreset                0U  //FE

这三个中断通道的入口函数都设为_Startup函数。

工程编译过后,打开glo文件如下


其中,7FFF92 对应 #define VectorNumber_Vcan4rx            54U

            7FFFAA 对应#define VectorNumber_Vcan1rx            42U

            7FFFB2 对应#define VectorNumber_Vcan0rx            38U

            7FFFF0 对应#define VectorNumber_Vrti                     7U  //F0

它们的中断函数入口地址分别为0xE270,E25B,E247,E217,在map 文件中也可以得到确认


那么为什么7FFFFAE后面会有3个E000呢?

因为我在prm文件中将vector0-vector2都设为了_Startup,也就是说

VectorNumber_Vcop     VectorNumber_Vclkmon      VectorNumber_Vreset      这三个中断通道对应的入口函数的地址都为E000,而_Startup函数的地址即为E000


我们在做bootloader 时,通讯及flash 烧写往往都比较简单,比较好理解,无非就是串口通讯、can 通讯或者其他通讯,然后解析s19/glo 文件将对应的程序文件烧写到对应的地址当中去就好了,这里不再说明。


在bootloader 程序运行过程中,或者说是在默认的情况下,IVBR(中断向量基地址寄存器)是指向0xFF10-0xFFFE 的。那么程序更新完成后,怎么跳到应用程序中执行呢,这里就需要一个中断向量重映射的过程。

通过分析s19/glo 文件,容易得出应用程序使用了哪些中断以及对应的中断入口地址,既然默认的0xFF10-oxFFFE 已经被bootloader 霸占了,那我们就重新开辟一块区域,为了方便地址选为xx00-xxff,假设为0xC800-0xC8FF,其中0xC810-0xC8FE 为新的中断向量表,顾名思义,0xC810-0xC8FE 分别存放120 个中断函数的入口地址,于是问题也就清晰了,应用程序的FFFE reset 对应C8FE…以此类推。假设FFFE reset 的中断入口地址为0x6000,那么只需将0xC8FE 处写为0x6000 这个数值就好了,直到所有的中断向量入口地址全部写完。到这一步,中断向量是更新完成了,但是还没有映射。映射其实就是将IVBR 这个寄存器指向0xC810-0xC8FE(准确说是0xC800-0xC8FE)这一段地址。

看过不少bootloader 例程包括官网给的例程里面,都是通过外部io 来控制是否进入boot 程序的。我这里处理的方式,上电默认执行bootloader 程序,如果收到boot 指令则进入bootloader程序,否则进入应用程序。进入应用程序的处理方式:

先判断C8FE 处的值是否为FFFF(也就是判断是否有正确的入口地址),如果为FFFF,说明没有,则进入boot。反之如果有,那么将中断向量基地址寄存器IVBR 地址0x121

指向0xC810-0xC8FE 这段地址,并将程序指针跳转至0xC8FE,程序跳转到应用程序中去。在应用程序运行过程中,如果收到boot 指令,则由看门狗产生复位,复位后执行bootloader将继续判断执行bootloader 还是应用程序,以此往复。

判断该进入bootloader还是应用程序的程序代码如下



至此,整个中断映射及bootloader 运行流程结束。


以上内容属于自己总结,如有不合理之处,欢迎指出。


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值