IAR环境编写STM8中断处理函数的技巧

IAR环境下编写STM8的中断函数,对于中断向量的概念、以及编程处理方法不太好理解,这篇文章总结了几个关键的中断编程技巧,知此文可以不用看搜索其他相关文章了。

1. STM8 中断向量表

首先清楚stm8的中断向量表,下图来自stm8的datasheet。

  1. 中断向量的起始地址是 0x00 8000。
  2. 意前两个中断RESET和TRAP是没有中断编号的。
  3. 有中断编号的始自TLI中断,编号为0;其他中断依次递进
  4. 每个中断地址有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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章