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

[复制链接]
20760|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 | 显示全部楼层
用不了!有没有中断完整项目的例子?
voidx 发表于 2010-5-12 14:13 | 显示全部楼层
stm8_3in1 css

stm8_3in1.rar

24.8 KB, 下载次数: 1414

 楼主| 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");
        }
            }
        }
}
gxgclg 发表于 2010-5-12 20:01 | 显示全部楼层
还会有这种事情,延时时间和编译器有关?
xsgy123 发表于 2010-5-12 20:12 | 显示全部楼层
在官网上下个例程,仔细琢磨下,仿照着写,再调试下就OK乐
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是中断函数名字,可自己定义。


int_map.JPG



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


我在这里进中断后执行完中断程序后又进中断了,应该怎么设置?
dadodo 发表于 2010-7-28 02:44 | 显示全部楼层
找到原因了,中断里没有清SR1的UIF标志位。
a52616936 发表于 2014-3-5 11:44 | 显示全部楼层
你发的那个中断的例子怎么下载不了啊!
崔红强 发表于 2014-7-24 11:07 | 显示全部楼层
voidx 发表于 2010-5-12 14:13
stm8_3in1 css

能不能让你上传的程序给我发发一份呢?642490875
lu50211 发表于 2014-7-26 08:36 | 显示全部楼层
下载不就行了,为什么要发呢。
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

粉丝
快速回复 在线客服 返回列表 返回顶部