这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » TKS 新手求教中断问题, 请指点啊,TKS!

共2条 1/1 1 跳转至

TKS 新手求教中断问题, 请指点啊,TKS!

院士
2006-09-17 18:14:16     打赏
TKS 新手求教中断问题, 请指点啊,TKS!



关键词: 新手     求教     中断     问题     指点    

院士
2006-12-22 22:43:00     打赏
2楼
问    我在用LPC2104学习板做中断实验时,利用timer 0做匹配中断的时候总是不能发生中断,不知道是什么原因,请大虾们指点一下啊.下面是我做实验的原程序.
1.这是ZLG提供的代码,我改了那个控制中断的地方( MSR     CPSR_c, #0xDf--->0xdf改成了0x5f)

;/**--------------文件信息--------------------------------------------------------------------------------
;**文   件   名: vectors.s
;**创   建   人: 陈明计
;**最后修改日期: 2003年7月1日
;**描        述: lpc210x异常向量入口及异常向量与c语言代码的接口,包括初始化堆栈的代码
;**              每个工程应当有独立的这个文件的拷贝,并进行相应的修改   
;**--------------历史版本信息----------------------------------------------------------------------------
;** 创建人: 陈明计
;** 版  本: v1.0
;** 日 期: 2003年5月30日
;** 描 述: 原始版本
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版  本: v1.1
;** 日 期: 2003年6月5日
;** 描 述: 精简代码
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版  本: v1.2
;** 日 期: 2003年7月1日
;** 描 述: 精简代码
;**
;**--------------当前版本修订------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/

;定义堆栈的大小
USR_STACK_LEGTH     EQU         64
SVC_STACK_LEGTH     EQU         0
FIQ_STACK_LEGTH     EQU         16
IRQ_STACK_LEGTH     EQU         64
ABT_STACK_LEGTH     EQU         0
UND_STACK_LEGTH     EQU         0

MEMMAP        EQU        0xE01FC040               ; REMAP控制寄存器


;引入的外部标号在这声明
    IMPORT  FIQ_Exception                   ;快速中断异常处理程序
    IMPORT  Reset
   ; IMPORT  IRQ_Exception

;给外部使用的标号在这声明
    EXPORT  InitStack
    EXPORT  Vectors


    CODE32

    AREA    Startup,CODE,READONLY

;中断向量表
Vectors
        LDR     PC, ResetAddr
        LDR     PC, UndefinedAddr
        LDR     PC, SWI_Addr
        LDR     PC, PrefetchAddr
        LDR     PC, DataAbortAddr
        DCD     0xb9205f80
        LDR     PC, [PC,#-0xff0]
        LDR     PC, FIQ_Addr

ResetAddr           DCD     Reset
UndefinedAddr       DCD     Undefined
SWI_Addr            DCD     SoftwareInterrupt
PrefetchAddr        DCD     PrefetchAbort
DataAbortAddr       DCD     DataAbort
Nouse               DCD     0
IRQ_Addr            DCD     0
FIQ_Addr            DCD     FIQ_Handler

;未定义指令
Undefined
        B       Undefined

;软中断
SoftwareInterrupt
        B       SoftwareInterrupt

PrefetchAbort
        B       PrefetchAbort

;取数据中止
DataAbort
        B       DataAbort


;快速中断
FIQ_Handler
        STMFD   SP!, {R0-R3, LR}
        BL      FIQ_Exception
        LDMFD   SP!, {R0-R3, LR}
        SUBS    PC,  LR,  #4

;/*********************************************************************************************************
;** 函数名称: InitStack
;** 功能描述: 初始化堆栈
;** 输 入:   无
;** 输 出 :  无
;** 全局变量: 无
;** 调用模块: 无
;**
;** 作 者: 陈明计
;** 日 期: 2003年6月5日
;**-------------------------------------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
InitStack    
        MOV     R0, LR

;设置管理模式堆栈
        MSR     CPSR_c, #0xd3
        LDR     SP, StackSvc
;设置中断模式堆栈
        MSR     CPSR_c, #0xd2
        LDR     SP, StackIrq
;设置快速中断模式堆栈
        MSR     CPSR_c, #0xd1
        LDR     SP, StackFiq
;设置中止模式堆栈
        MSR     CPSR_c, #0xd7
        LDR     SP, StackAbt
;设置未定义模式堆栈
        MSR     CPSR_c, #0xdb
        LDR     SP, StackUnd
;设置系统模式堆栈
        MSR     CPSR_c, #0x5f
        LDR     SP, StackUsr
        
        ; 实现REMAP操作
REMAPS    MOV        R2,#0x40000000            ; 复制中断向量代码,设置目标地址
        LDR        R1,=Vectors                ; 设置源地址
        LDMIA    R1!,{R3-R10}            ; 共复制16个字(64字节)
        STMIA    R2!,{R3-R10}
        LDMIA    R1!,{R3-R10}
        STMIA    R2!,{R3-R10}
            
        LDR        R2,=MEMMAP                ; REMAP操作                    
        MOV        R1,#0x02
        STR        R1,[R2]        

        MSR     CPSR_c, #0x1f
        MOV     PC, R0

StackUsr           DCD     UsrStackSpace + (USR_STACK_LEGTH - 1) * 4
StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
StackFiq           DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
StackAbt           DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
StackUnd           DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)* 4


;/* 分配堆栈空间 */
        AREA    MyStacks, DATA, NOINIT, ALIGN=2
UsrStackSpace      SPACE   USR_STACK_LEGTH * 4  ;用户(系统)模式堆栈空间
SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;管理模式堆栈空间
IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4  ;中断模式堆栈空间
FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4  ;快速中断模式堆栈空间
AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4  ;中止义模式堆栈空间
UndtStackSpace     SPACE   UND_STACK_LEGTH * 4  ;未定义模式堆栈

    END
;/*********************************************************************************************************
;**                            End Of File
;********************************************************************************************************/

2.这是我作实验自己的程序.
/***************************************************************
*                      Timer Test
* 文件名:main.c
* 功能描述:.熟悉PHILIPS ARM21xx 的Timer特性,每过1s LED显示
            +1(0~9循环显示)。
****************************************************************/
#include "LPC2106.H"
#include "config.h"
/* P0.14.P0.15,P0.16,P0.22,P0.23,P0.24   连接独立按键
   P0.10,P0.11,P0.12,P0.13               连接LED
   P0.7                                  连接Buzzer  */
   
#define      LED1CON    0x00000400    /* P0.10引脚控制LED0,低电平点亮*/
#define      LED2CON    0x00000800    /* P0.11引脚控制LED1,低电平点亮*/
#define      LED3CON    0x00001000    /* P0.12引脚控制LED2,低电平点亮*/
#define      LED4CON    0x00002000    /* P0.13引脚控制LED3,低电平点亮*/

#define      BUCON      0x00000080    /* P0.7 引脚控制BUZZER,低电平点鸣叫*/

#define   KEY1      0x00008000  /* P0.15为按键控制输入*/
#define   PRESS     0x00000000
#define   RELASE    0x00008000
#define   HC595_CS  0x00000100      /*HC595显示片选,低有效*/
unsigned char    chCnt;
unsigned char    LEDCnt;
const LEDSeg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};//0~9


