ADS中斷訪問UART S3C2440

歡迎大家指正錯誤 

;Init.s

 AREA init,CODE,READONLY
 ENTRY
 ldr r13,=0x1000
 mrs r0,cpsr
 bic    r0, r0,#0x80   ;打開IRQ中斷,剛開始就是因爲這個中斷沒有打開,導致按鍵後一直沒有產生中斷
 msr    cpsr_c,r0
 IMPORT Main
 b Main
 END

;helun.h

//配置中斷向量表 及 寄存器地址
#define _ISR_STARTADDRESS  0x33ffff00

// Exception vector
#define pISR_RESET  (*(unsigned *)(_ISR_STARTADDRESS+0x0))
#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+0x10))
#define pISR_RESERVED (*(unsigned *)(_ISR_STARTADDRESS+0x14))
#define pISR_IRQ  (*(unsigned *)(_ISR_STARTADDRESS+0x18))
#define pISR_FIQ  (*(unsigned *)(_ISR_STARTADDRESS+0x1c))
// Interrupt vector
#define pISR_EINT0  (*(unsigned *)(_ISR_STARTADDRESS+0x20))
#define pISR_EINT1  (*(unsigned *)(_ISR_STARTADDRESS+0x24))
#define pISR_EINT2  (*(unsigned *)(_ISR_STARTADDRESS+0x28))
#define pISR_EINT3  (*(unsigned *)(_ISR_STARTADDRESS+0x2c))
#define pISR_EINT4_7 (*(unsigned *)(_ISR_STARTADDRESS+0x30))
#define pISR_EINT8_23 (*(unsigned *)(_ISR_STARTADDRESS+0x34))
#define pISR_CAM  (*(unsigned *)(_ISR_STARTADDRESS+0x38))  // Added for 2440.
#define pISR_BAT_FLT (*(unsigned *)(_ISR_STARTADDRESS+0x3c))
#define pISR_TICK  (*(unsigned *)(_ISR_STARTADDRESS+0x40))
#define pISR_WDT_AC97  (*(unsigned *)(_ISR_STARTADDRESS+0x44))
#define pISR_TIMER0   (*(unsigned *)(_ISR_STARTADDRESS+0x48))
#define pISR_TIMER1   (*(unsigned *)(_ISR_STARTADDRESS+0x4c))
#define pISR_TIMER2  (*(unsigned *)(_ISR_STARTADDRESS+0x50))
#define pISR_TIMER3  (*(unsigned *)(_ISR_STARTADDRESS+0x54))
#define pISR_TIMER4  (*(unsigned *)(_ISR_STARTADDRESS+0x58))
#define pISR_UART2  (*(unsigned *)(_ISR_STARTADDRESS+0x5c))
#define pISR_LCD  (*(unsigned *)(_ISR_STARTADDRESS+0x60))
#define pISR_DMA0  (*(unsigned *)(_ISR_STARTADDRESS+0x64))
#define pISR_DMA1  (*(unsigned *)(_ISR_STARTADDRESS+0x68))
#define pISR_DMA2  (*(unsigned *)(_ISR_STARTADDRESS+0x6c))
#define pISR_DMA3  (*(unsigned *)(_ISR_STARTADDRESS+0x70))
#define pISR_SDI  (*(unsigned *)(_ISR_STARTADDRESS+0x74))
#define pISR_SPI0  (*(unsigned *)(_ISR_STARTADDRESS+0x78))
#define pISR_UART1  (*(unsigned *)(_ISR_STARTADDRESS+0x7c))
#define pISR_NFCON  (*(unsigned *)(_ISR_STARTADDRESS+0x80))  // Added for 2440.
#define pISR_USBD  (*(unsigned *)(_ISR_STARTADDRESS+0x84))
#define pISR_USBH  (*(unsigned *)(_ISR_STARTADDRESS+0x88))
#define pISR_IIC  (*(unsigned *)(_ISR_STARTADDRESS+0x8c))
#define pISR_UART0  (*(unsigned *)(_ISR_STARTADDRESS+0x90))
#define pISR_SPI1  (*(unsigned *)(_ISR_STARTADDRESS+0x94))
#define pISR_RTC  (*(unsigned *)(_ISR_STARTADDRESS+0x98))
#define pISR_ADC  (*(unsigned *)(_ISR_STARTADDRESS+0x9c))

