打印
[STM8]

请问IAR STM8的中断程序怎么搞?最好能提供个范本,谢谢!

[复制链接]
19439|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zcxhe|  楼主 | 2010-5-12 12:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
请问IAR STM8的中断程序怎么搞?最好能提供个范本,谢谢!
沙发
voidx| | 2010-5-12 12:28 | 只看该作者
本帖最后由 voidx 于 2010-5-12 12:29 编辑

#pragma vector=TIM4_OVR_UIF_vector
__interrupt void TIM4_UPD_OVF_IRQHandler(void)
{
   ………………
}

使用特权

评论回复
板凳
voidx| | 2010-5-12 12:30 | 只看该作者
本帖最后由 voidx 于 2010-5-12 12:32 编辑

#ifndef __IAR_INTERRUPT_H__
#define __IAR_INTERRUPT_H__

#include <intrinsics.h>

#define sei() __enable_interrupt()
#define cli() __disable_interrupt()

#define _PRAGMA_STR(A) _Pragma(#A)
#define PRAGMA_STR(A) _PRAGMA_STR(A)
#define __VECTOR__(A) vector=A

#define SIGNAL(A)\
PRAGMA_STR(__VECTOR__(A))\
__interrupt void ISR##_##A(void)

#define INTERRUPT(A)\
PRAGMA_STR(__VECTOR__(A))\
__nested __interrupt void ISR##_##A(void)

#define ISR(A)\
PRAGMA_STR(__VECTOR__(A))\
__interrupt void ISR##_##A(void)

#define ISR_ATTR_NAKED(A)\
PRAGMA_STR(__VECTOR__(A))\
__raw __interrupt void ISR##_##A(void)

#define ISR_ATTR_CRITICAL(A)\
PRAGMA_STR(__VECTOR__(A))\
__monitor __interrupt void ISR##_##A(void)

#define ISR_ATTR_NONCRITICAL(A)\
PRAGMA_STR(__VECTOR__(A))\
__nested __interrupt void ISR##_##A(void)

#define ISR_ATTR_CRITICAL_NAKED(A)\
PRAGMA_STR(__VECTOR__(A))\
__raw __monitor __interrupt void SIGNAL##_##A(void)

#define ISR_ATTR_NONCRITICAL_NAKED(A)\
PRAGMA_STR(__VECTOR__(A))\
__raw __nested __interrupt void SIGNAL##_##A(void)

#endif

中断写法:
ISR(TIM4_OVR_UIF_vector)
{
   …………
}

使用特权

评论回复
地板
zcxhe|  楼主 | 2010-5-12 13:59 | 只看该作者
用不了!有没有中断完整项目的例子?

使用特权

评论回复
5
voidx| | 2010-5-12 14:13 | 只看该作者
stm8_3in1 css

stm8_3in1.rar

24.8 KB

使用特权

评论回复
6
zcxhe|  楼主 | 2010-5-12 15:20 | 只看该作者
行了!谢谢!IAR的中断定义够怪的!
同一个程序,软件廷时,LED闪烁的速度竟然不一样?
程序代码:
Raisonance 到0x814A(60ms)
IAR             到0x81BD(108ms)
COSMIC      到0x81CE(46ms)
程序设计的定时间是:50ms,只有OCSMIC比较接近!晕!

void delay_ms(unsigned int timer_xs)
{
unsigned char tmp0, tmp1;

for (; timer_xs > 0; timer_xs--)
        {
            //1010us+(1+1+2)*1/4=1011us*timer_xs
                        for (tmp1 = 10; tmp1 > 0; tmp1--)
            {
                //100us+(1+1+2)*1/4=101us*10=1010us
                                for (tmp0 = 40; tmp0 > 0; tmp0--)        //减,比较,跳转
                {
                    //1+1+2+6=10*1/4=2.5us*40=100us
                    asm("nop");
                    asm("nop");
                    asm("nop");
                    asm("nop");
                    asm("nop");
                    asm("nop");
        }
            }
        }
}

使用特权

评论回复
7
gxgclg| | 2010-5-12 20:01 | 只看该作者
还会有这种事情,延时时间和编译器有关?

使用特权

评论回复
8
xsgy123| | 2010-5-12 20:12 | 只看该作者
在官网上下个例程,仔细琢磨下,仿照着写,再调试下就OK乐

使用特权

评论回复
9
iwzj| | 2010-5-15 12:00 | 只看该作者
中断
声明一个中断向量,说明如下:

#pragma vector=0x02
__interrupt void interrupt_handler(void)




说明:
#pragma vector
IAR中断向量指令
=0x02 :
其数字代表中断向量编号。STM8的地址是从0x00800开始,IAR的中断编号从0开始。中断向量号依次按照中断地址递增。如:
复位向量是0x008000,中断向量号是0x00
TRAP的中断地址是0x008004中断向量号是0x01
SPI中断号是0x0C;详细见下表
__interrupt void interrupt_handler
(void):
是声明一个中断函数,注意interrupt是两个下划线,interrupt_handler是中断函数名字,可自己定义。






使用特权

评论回复
10
dadodo| | 2010-7-27 23:11 | 只看该作者
#pragma vector=TIM4_OVR_UIF_vector
__interrupt void TIM4_UPD_OVF_IRQHandler(void)
{
   ………………
}
voidx 发表于 2010-5-12 12:28


我在这里进中断后执行完中断程序后又进中断了,应该怎么设置?

使用特权

评论回复
11
dadodo| | 2010-7-28 02:44 | 只看该作者
找到原因了,中断里没有清SR1的UIF标志位。

使用特权

评论回复
12
a52616936| | 2014-3-5 11:44 | 只看该作者
你发的那个中断的例子怎么下载不了啊!

使用特权

评论回复
13
崔红强| | 2014-7-24 11:07 | 只看该作者
voidx 发表于 2010-5-12 14:13
stm8_3in1 css

能不能让你上传的程序给我发发一份呢?642490875

使用特权

评论回复
14
lu50211| | 2014-7-26 08:36 | 只看该作者
下载不就行了,为什么要发呢。

使用特权

评论回复
15
xicuiwu| | 2015-4-16 15:16 | 只看该作者
iwzj 发表于 2010-5-15 12:00
中断
声明一个中断向量,说明如下:

声明一个中断向量,说明如下:

#pragma vector=0x02
__interrupt void interrupt_handler(void)
说明:
#pragma vector:
是IAR中断向量指令
=0x02 :     

请问这一段在哪里有介绍?谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

138

帖子

2

粉丝