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

lfc311   2010-5-12 12:22 楼主
                                 请问IAR STM8的中断程序怎么搞?最好能提供个范本,谢谢!

回复评论 (10)



#pragma vector=TIM4_OVR_UIF_vector
__interrupt void TIM4_UPD_OVF_IRQHandler(void)
{
   ………………
}
点赞  2010-5-12 12:28


#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)
{
   …………
}
点赞  2010-5-12 12:30
                                 用不了!有没有中断完整项目的例子?
点赞  2010-5-12 13:59
stm8_3in1 css

stm8_3in1.rar (24.8 KB)

点赞  2010-5-12 14:13
行了!谢谢!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");
        }
            }
        }
}
点赞  2010-5-12 15:20
                                 还会有这种事情,延时时间和编译器有关?
点赞  2010-5-12 20:01
                                 在官网上下个例程,仔细琢磨下,仿照着写,再调试下就OK乐
点赞  2010-5-12 20:12
中断
声明一个中断向量,说明如下:

#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是中断函数名字,可自己定义。






点赞  2010-5-15 12:00
#pragma vector=TIM4_OVR_UIF_vector
__interrupt void TIM4_UPD_OVF_IRQHandler(void)
{
   ………………
}
我在这里进中断后执行完中断程序后又进中断了,应该怎么设置?
点赞  2010-7-27 23:11
                                 找到原因了,中断里没有清SR1的UIF标志位。
点赞  2010-7-28 02:44
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复