void __irq  Timer0_ISR(void);
/*******************************************************************
* 函数名:void InitVIC(void)
* 功能:初始化Vectored interrupt controller 模块
* 输入:无
* 输出:无
*******************************************************************/
void InitVIC(void)
{
    VICIntSelect = 0x00;//
    VICSoftIntClear = 0xffffffff;     //初始化所有中断
    VICDefVectAddr = (unsigned int)Timer0_ISR;
    VICVectAddr = 0x00;         //初始化中断地址
    VICIntEnable = 0x10; //允许timer0中断  
}/*****************************************************************
* 函数名:void _irq Timer0_ISR(void)
* 功能:每中断一次LEDCnt+1
* 输入:
* 输出:
******************************************************************/
void __irq  Timer0_ISR(void)
{
     
   if(LEDCnt<9)
        LEDCnt++;
   else
        LEDCnt = 0;
   T0IR= 0x01;
   VICVectAddr = 0;
}
/*******************************************************************
* 函数名称:void SPI_Disp(unsigned char bTemp)
* 功能:通过SPI接口向HC595写要显示的数据
* 输入:
* 输出:
*******************************************************************/
void SPI_Disp(unsigned char bTemp)
{
  IOCLR = HC595_CS;
  SPI_SPDR  =bTemp;
  while((SPI_SPSR&0x80) ==0);
  IOSET = HC595_CS;
}

/*******************************************************************
* 函数名称: void  Key(void)
* 功能:检测按键是否有按下
* 输入:
* 输出:
*******************************************************************/
void Key(void)
{
     if(((IOPIN&KEY1)==PRESS)&&(chCnt<250))
     {
       chCnt++;
       }
     else if((IOPIN&KEY1)==RELASE)
     {
      chCnt = 0;
      }
     
     if( chCnt == 200)
     {
      if(LEDCnt<9)
        LEDCnt++;
      else
        LEDCnt = 0;
     
     }    
}
/******************************************************************/
int main(void)
{
   
    LEDCnt = 0;
    PINSEL0 = 0x00005500|0x80;        // 设置SPI0
    PINSEL1 = 0x00000000;
    IODIR = HC595_CS;         // 设置HC595_CS控制口为输出
    IODIR |= BUCON;             //设置Buzzer为输出口
    IODIR &= ~KEY1;             //设置KEY为输入
    IOSET =  LED1CON|LED2CON|LED3CON|LED4CON;  
    SPI_SPCCR = 200;
    SPI_SPCR = 0x30;
    InitVIC();
    T0TC = 0x00;
    T0PR = 0x00;
    T0MCR = 0x03;
    T0MR0 = Fpclk/10;
    T0TCR = 0x01;
   
while(1)
{
    Key();
    SPI_Disp(LEDSeg[LEDCnt]);
}
  return 0;
}
哪位大哥大姐指点我啊,TKS!! 1: !!!看一下你的代码,你好像还应该设置自己的中断向量表! 2: 那怎么来设置啊?能详细教下我吗?

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]