//I/O
#define rGPHCON    (*(volatile unsigned *)0x56000070) //Port H control
#define rGPHDAT    (*(volatile unsigned *)0x56000074) //Port H data
#define rGPHUP     (*(volatile unsigned *)0x56000078) //Pull-up control H

// INTERRUPT
#define rSRCPND     (*(volatile unsigned *)0x4a000000) //Interrupt request status
#define rINTMOD     (*(volatile unsigned *)0x4a000004) //Interrupt mode control
#define rINTMSK     (*(volatile unsigned *)0x4a000008) //Interrupt mask control
#define rPRIORITY   (*(volatile unsigned *)0x4a00000c) //IRQ priority control
#define rINTPND     (*(volatile unsigned *)0x4a000010) //Interrupt request status
#define rINTOFFSET  (*(volatile unsigned *)0x4a000014) //Interruot request source offset
#define rSUBSRCPND  (*(volatile unsigned *)0x4a000018) //Sub source pending
#define rINTSUBMSK  (*(volatile unsigned *)0x4a00001c) //Interrupt sub mask

;uart.c


#include "helun.h"


#define ULCON0   (*(volatile unsigned *)0X50000000)  //UART線控制寄存器
#define UCON0    (*(volatile unsigned *)0X50000004)  //UART控制寄存器
#define UFCON0   (*(volatile unsigned *)0X50000008)  //FIFO控制寄存器
#define UTRSTAT0  (*(volatile unsigned *)0X50000010)  //UART狀態寄存器
#define UBRDIV0  (*(volatile unsigned *)0X50000028) //波特率
#define UTXH0    (*(volatile unsigned *)0X50000020)
#define URXH0    (*(volatile unsigned *)0X50000024)
#define GPBDAT   (*(volatile unsigned *)0X58000054)

/*
測試程序 PCLK =50mHZ 115200 ,不使用FIFO 

*/
char buf[20];
int len=0;
void __irq uart0_int(void )
{
 
 char t ;
 int i;
 rSUBSRCPND|=7;/*這個寄存器是寫1清零還是寫0清零 待測?*/
 rSRCPND|=(1<<28);
 rINTPND|=(1<<28);
 

 t=URXH0;

 if(t!=13)   //13 is '\r'
  {
   buf[len]=t;
   len++;

  }
 else
  {
  for(i=0;i<len;i++)
   {
   UTXH0=buf[i];
   while((UTRSTAT0&2)==0);
   
   }
   UTXH0=13;
  len=0;

  }
// UTXH0=buf+2;
 

 

}


void uart0_init()
{
 /*中斷 配置*/

 /*清除之前中斷標,  必需要做的*/

 rSUBSRCPND|=7;
 rSRCPND|=(1<<28);
 rINTPND|=(1<<28);
 
  /*這個寄存器是寫1清零還是寫0清零 待測?*/
 
 /*設置中斷模式 ,irq,打開中斷 及子中斷*/
 rINTMOD&=~(1<<28);
 rINTMSK&=~(1<<28);
 rINTSUBMSK=rINTSUBMSK&(~7)|(1<<1);/*屏蔽發送中斷,打開接收中斷*/
 //rINTSUBMSK=rINTSUBMSK&(~7);/*屏蔽發送中斷,打開接收中斷*/

 
 /*UART 配置*/

 rGPHCON=(rGPHCON&(~0xF0))|(0xA<<4);
 rGPHUP|= (1<<2|1<<3); /* 禁止上拉電阻 ,需要測試是否禁止*/
 //rGPHUP&=(~0xc0); /*    打     開 上拉電阻 ,需要測試是否禁止*/
 ULCON0=0x3;
 UCON0=0x5;

 //UFCON0=0x91;
 UFCON0=0x0;/*不使用fifo*/

 UBRDIV0 =0X1A;
 //UBRDIV0 =0X30;


 pISR_UART0=(unsigned )uart0_int;


 }

int Main()
{
 uart0_init();
 while(1);


}

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章