stm8的IAP怎么做,需要注意哪些内容?

lr2131 2014-08-10 01:01:05
我马上要开始做STM8的IAP了,虽然以前做过一些MCU的IAP,都大同小异,不过为了避免项目拖太长时间

,也为了方便后来者,在这里发给贴问问,一起讨论下吧。

一般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支持得这么显式。当时钟源切换的时候会引发中断,这些小的细节不知道会不会是后面开发的障碍,还有很多内容没看,会隐藏有多少小问题还不知道。
...全文
7828 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
失散糖 2017-04-12
  • 打赏
  • 举报
回复
我正在弄M0的bootloader,也是出现好多奇怪的问题,参考手册上提到的方法是把向量表拷到SRAM中,然后把SRAM映射到地址0x0,不过总是把片子弄死啊。 把boot制作成一个通用的数组,挂到Flash的基地址上面是很容易的,毕竟稳定了就不用经常改,而且其他同事也会拿去用,JFlash就可以把hex另存为c语言(当然得改改才能用),每次用都要包含多个工程多麻烦啊。别的不说,就一个软件入库就闹心死了,每次合并两个hex的话,入库时候填写的CRC也很讨厌,不合并的话,发布之后,灌程序的人也得抱怨每次灌俩是咋回事
阳光诗歌 2017-04-11
  • 打赏
  • 举报
回复
赞一赞,很给力,
lzj464850580 2017-01-20
  • 打赏
  • 举报
回复
引用 48 楼 lr2131 的回复:
[quote=引用 47 楼 lzj464850580 的回复:] 楼主您好!我也一直在尝试用IAR做出基于STM8S的IAP功能。我实现了,但是是Bootloader一个工程,用户功能代码APP区是另一个工程。 我一直想实现:一个工程直接编译生成的hex文件,就包含Bootloader和APP功能代码。最后卡在了重定位中断向量上,我实现了中断向量的跳转,但执行中断函数会出错。和IAR编译器有很大关系。 请问楼主做的也是用IAR,是一个工程就实现IAP和正常app功能吗?
一个工程应该不行,当然有的人会说,把APP和IAP中一个bin放到另一个工程的数组中,那这其实本质上还是两个工程。 当然,我无法排除用高超的分散加载脚本可以把两个工程的代码一起编译到一个文件, 但就算如果确实可以做到,但这样太复杂了,没有必要弄得这么复杂。目前也没见到有人这么干。 一个编译器可以同时打开多工程(例如MDK),但编译时都是编译主工程的,并不是全编译。 [/quote]是的,比较复杂。但是我之前见过用STM8S芯片+STVD环境+汇编语言,是可以实现这个的,只是比较复杂。我现在想用C语言+IAR,感觉太难了,几乎实现不了。最后还是分成两个工程,通过上位机处理,合并两个工程的hex文件。
lr2131 2016-12-09
  • 打赏
  • 举报
回复
引用 47 楼 lzj464850580 的回复:
楼主您好!我也一直在尝试用IAR做出基于STM8S的IAP功能。我实现了,但是是Bootloader一个工程,用户功能代码APP区是另一个工程。 我一直想实现:一个工程直接编译生成的hex文件,就包含Bootloader和APP功能代码。最后卡在了重定位中断向量上,我实现了中断向量的跳转,但执行中断函数会出错。和IAR编译器有很大关系。 请问楼主做的也是用IAR,是一个工程就实现IAP和正常app功能吗?
一个工程应该不行,当然有的人会说,把APP和IAP中一个bin放到另一个工程的数组中,那这其实本质上还是两个工程。 当然,我无法排除用高超的分散加载脚本可以把两个工程的代码一起编译到一个文件, 但就算如果确实可以做到,但这样太复杂了,没有必要弄得这么复杂。目前也没见到有人这么干。 一个编译器可以同时打开多工程(例如MDK),但编译时都是编译主工程的,并不是全编译。
lzj464850580 2016-12-08
  • 打赏
  • 举报
回复
楼主您好!我也一直在尝试用IAR做出基于STM8S的IAP功能。我实现了,但是是Bootloader一个工程,用户功能代码APP区是另一个工程。 我一直想实现:一个工程直接编译生成的hex文件,就包含Bootloader和APP功能代码。最后卡在了重定位中断向量上,我实现了中断向量的跳转,但执行中断函数会出错。和IAR编译器有很大关系。 请问楼主做的也是用IAR,是一个工程就实现IAP和正常app功能吗?
lr2131 2016-09-21
  • 打赏
  • 举报
