网上看了很多例子,也不甚明白都是怎么解决的,下面把自己调试的过程记录一下
我开始也使用到了下面这种办法处理
__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,我觉得这样使用应该是最正确的。
如果表述有问题的话,可以一起探讨。