IAR环境下编写STM8的中断函数,对于中断向量的概念、以及编程处理方法不太好理解,这篇文章总结了几个关键的中断编程技巧,知此文可以不用看搜索其他相关文章了。
1. STM8 中断向量表
首先清楚stm8的中断向量表,下图来自stm8的datasheet。
- 中断向量的起始地址是 0x00 8000。
- 注意前两个中断RESET和TRAP是没有中断编号的。
- 有中断编号的始自TLI中断,编号为0;其他中断依次递进
- 每个中断地址有4个字节。
2. IAR中断编译的关键字
IAR编译器里用关键字来 __interrupt 来定义一个中断函数。
用 #pragma vector 来提供中断函数的入口地址。如IAR的帮助信息:
Example: 编写一个TM2更新中断的入口函数
#pragma vector = 13+2 //定时器2中断编号为13
__interrupt void time2_ISR(void)
{
;
}
上述代码中,入口地址写成#pragma vector=13+2。中断向量编号根据手册查到的编号是13,为什么还要加2呢?这是因为:中断的入口地址在IAR设置为第一个RESET中断地址,原来datasheet中编号为0的中断TLI,实际上为第三个中断地址。因此中断编号需要偏移,即+2。中断函数名称time2_ISR()可以为任意名称。
如果编译出错,如以下信息:重复定义 _interrupt_xx
是因为你的工程文件可能已经有相关中断处理的.h和.c文件了。
建议工程文件中包含stm提供的头文件和库: stm8s_it.h stm8s_it.c。编写相应的中断时,只需要查看 stm8s_it.h,找到相应的中断入口函数声明。并在stm8s_it.c文件中,找到中断服务函数并添加用户代码。
INTERRUPT void TIM2_UPD_OVF_BRK_IRQHandler(void) /* TIM2 UPD/OVF/BRK */
{
;//put your codes here
}