⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2410int.c

📁 2410开发板在ADS下的中断测试程序。 运行步骤: 1 打开int.mcp工程文件 2 运行 3 按下开发板上的Eint0,Eint5,Eint19按键 观察终端上的中断输出 文件说明:
💻 C
字号:
//====================================================================
// File Name : 2410int.c
// Function  : S3C2410 FIQ, Priority Interrupt Test
// Program   : Shin, On Pil (SOP)
// Date      : May 03, 2002
// Version   : 0.0
// History
//   0.0 : Programming start (March 12, 2002) -> SOP
//====================================================================

#include <string.h>
#include "def.h"
#include "option.h"
#include "2410addr.h"
#include "2410lib.h"
#include "2410slib.h" 

volatile int fiqCnt0, fiqCnt1;

static void __irq T0Int(void)           //FIQ
{
    ClearPending(BIT_TIMER0);
    fiqCnt0 += 1;
}

//--------------------------------------------------------------------
static void __irq T1Int(void)           //IRQ
{
    ClearPending(BIT_TIMER1);           //Timer1 Clear Interrupt
    fiqCnt1 += 1;
    
    if(fiqCnt0!=fiqCnt1)
        fiqCnt1 = 0; 
    if(fiqCnt0==10000)                  //Because FIQ interrupt has higher priority,
        rTCON   = 0x0;                  //fiqCnt0 will always be same with fiqCnt1.
}

//**********************[ Test_Fiq ]**********************************
void Test_Fiq(void)
{
    int intmod;

    Uart_Printf("[ FIQ Interrupt Test ]\n");
    fiqCnt0     = 0;
    fiqCnt1     = 0;    
    pISR_FIQ    = (U32)T0Int;                   //Timer0 FIQ interrupt
    pISR_TIMER1 = (U32)T1Int;                   //Timer1 Interrupt
    intmod      = rINTMOD;                      //Interrupt Mode backup
    rINTMOD     = BIT_TIMER0;                   //Timer0 FIQ mode
    rSRCPND     = BIT_TIMER0 | BIT_TIMER1;      //Timer0,1 To clear the previous pending states
    rINTPND     = BIT_TIMER0 | BIT_TIMER1;      //Timer0,1 Interrupt request

        //PWM Timer control
        //==============================================================================
        //Timer input clock Frequency = PCLK /{prescaler value + 1} / {divider value}
        // {prescaler value} = 0 ~ 255
        // {divider value}   = 2,4,8,16
        //==============================================================================        
    rTCFG0  = 0x0;      //Dead zone length, Prescaler0=Timer0,1  Prescaler1=Timer2,3,4
    rTCFG1  = 0x0;      //Select DMA request channel All Interrupt, Select MUX input for PWM Timer0~4 = 1/2    
    rTCNTB0 = 2570;     //0xa0a, Timer0 count buffer register
    rTCNTB1 = 2570;     //0xa0a, Timer1 count buffer register
    rTCON   = 0xa0a;    //1010 0000 1010 Timer0,1:Auto-Reload,Inverter off, Update TCNTB0,1, TCMPB0,1, Stop
    rTCON   = 0x909;    //1001 0000 1001 Timer0,1:Auto-Reload,Inverter off, No operation, Start for Timer0,1
    
    rINTMSK = ~(BIT_TIMER0 | BIT_TIMER1);       //Timer0,1 Interrupt service is available

    while(fiqCnt1<10000)
    {
        if((fiqCnt1%100)==0)   
           Uart_Printf(".");
    }
    rTCON = 0x0;        //One-shot, Inverter off, No operation, Dead zone disable, Stop
    Delay(1);
    Uart_Printf("\nfiqCnt0 = %d, fiqCnt1 = %d (10000,10000)\n",fiqCnt0,fiqCnt1);
    rINTMOD = intmod;
    rINTMSK = BIT_ALLMSK;
}

//***************[ Change_IntPriorities ]*************************
void Change_IntPriorities(void)
{
    int key;

//    rINTMOD = 0x0;
//    rINTMSK = ~(BIT_ALLMSK);
//    rINTSUBMSK = ~(BIT_SUB_ALLMSK);
    
    Uart_Printf("[ Interrupt Controller Priority Policy ]\n\n");
    Uart_Printf("1. Reverse Priority   2. Priority Rotate Off   3. Default\n\n");
    Uart_Printf("Select : ");
    key = Uart_Getch();
    Uart_Printf("%c\n\n",key);    
    
    switch(key)
    {
       case '1':
          Uart_Printf("Reverse priority is selected.\n");
          rPRIORITY = 0x7f;             //Arbiter 0 to 6 group priority rotate enable
          rPRIORITY = (0x3fff<<7);      //Arbiter 0 and 5 are group priority order set.(REQ 4-1-2-3)
                                        //Arbiter 1 to 4 and 6 are group priority order set.(REQ 0-4-1-2-3-5)
          break;
       case '2':
          Uart_Printf("Priority rotate off is selected.\n");
          rPRIORITY = 0x0;              //Arbiter 0 to 6 group priority does not rotate
          break;
       case '3':
          Uart_Printf("Default mode is selected.\n");
          rPRIORITY = 0x7f;             //Arbiter 0 to 6 group priority rotate enable
          break;
       default:
          break;
    }
    
//    rINTMSK = BIT_ALLMSK;
//    rINTSUBMSK = BIT_SUB_ALLMSK;    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -