STM8的bootloader中断向量重定义

网上看了很多例子,也不甚明白都是怎么解决的,下面把自己调试的过程记录一下

我开始也使用到了下面这种办法处理

__root const long  reintvec[32]@".intvec"=

    0x82008080,0x8200a004,0x8200a008,0x8200a00c,
    0x8200a010,0x8200a014,0x8200a018,0x8200a01c, 
    0x8200a020,0x8200a024,0x8200a028,0x8200a02c,                      0x8200a030,0x8200a034,0x8200a038,0x8200a03c,
    0x8200a040,0x8200a044,0x8200a048,0x8200a04c,
    0x8200a050,0x8200a054,0x8200a058,0x8200a05c,
    0x8200a060,0x8200a064,0x8200a068,0x8200a06c,
    0x8200a070,0x8200a074,0x8200a078,0x8200a07c
}; 

但是编译说超出范围,报出下面的错误

Error[Lp004]: actual size (0x100) exceeds maximum size (0x80) for block “INTVEC”

因为芯片内部指定中断向量的地址范围就是0x80,有说把icf文件的0x80改成0x100,这样编译是没问题了,然后烧录进去也可以跳转到app,app程序也能进入中断,感觉好像是可以使用。

其实打开生成的hex文件你会发现,从0x8000开始,到0x8080,这个地址放的是上面数组的值,接着0x80的地址放的是boot本身固有的向量表(不知道这样表述对不对),所以总共大小是0x100。

也看到有说使用低版本的IAR,V2.10.4这个版本,我也下载了,确实不需要改icf文件中的0x80也能编译,且不报错,打开生成的hex文件,跟上面这个改成0x100的地址生成的文件差不多,都是占用了前面0x100的地址保存向量表,声明一下,我不知道这样使用的后果是什么,或者有没有隐患,总感觉不踏实。

最终去st官网看了下他们的例子,发现他不是这么操作的,而是使用了一个stm8_interrupt.c的文件来处理这个问题,所以我还是使用高版本的iar,将这个c文件加进去,不需要再使用__root const long  reintvec[32]@".intvec"这个表

/**************************************************
 *
 * System initialization code for the STM8 IAR Compiler.
 *
 * Copyright 2010 IAR Systems AB.
 *
 * $Revision: 1413 $
 *
 ***************************************************
 *
 * To add your own interrupt handler to the table,
 * give it the label _interrupt_N, where N is the
 * offset from the RESET vector.  Your label will
 * override the corresponding weak label declaration
 * on the unhandled_exception function.
 *
 **************************************************/

        MODULE   ?interrupt

        SECTION __DEFAULT_CODE_SECTION__:CODE

declare_label MACRO
        PUBWEAK _interrupt_\1
_interrupt_\1:
        ENDM

unhandled_exception:

        declare_label 1
        declare_label 2
        declare_label 3
        declare_label 4
        declare_label 5
        declare_label 6
        declare_label 7
        declare_label 8
        declare_label 9
        declare_label 10
        declare_label 11
        declare_label 12
        declare_label 13
        declare_label 14
        declare_label 15
        declare_label 16
        declare_label 17
        declare_label 18
        declare_label 19
        declare_label 20
        declare_label 21
        declare_label 22
        declare_label 23
        declare_label 24
        declare_label 25
        declare_label 26
        declare_label 27
        declare_label 28
        declare_label 29
        declare_label 30
        declare_label 31

        NOP                                   ;; put a breakpoint here
        JRA    unhandled_exception


/*
 * The interrupt vector table.
 */


        SECTION `.intvec`:CONST

define_vector MACRO
        DC8     0x82
        DC24    _interrupt_\1
        ENDM

        PUBLIC  __intvec
        EXTERN   __iar_program_start
        


__intvec:
        DC8     0x82
        DC24    __iar_program_start          ;; RESET    0x8000
        DC8     0x82
        DC24    0xa004
        DC8     0x82
        DC24    0xa008
        DC8     0x82
        DC24    0xa00C
        DC8     0x82
        DC24    0xa010
        DC8     0x82
        DC24    0xa014
        DC8     0x82
        DC24    0xa018
        DC8     0x82
        DC24    0xa01C
        DC8     0x82
        DC24    0xa020
        DC8     0x82
        DC24    0xa024
        DC8     0x82
        DC24    0xa028
        DC8     0x82
        DC24    0xa02C
        DC8     0x82
        DC24    0xa030
        DC8     0x82
        DC24    0xa034
        DC8     0x82
        DC24    0xa038
        DC8     0x82
        DC24    0xa03C
        DC8     0x82
        DC24    0xa040
        DC8     0x82
        DC24    0xa044
        DC8     0x82
        DC24    0xa048
        DC8     0x82
        DC24    0xa04C
        DC8     0x82
        DC24    0xa050
        DC8     0x82
        DC24    0xa054
        DC8     0x82
        DC24    0xa058
        DC8     0x82
        DC24    0xa05C
        DC8     0x82
        DC24    0xa060
        DC8     0x82
        DC24    0xa064
        DC8     0x82
        DC24    0xa068
        DC8     0x82
        DC24    0xa06C
        DC8     0x82
        DC24    0xa070
        DC8     0x82
        DC24    0xa074
        DC8     0x82
        DC24    0xa078
        DC8     0x82
        DC24    0xa07C

        END

编译出来的hex文件,只有前0x80的地址范围内保存了重定义的中断向量表,需要注意的是boot是没法使用中断的

:108000008200865E8200A0048200A0088200A00C8C
:108010008200A0108200A0148200A0188200A01C80
:108020008200A0208200A0248200A0288200A02C30
:108030008200A0308200A0348200A0388200A03CE0
:108040008200A0408200A0448200A0488200A04C90
:108050008200A0508200A0548200A0588200A05C40
:108060008200A0608200A0648200A0688200A06CF0
:108070008200A0708200A0748200A0788200A07CA0

:108080000085FF0001001000008D00831C3B000CE8
:108090008D00836EB70C4500083D08275AB608A12D

验证了一下,可以正常跳转到app,我觉得这样使用应该是最正确的。

如果表述有问题的话,可以一起探讨。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值