6270|15

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

ST中TB中断只能进入一次 [复制链接]

@interrupt void TB_INIT(void)
{
    PADR=0;
    return;
}
void main(void)
{
    PADDR=0x0F;
    PAOR=0x0F;
    LTCSR=0x10;
    _asm("nop");
    _asm("rim");
    PADR=0X0C;
    
}
我不知道在主程序中如何去等待中断,就像汇编中可以用JRA *指令来等待中断,而C语言中是不是用while(1)呢?我用过了好像不行,最令我觉得奇怪的是这个中断程序只能够进入一次,第二次并不能够进入,请问一下各位达人是什么问题呢
此帖出自stm32/stm8论坛

最新回复

不懂啊  详情 回复 发表于 2012-7-18 23:50
点赞 关注
 

回复
举报

86

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

返回中断指令

                                 返回中断调用的指令是用return吗,
此帖出自stm32/stm8论坛
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

什么芯片?TB是什么?什么软件?

                                  
此帖出自stm32/stm8论坛
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 

ST7FLITE05YOM6,TB是8位定时器,STVD7的开发软件

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 

给个ST系列C语言范例参考

                                 最好上传个带有中断程序的例子作为参考,多谢!
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

6
 

ST7有个外设软件库,里面有详细的描述可参考,ST网站可下载

/*
*******************************************************************************
* COPYRIGHT 2002 STMicroelectronics
* Source File Name : main.c                      
* Group            : IPSW,CMG-IPDF
* Author           : MCD Application Team
* Date First Issued: 8/3/2002
********************************Documentation**********************************
* General Purpose - This file gives an example application programme for LITE 
                    Timer.
********************************RevisionHistory********************************
_______________________________________________________________________________
 Date : 8/3/2002                    Release : 1.0 
 Date :28/04/04                     MISRA changes               
******************************************************************************/
#include "ST7lib_config.h"                              /*  select ST7FLITE0 */
#define LT_WDG   

//prototype declaration
void LT_ICAP_IT_Routine(void);
void LT_TB_IT_Routine(void);
void main(void);

volatile unsigned int count;  
void main (void)
{  
                                           /* PB3 and PB1 as pushpull output */
    IO_Output(IO_PUSH_PULL,IO_PORT_B,((unsigned char)IO_PIN_3 | 
                                                    (unsigned char)IO_PIN_1 ));
        /*Set Time base to 1ms,Input capture and Timebase interrupts enabled */
    LT_Init(((unsigned char)LT_ICAP_IT_ENABLE|(unsigned char)LT_TB_IT_ENABLE));
                                               /* Clear I bit in CC register */
    EnableInterrupts                /* Micro defined in the st7lib_config.h */
#ifdef LT_WDG                                 /* Use of force watchdog reset */
    LT_WDG_Enable();
    LT_WDG_Reset(LT_FORCD_WDG_RESET);
#endif /* LT_WDG_ */
    while(1);                                            /* For Testing only */
}
                                                              /* Program end */


/******************************************************************************
Use of Input capture Interrupt service routine
- User has to write this function and map the interrupt vector in .prm file in
  case of HIWARE or in vector_xxx.c in case of COSMIC.
- An example of LED toggles at port PB1 is given, which will be executed when
  capture occurs.
- This gets automatically executed if the ICAP interrupt of the LT is enabled. 
  If the same functions are called in the main Tree and the interrupt Tree, the 
  function Reentrant error occurs in case COSMIC compiler is used with models 
  other than stack models.
Functions description
- The lt_hr.h is to be included when the actual hardware register are read to 
  clear the flags.For configuring the port pins, I/O library is used.
******************************************************************************/

#ifdef _HIWARE_                                  /* Test for HIWARE Compiler */
#pragma TRAP_PROC SAVE_REGS            /* Additional registers will be saved */
#else
#ifdef _COSMIC_                                  /* Test for Cosmic Compiler */
@interrupt @nostack
#else
#error "Unsupported Compiler!"                /* Compiler Defines not found! */
#endif
#endif
void LT_IC_IT_Routine(void)
{
    unsigned char ICAP_Value, i;
                                                     /* i = LTICR; Clear ICF */
    LT_Clear_Flag(LT_FLAG_ICF);                    /* Call only to clear ICF */
    ICAP_Value = LT_ICAP_Getvalue(); /* Get capture value and also clear ICF */
    IO_Write (IO_PORT_B,IO_PIN_1,IO_DATA_HIGH);        /* Turn ON LED at PB1 */
    for ( i=0;i<=100;i++)                                           /* Delay */
    {
        Nop
    }
    IO_Write (IO_PORT_B,IO_PIN_1,IO_DATA_LOW);        /* Turn OFF LED at PB1 */
}


