×
单片机 > 单片机程序设计 > 详情

中断服务程序初始化

发布时间:2020-08-21 发布时间:
|
main.c里面的中断服务程序初始化:void Isr_Init(void);
子函数为:void Isr_Init(void)
{
 pISR_UNDEF=(unsigned)HaltUndef;
 pISR_SWI  =(unsigned)HaltSwi;
 pISR_PABORT=(unsigned)HaltPabort;
 pISR_DABORT=(unsigned)HaltDabort;
 rINTMOD=0x0;   // All=IRQ mode
 rINTMSK=BIT_ALLMSK;   // All interrupt is masked.

 //pISR_URXD0=(unsigned)Uart0_RxInt; 
 //rINTMSK=~(BIT_URXD0);   //enable UART0 RX Default value=0xffffffff

//#if 1
// pISR_USBD =(unsigned)IsrUsbd;
// pISR_DMA2 =(unsigned)IsrDma2;
//#else
// pISR_IRQ =(unsigned)IsrUsbd; 
  //Why doesn't it receive the big file if use this. (???)
  //It always stops when 327680 bytes are received.
//#endif 
// ClearPending(BIT_DMA2);
// ClearPending(BIT_USBD);
 //rINTMSK&=~(BIT_USBD);  
   
 //pISR_FIQ,pISR_IRQ must be initialized
}

对子函数的理解:

1. rINTMOD=0x0;   // All=IRQ mode

在addr.h文件里面定义了 #define rINTMOD     (*(volatile unsigned *)0x4a000004) 根据datasheet知道给中断模式寄存器INTMOD地址0x4a000004赋值0表示IRQ(外部中断请求),若赋 值各位为1则表示FIQ(快速中断请求)。

2.rINTMSK=BIT_ALLMSK;   // All interrupt is masked

在addr.h文件里面定义了#define rINTMSK     (*(volatile unsigned *)0x4a000008) 

BIT_ALLMSK定义为#define BIT_ALLMSK  (0xffffffff)表示给BIT_ALLMSK赋值。整个意思是在地址0x4a000008赋值0xffffffff,根 据datasheet知道中断屏蔽寄存器(INTMSK))各位为1表示Interrupt service is masked.

3.对前面的中断向量表的定义:

 pISR_UNDEF=(unsigned)HaltUndef;
 pISR_SWI  =(unsigned)HaltSwi;
 pISR_PABORT=(unsigned)HaltPabort;
 pISR_DABORT=(unsigned)HaltDabort;

     (1)addr.h文件里面

#define pISR_UNDEF  (*(unsigned *)(_ISR_STARTADDRESS+0x4))
#define pISR_SWI  (*(unsigned *)(_ISR_STARTADDRESS+0x8))
#define pISR_PABORT  (*(unsigned *)(_ISR_STARTADDRESS+0xc))
#define pISR_DABORT  (*(unsigned *)(_ISR_STARTADDRESS+x010))

又在option.h文件里面

#define _ISR_STARTADDRESS  0x33ffff00 

    (2)在main.c文件里

void HaltUndef(void)
{
 Uart_Printf("Undefined instruction exception!!!\n");
 while(1);
}

  而在 2440lib.c里面定义

void Uart_Printf(char *fmt,...)
{
    va_list ap;
    char string[256];

    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
    Uart_SendString(string);
    va_end(ap);
}

 

  在 2440lib.c里面定义

void Uart_SendString(char *pt)
{
    while(*pt)
        Uart_SendByte(*pt++);
}

 

 在 2440lib.c里面

 void Uart_SendByte(int data)
{
    if(whichUart==0)
    {
        if(data=='\n')
        {
            while(!(rUTRSTAT0 & 0x2));
           // Delay(1);                 //because the slow response of hyper_terminal 
            WrUTXH0('\r');
        }
        while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.
      //  Delay(1);
        WrUTXH0(data);
    }
    else if(whichUart==1)
    {
        if(data=='\n')
        {
            while(!(rUTRSTAT1 & 0x2));  rUTRSTAT1 定义地址0x50000010
            //Delay(1);                 //because the slow response of hyper_terminal 
            WrUTXH1 = '\r';  WrUTXH1 地址0x50000023
        }
        while(!(rUTRSTAT1 & 0x2));   //Wait until THR is empty.
        //Delay(1);
        WrUTXH1 = data;
    }   
    else if(whichUart==2)
    {
        if(data=='\n')
        {
            while(!(rUTRSTAT2 & 0x2));  0x50004010
            //Delay(1);                 //because the slow response of hyper_terminal 
            WrUTXH2 = '\r';  0x50008010
        }
        while(!(rUTRSTAT2 & 0x2));   //Wait until THR is empty.
        //Delay(1);
        WrUTXH2 = data;
    }       
}   


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义