欢迎大家指正错误
;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);
}