回复
STM8 支持中断方式的IAP技术实现,相关帖子和问询,请移步: http://bbs.csdn.net/topics/392021831
蓝色理想yg 2016-09-20
  • 打赏
  • 举报
回复
我当时搞STM32boot就花了4天,当然协议是参考YMODEM,有现成的,就把底层的SCI和flash改下! 协议有堵塞,擦写非常耗时间!
lr2131 2016-01-15
  • 打赏
  • 举报
回复
引用 38 楼 fengshangyouwo90 的回复:
stm8想把向量表重定向到ram,问题是IAR环境下我怎样才能在指定ram地址申请一个buf(编译前),用了__no_init关键字也不行,求指教
在RAM中申请地址,都是要告知编译器的。 但不同的编译器,语法是不同的。 大致做法是可以在分散加载脚本中加一些语句就可以。 具体的请你自己上网查,这些零散的小问题解决点我也都是在网上查到的。
lr2131 2015-12-29
  • 打赏
  • 举报
回复
引用 41 楼 guyuguang8628391 的回复:
干吗不用keil呢。
STM8 可以用 keil么? STM8的内核不是ARM,注意了。 keil是主要针对51和ARM核的。 另外,就算能用keil也没有所谓,IDE都是相通的,高手都是同时会几种工具,不会花时间在工具的选择上折腾。
lr2131 2015-12-29
  • 打赏
  • 举报
回复
引用 40 楼 xuzhi0345612 的回复:
楼主,可以把程序发给我参考一下吗,现在也在学习做IAP
我手上没有现成的源码,之前已经有过不少人问过我,其中大部分应该都做出来了。 我开此贴的初衷是技术交流,交流到位了,源码也差不多能写出来。 如果你想学点东西,建议你还是再回头多看看,浮躁是学不到什么东西的。 如果你很急需解决这个问题,建议你开个帖子,把同样做这些工作的人拉来一起讨论。
图灵转世 2015-12-25
  • 打赏
  • 举报
回复
干吗不用keil呢。
xuzhi0345612 2015-12-25
  • 打赏
  • 举报
回复
楼主,可以把程序发给我参考一下吗,现在也在学习做IAP
jingjiafei 2015-08-22
  • 打赏
  • 举报
回复
楼主,能把你的IAP工程放上来吗,最近在弄用485更新APP
fengshangyouwo90 2015-08-20
  • 打赏
  • 举报
回复
stm8想把向量表重定向到ram,问题是IAR环境下我怎样才能在指定ram地址申请一个buf(编译前),用了__no_init关键字也不行,求指教
xiaobin1005 2015-06-17
  • 打赏
  • 举报
回复
楼主qq多少啊,最近我也在做STM8S的引导,一直没结果,希望能能到楼主的帮助,谢谢,我qq 318051001
lr2131 2015-06-12
  • 打赏
  • 举报
回复
引用 35 楼 u011282528 的回复:
[quote=引用 8 楼 lr2131 的回复:] 好久没调STM8了,差不多一个星期多了,今晚又搞了下。 修改0x8000处的中断向量表中数据,让其跳转到RAM的首地址中,在RAM首地址构建新的中断向量表。 在RAM首地址定义了128个字节,也就是刚好32个向量的数组,这里面填写跳转到对应的中断ISR中的数据。 以上是大致的做法。 试着在IAP中加了中断,似乎是可以的。用仿真器可以看到发生TIM4中断后,程序最终跳转到了TIM4的ISR中,同样的做法应该在APP中也是一样可以实现的。 不过目前只是大致的考察,还有很多问题没去确认的。 接下来确认没有问题,IAP功能的中断向量表这块关键的难点算是解决了。
请假个问题,楼主是如何实现 修改0x8000处的中断向量表中数据,让其跳转到RAM的首地址中,在RAM首地址构建新的中断向量表。[/quote] 1.在RAM中定义新的中断向量表 2.在0x8000初,填入跳转指令,跳转到RAM中断向量表中。 这个功能是可以实现的,并不是很困难。
xjtka010 2015-06-11
  • 打赏
  • 举报
