本帖最后由 小景 于 2017-9-29 09:52 编辑
在网上搜索了很多关于STM8的中断向量表的初始化和中断函数编写的资料,写的都不是很清楚,到头来看的云里来雾里去的。对学习STM8的的初学者来讲困扰挺大。
今天我在此分享一下STM8中断向量和中断函数编写的总结;由于本人也是学习者,如文中有不对的地方,还希望能得到各位攻城狮和程序猿的指点。废话不多说,上硬货:【我们采用PC端口的外部中断为例】
1、STM8开发上使用最多的编译器大概就是ST自己公司的STVD和IAR两个;根据编译器的不同,中断向量的初始化和中断函数的编写稍有一些区别,分别介绍如下:
①:STVD的环境搭建好之后:在项目创建完毕,我们会得到如下的中断向量表stm8_interrupt_vector.c参加图1:
file:///C:/Users/PRAGUE~1.JIN/AppData/Local/Temp/enhtmlclip/Image.png
打开此源文件,在文件中进行中断向量表的初始化和中断函数的声明。
中断函数声明采用的格式为@far
@interrupt void NonHandledInterrupt_xxxx (void);其中NonHandledInterrupt_xxxx是你自己命名的,不同的中断要采用不同的中断名字。此中断服务函数的名字和向量表中的名字要一致,具体看如下图红 {MOD}表框
参见图2:
肯定会有人问:在中断向量表中为什么中断要写在irq5处(即33行处),这个并不是随便写在任何地方都可以,大家就需要查看另外一份手册《STM8S参考手册》,在中断映射章节我们可以看出PC端口的外部中断向量号为5.这就说明了我们为什么在程序中需要写到irq5.
参见图3:
在项目源文件中程序就可以像下面这样编写、
@far @interrupt void NonHandledInterrupt_xxxx (void)
{
//在此添加你需要执行的中断代码
}
至此,在STVD中的中断向量表的初始化和中断函数声明、中断服务函数的编写讲解就到此为止了。
最后在主函数中,main函数之后,while循环之前打开总中断,我们就可以使用中断了。
参见图4:
②:在IAR中我们需要这样编写
参见图5:
中断号变为7是因为增加了复位中断(RESET)和软件中断的标号(TRAP),
在main函数之后while循环之前打开中断,就可以在IAR中使用STM8的中断服务函数了。
参见图6:
2、这个就是我在STM8关于中断向量初始化和中断服务函数编写的一点小小总结。如果有不对的地方欢迎大家讨论:我的联系方式:
792028616@qq.com
按照你的方法写中断函数,好像有问题。
在stm8_interrupt_vector.c里做了以下事情:
1、加了2个头文件,因为有变量是在这两个头文件里定义。
C:UsersAdministratorDesktop360截图20171202092956336
2、申明了中断函数。
C:UsersAdministratorDesktop360截图20171202093024876
3、在中断向量表申明。
C:UsersAdministratorDesktop360截图20171202093045177
4、写中断函数
C:UsersAdministratorDesktop360截图20171202093058824
编译出错:
Running Linker
clnk -l"C:Program Files (x86)COSMICCXSTM8Lib" -o Debugdc-adc.sm8 -mDebugdc-adc.map Debugdc-adc.lkf
#error clnk Debugdc-adc.lkf:72 Debugstm8_interrupt_vector.o: symbol f_TIM4_UPD_OVF_IRQHandler multiply defined (Debugstm8s_it.o)
The command: "clnk -l"C:Program Files (x86)COSMICCXSTM8Lib" -o Debugdc-adc.sm8 -mDebugdc-adc.map Debugdc-adc.lkf " has failed, the returned value is: 1
exit code=1.
一周热门 更多>