/******************************************************************************
Use of TimebaseInterrupt service routine
- User has to write this function and map the interrupt vector in .prm file in 
  case of HIWARE or in vector_xxx.c in case of COSMIC.
- An example of LED toggles after every 5 seconds is given.This routine is 
  executed when overflow occurs (TBF=1).
- This gets automatically executed when TBF interrupt of the LT is enabled. If 
  the same functions are called in the main Tree and the interrupt Tree, the 
  function Reentrant error occurs in case COSMIC compiler is used with models 
  other than stack models.
Functions description
- The lt_hr.h is to be included when the actual hardware register are read to 
  clear the flags.For configuring the port pins, I/O library is used.
******************************************************************************/
#ifdef _HIWARE_                                  /* Test for HIWARE Compiler */
#pragma TRAP_PROC SAVE_REGS            /* Additional registers will be saved */
#else
#ifdef _COSMIC_                                  /* Test for Cosmic Compiler */
@interrupt @nostack
#else
#error "Unsupported Compiler!"                /* Compiler Defines not found! */
#endif
#endif
void LT_TB_IT_Routine(void)
{
    unsigned char Temp;
                                                     /* i = LTCSR; Clear ICF */
    LT_Clear_Flag(LT_FLAG_TBF);                    /* Call only to clear TBF */
                                                   /* Routine up to the user */
    count++;
    if(count == 5000)
    {
        Temp = IO_Read (IO_PORT_B );                        /* TO Toggle PB3 */
        if (Temp & 0x08)
        {
            IO_Write (IO_PORT_B,IO_PIN_3,IO_DATA_LOW);/* Turn OFF LED at PB3 */
        }
        else
        {
            IO_Write (IO_PORT_B,IO_PIN_3,IO_DATA_HIGH);/* Turn ON LED at PB3 */
        }
        count = 0;
    }
}
/******************** (c) 2002  ST Microelectronics *************END OF FILE**/        
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 

给个具体一点的链接可以吗,谢谢

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

8
 

ST的官方网站上有

 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

9
 

#pragma用法

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 

6楼具体例子中有#pragma的使用,请解释一下

#pragma TRAP_PROC SAVE_REGS            /* Additional registers will be saved */
@interrupt @nostack
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

11
 

看看条件编译的条件好不好

#pragma关键字是HIWARE编译器的,不是COSMIC的,如果使用COSMIC编译器,中断函数申明应该是:

@interrupt @nostack void LT_TB_IT_Routine(void)


HIWARE是以前的ST7 C编译器,出这个编译器的公司很久以前被Freescale收购了,现在已经不在出了。


楼上的使用的编译器是COSMIC,请在阅读的时候忽略掉
#ifdef _HIWARE_              /* Test for HIWARE Compiler */
……………………
#else
内容即可。
此帖出自stm32/stm8论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

12
 

多谢,我明白了

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

13
 

其他先不说,至少得加上下面两句

@interrupt void TB_INIT(void)
{   LTCSR;    ////清中断
    PADR=0;
    return;
}
void main(void)
{
    PADDR=0x0F;
    PAOR=0x0F;
    LTCSR=0x10;
    _asm("nop");
    _asm("rim");
    PADR=0X0C;
    while(1);/////等待中断
    

此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

14
 

ST7的中断特点

ST 8bit MCU中断的特点,进去先执行读状态寄存器的操作,这样做的目的是清中断标志未,免得出去了又直接进来了。不过有些中断标志位可能还需要在读了状态寄存器后再跟着访问一下相应外设的某个寄存器的低8位。典型的就是定时器,想直接通过指令来清标志位是不可以的。

楼上的代码对LT的状态寄存器操作有些遗漏,给你补上。

@interrupt void TB_INIT(void)
{
   unsigned char Temp;
   Temp = LTCSR;    ////清中断
   PADR=0;
   return;
}
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

15
 

多谢各位高手的解答,我现在已经明白了如何使用定时器了

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

16
 
不懂啊
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表