OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 551|回复: 2

STM8中断向量和中断函数编写指南

[复制链接]

  离线 

4

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2015-11-12
在线时间
73 小时
发表于 2017-9-29 09:50:05 | 显示全部楼层 |阅读模式
正点原子公众号
本帖最后由 小景 于 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是你自己命名的,不同的中断要采用不同的中断名字。此中断服务函数的名字和向量表中的名字要一致,具体看如下图红色表框
参见图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



1.png
2.png
3.png
4.png
5.png
6.png
回复

使用道具 举报

  离线 

14

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2014-12-26
在线时间
42 小时
发表于 2017-12-2 09:39:05 | 显示全部楼层
本帖最后由 xiong2088 于 2017-12-2 09:43 编辑

按照你的方法写中断函数,好像有问题。
在stm8_interrupt_vector.c里做了以下事情:
1、加了2个头文件,因为有变量是在这两个头文件里定义。
360截图20171202092956336.jpg

C:\Users\Administrator\Desktop\360截图20171202092956336
2、申明了中断函数。
360截图20171202093024876.jpg
C:\Users\Administrator\Desktop\360截图20171202093024876
3、在中断向量表申明。
360截图20171202093045177.jpg
C:\Users\Administrator\Desktop\360截图20171202093045177
4、写中断函数
360截图20171202093058824.jpg
C:\Users\Administrator\Desktop\360截图20171202093058824
编译出错:
Running Linker
clnk -l"C:\Program Files (x86)\COSMIC\CXSTM8\Lib"  -o Debug\dc-adc.sm8 -mDebug\dc-adc.map Debug\dc-adc.lkf
#error clnk Debug\dc-adc.lkf:72 Debug\stm8_interrupt_vector.o: symbol f_TIM4_UPD_OVF_IRQHandler multiply defined (Debug\stm8s_it.o)
The command: "clnk -l"C:\Program Files (x86)\COSMIC\CXSTM8\Lib"  -o Debug\dc-adc.sm8 -mDebug\dc-adc.map Debug\dc-adc.lkf " has failed, the returned value is: 1
exit code=1.


回复 支持 反对

使用道具 举报

  离线 

14

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2014-12-26
在线时间
42 小时
发表于 2017-12-2 09:46:34 | 显示全部楼层
本帖最后由 xiong2088 于 2017-12-2 09:49 编辑

不好弄。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-4-20 20:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */