搜索
bottom↓
回复: 14

分享STM8 IAP方法 (中断向量表重定向设置方法,其实很简单!不用在汇编里实现)

[复制链接]

出0入0汤圆

发表于 2010-10-30 20:23:50 | 显示全部楼层 |阅读模式
分享STM8 IAP方法
A:BOOT 项目里操作:
1.把BOOT程序跟应用程序分两个项目编写
2.在BOOT程序里最重要的是中断向量表重定向,icf文件就不用设置了(BOOT里不能开中断)
  中断向量表重定向设置方法代码如下:
        __root const long reintvec[]@".intvec"=
       {   0x82008080,0x82009004,0x82009008,0x8200900c, //当应用程序地址不是0x9000时则要相应改掉除第一个0x82008080以外的数值
           0x82009010,0x82009014,0x82009018,0x8200901c,
           0x82009020,0x82009024,0x82009028,0x8200902c,
           0x82009030,0x82009034,0x82009038,0x8200903c,
           0x82009040,0x82009044,0x82009048,0x8200904c,
           0x82009050,0x82009054,0x82009058,0x8200905c,
           0x82009060,0x82009064,0x82009068,0x8200906c,
           0x82009070,0x82009074,0x82009078,0x8200907c,
       };
3.然后BOOT程序的跟一般程序一样编写通信协议及FLASH操作代码就行了,还有一点要记住,BOOT程序里不要开中断哦!
这种方法缺点就是会浪费约128个字节的FLASH空间,如果有高手能把这些空间省下来,请指点哦!

B:应用程序项目里操作:
在应用程序项目里必须在icf文件修改,修改如下:
把下面三行
define region NearFuncCode = [from 0x8000 to 0xFFFF];
define region FarFuncCode = [from 0x8000 to 0xFFFF];
define region HugeFuncCode = [from 0x8000 to 0xFFFF];
改为
define region NearFuncCode = [from 0x9000 to 0xFFFF];
define region FarFuncCode = [from 0x9000 to 0xFFFF];
define region HugeFuncCode = [from 0x9000 to 0xFFFF];
就可以了,应用程序就可以开中断了,IAP就是这么简单吧!


当然我这里是用0x9000地址作为应用程序区的首地址,至于各位BOOT大小是多小就按不同的数值设置
但是必须记得在BOOT的中断向量重定向表也必须要相应修改哦!
解析下BOOT重定向表内的0x82008080为什么是这个数值:因为重定向表跟中断表重叠了,编译器就先分配重定向表,在接着的地址0x008080处,
再分配一份中断向量表,所以其实是两份中断向量表,所以BOOT重定向表内的0x82008080就是为了要跳到真正的BOOT程序入口,
因为在0x8080处才是真正跳转到__iar_program_start入口。

出0入0汤圆

 楼主| 发表于 2010-10-30 20:38:10 | 显示全部楼层
发错地方了!汗

出0入0汤圆

发表于 2010-10-30 21:10:18 | 显示全部楼层
和自修改向量表各有各的好处

出0入0汤圆

发表于 2013-3-9 16:28:31 | 显示全部楼层
正准备用到此功能,没想到就在这里就有,非常感谢

出0入0汤圆

发表于 2013-3-28 15:27:25 | 显示全部楼层
好帖保存!

出0入0汤圆

发表于 2013-8-4 23:18:20 | 显示全部楼层
还不是很LIJIE

出0入0汤圆

发表于 2014-9-22 12:53:36 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2014-9-23 23:30:15 | 显示全部楼层
感谢分享!!

出0入0汤圆

发表于 2014-9-27 10:50:12 | 显示全部楼层
学习了~

出0入0汤圆

发表于 2014-9-27 14:06:44 | 显示全部楼层
2010年10月我还没接触是他们8

出0入0汤圆

发表于 2014-10-2 15:49:47 | 显示全部楼层
用IAR不行!

出0入0汤圆

发表于 2016-3-4 10:39:13 | 显示全部楼层
请问下楼主,我在程序里加了这个中断向量重映射,IAR环境下居然爆错。Error[Lp004]: actual size (0x100) exceeds maximum size (0x80) for block "INTVEC"
。这是大小超了?什么意思啊。

出0入0汤圆

发表于 2017-4-14 23:14:22 | 显示全部楼层
英雄,收下我得膝盖。

出0入0汤圆

发表于 2020-3-28 15:37:42 | 显示全部楼层
谢谢分享!这个解析很受启发。解析下BOOT重定向表内的0x82008080为什么是这个数值:因为重定向表跟中断表重叠了,编译器就先分配重定向表,在接着的地址0x008080处, 再分配一份中断向量表,所以其实是两份中断向量表,所以BOOT重定向表内的0x82008080就是为了要跳到真正的BOOT程序入口, 因为在0x8080处才是真正跳转到__iar_program_start入口。

出0入0汤圆

发表于 2020-3-28 20:18:10 | 显示全部楼层
应该发到STM版块,不过也好,有带动51初学者迈向STM的可能性
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 01:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表