一般IAP功能都是安排两个程序实现的,一个是bootloader也可以叫IAP更正式,另一个程序是APP。
MCU的bootloader远没有那种带MMU能跑高级OS的CPU的bootloader复杂,个人感觉叫IAP更合适。
IAP程序烧写到flash中程序最开始运行的地方,这个程序负责升级更新APP,引导加载跳转到APP。
APP程序就是要完成这个MCU的主要业务主要功能咯。
依据个人开发IAP功能的经验,主要难点是中断向量的问题,然后最关键的就是那些“大同小异”的小异
,避免在此绊脚。
程序跳转用C或汇编很容易实现。Flash的擦除、编程、烧写看STM8的历程就可以了,也不难。最后是把
传输升级数据的通道打通,一般都要支持串口升级方式的,串口的代码一样看历程就可以了。
中断向量的问题,首先看了下STM8的简要资料,知道STM8发生中断后都只会跳转到0x8000这个固定的地
址,而不像STM32F1系列的单片机,可以设置中断向量表偏移量寄存器,发生中断时直接可以跳到对应的
问题。所以STM8这里我觉得要有点技巧了。
有人说在IAP代码中不要使用中断,这个我不明白为什么。我一般都是能用中断都用中断。这里我尝试还
是用中断的,串口接受用中断,效率会高一些。另外以后IAP中什么地方确实需要用到中断呢,所以这次要是能在IAP中使用中断就用,不能就放着,以后再搞。
如果IAP和APP都需要使用中断,那该怎么办呢,我想到一个办法,不知道行不行,在中断到来时跳转到flash的那个地址,让在那里的代码使用CPU再次跳转到RAM的首地址中,IAP和APP分别在使用中断前,填写RAM首地址的内容,让它们能对应再跳转到各自的ISR中。这样利用RAM的可写的特性实现中断向量表重定向的效果。
不过说起来简单,做起来一定不简单。STM8的汇编指令体系结构我没有去了解,不知道有没有类似于ARM的地址池跳转方式。如果有绝对跳转指令,那么长度够不够呢。相关的编译器也还没熟悉,汇编代码的书写格式也不熟悉,就算原理上知道汇编可以实现,但要是汇编代码写不出来也无济于事。所以后面确实有很多问题等待解决。
编译环境,知道IAR是可以编译STM8的,目前先用IAR吧,毕竟相对要熟悉些。
“大同小异”的小异,STM8支持时钟检测功能,当然STM32F0的芯片也似乎支持,但个人感觉没有STM8支持得这么显式。当时钟源切换的时候会引发中断,这些小的细节不知道会不会是后面开发的障碍,还有很多内容没看,会隐藏有多少小问题还不知道。
|