回复
引用 8 楼 lr2131 的回复:
好久没调STM8了,差不多一个星期多了,今晚又搞了下。 修改0x8000处的中断向量表中数据,让其跳转到RAM的首地址中,在RAM首地址构建新的中断向量表。 在RAM首地址定义了128个字节,也就是刚好32个向量的数组,这里面填写跳转到对应的中断ISR中的数据。 以上是大致的做法。 试着在IAP中加了中断,似乎是可以的。用仿真器可以看到发生TIM4中断后,程序最终跳转到了TIM4的ISR中,同样的做法应该在APP中也是一样可以实现的。 不过目前只是大致的考察,还有很多问题没去确认的。 接下来确认没有问题,IAP功能的中断向量表这块关键的难点算是解决了。
请假个问题,楼主是如何实现 修改0x8000处的中断向量表中数据,让其跳转到RAM的首地址中,在RAM首地址构建新的中断向量表。
lr2131 2015-06-01
  • 打赏
  • 举报
回复
引用 33 楼 e2407 的回复:
[quote=引用 8 楼 lr2131 的回复:] 好久没调STM8了,差不多一个星期多了,今晚又搞了下。 修改0x8000处的中断向量表中数据,让其跳转到RAM的首地址中,在RAM首地址构建新的中断向量表。 在RAM首地址定义了128个字节,也就是刚好32个向量的数组,这里面填写跳转到对应的中断ISR中的数据。 以上是大致的做法。 试着在IAP中加了中断,似乎是可以的。用仿真器可以看到发生TIM4中断后,程序最终跳转到了TIM4的ISR中,同样的做法应该在APP中也是一样可以实现的。 不过目前只是大致的考察,还有很多问题没去确认的。 接下来确认没有问题,IAP功能的中断向量表这块关键的难点算是解决了。
请教楼主,IAP和APP怎么整合到一块去的?看你说还可以跟踪调试IAP和APP,他们两个程序是在一个工程里面的吗?不是一个工程的话怎么样一起调试?[/quote] IAP和APP是不能同时调试的,毕竟不是一个工程中两份代码都存在、
e2407 2015-05-28
  • 打赏
  • 举报
回复
引用 8 楼 lr2131 的回复:
好久没调STM8了,差不多一个星期多了,今晚又搞了下。 修改0x8000处的中断向量表中数据,让其跳转到RAM的首地址中,在RAM首地址构建新的中断向量表。 在RAM首地址定义了128个字节,也就是刚好32个向量的数组,这里面填写跳转到对应的中断ISR中的数据。 以上是大致的做法。 试着在IAP中加了中断,似乎是可以的。用仿真器可以看到发生TIM4中断后,程序最终跳转到了TIM4的ISR中,同样的做法应该在APP中也是一样可以实现的。 不过目前只是大致的考察,还有很多问题没去确认的。 接下来确认没有问题,IAP功能的中断向量表这块关键的难点算是解决了。
请教楼主,IAP和APP怎么整合到一块去的?看你说还可以跟踪调试IAP和APP,他们两个程序是在一个工程里面的吗?不是一个工程的话怎么样一起调试?
e2407 2015-05-28
  • 打赏
  • 举报
回复
引用 12 楼 lr2131 的回复:
IAP和APP都可以跑各自的中断,简单的测试是通过了,大体的流程和之前的预想一样。不过有一些问题还是没解决,为了赶项目进度,这些只能先放一放。 0x82不知道是什么指令,查过资料,确认不是JP指令,有人说是什么保留指令,但明显感觉这里这个指令是有用的,不知道能不能用其他指令替换(用跳转指令JP 0xAC直接替换的发现也是可以的),确实感觉有跳转的作用。后来才看到AN2650给出代码,0xAC可以替换0x82 不知道STM8的体系结构,在发生中断时,硬件会自动做什么,保存哪些寄存器,修改哪些寄存器。系统栈也不知道是满递减还是空递减方式的,倒是发现了居然还有软中断指令,难道ST想在8位机上也想学ARM那样支持OS吗? 串口的非中断方式发送在测试时已经通过了,uart的中断方式接受也好了,有时间搞搞串口的中断方式发送。 下来就是操作flash了。
请教楼主,IAP和APP怎么整合在一起,一个工程文件里面两个main函数吗?问题有点小白,望楼主赐教,方便的话代码发我一份好吗?e2407@163.com
加载更多回复(30)

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