arm11 s3c6410 外部中断实验代码

//总中断寄存器定义
#define rVIC0INTENCLEAR (*(volatile unsigned*)(0x71200014))
#define rVIC1INTENCLEAR (*(volatile unsigned*)(0x71300014))
#define rVIC0INTSELECT (*(volatile unsigned*)(0x7120000C))
#define rVIC1INTSELECT (*(volatile unsigned*)(0x7130000C))
#define rVIC0INTENABLE (*(volatile unsigned*)(0x71200010))
#define rVIC1INTENABLE (*(volatile unsigned*)(0x71300010))
#define VIC0VECTADDR0 (*(volatile unsigned*)(0x71200100))//VIC0VECTADDR0
#define VIC0VECTADDR1 (*(volatile unsigned*)(0x71200104))
#define VIC1VECTADDR  (*(volatile unsigned*)(0x71300100))
#define rVIC0ADDR (*(volatile unsigned*)(0x71200f00))//current addr
#define rVIC1ADDR (*(volatile unsigned*)(0x71300f00))
//key gpio寄存器定义
#define rGPNCON (*(volatile unsigned*)(0x7f008830))
#define rGPNDAT (*(volatile unsigned*)(0x7f008834))
#define rGPNPUD (*(volatile unsigned*)(0x7f008838))
//外部中断寄存器定义
#define rEINT0CON0 (*(volatile unsigned*)(0x7f008900))
#define rEINT0MASK (*(volatile unsigned*)(0x7f008920))
#define rEINT0PEND (*(volatile unsigned*)(0x7f008924))
//LED
#define rGPMCON (*(volatile unsigned*)(0x7f008820))
#define rGPMDAT (*(volatile unsigned*)(0x7f008824))
#define rGPMPUD (*(volatile unsigned*)(0x7f008828))
//speaker
#define spk_GPFCON (*(volatile unsigned*)(0x7f0080a0))
#define spk_GPFDAT (*(volatile unsigned*)(0x7f0080a4))
#define spk_GPFPUD (*(volatile unsigned*)(0x7f0080a8))
volatile unsigned int mode;
void  Key_ISR(void) __irq;
void INTC_Init(void);
void Key_IO_Init(void);
void Led_Init(void);
void spk_init(void);
void spk_on(void);
void spk_off(void);
void speaker(unsigned int t);
void delay(unsigned int time);
void led_run(unsigned int t);
void Key_Int_Config(void);

void main(void)
{
 
 Key_IO_Init();
        Led_Init();
 spk_init(); 
 spk_off();
 INTC_Init();
 Key_Int_Config();
 while(1)
 {
  switch(mode)
  {
   case 1:
   led_run(mode);
   break;
   case 2:
   led_run(mode);
   break;
   case 3:
   led_run(mode);
   break;
   case 4:
   led_run(mode);
   break;
   case 5:
   speaker(1);
   break;
   case 6:
   speaker(5);
   break;
   default:
   speaker(5);
   break; 
  }
 }
}

void Key_Int_Config(void)
{
  // Select External Interrupt Mode IRQ
  rVIC0INTSELECT = 0x0;
 
  // Set the Entry Address of External Interrupt Group 0 ISR
  VIC0VECTADDR0 = (unsigned int)Key_ISR;
  VIC0VECTADDR1=(unsigned int)Key_ISR;
  // Enable the External Interrupt Group 0
  rVIC0INTENABLE |= 0x03;
 
  // Configurate the EINT0 EINT1 EINT2 EINT3 EINT4 EINT5 Trigger of Flowing Type 01x
  rEINT0CON0 = (rEINT0CON0 & 0xFFFFF000)|0x222;
 
  // Enable Interrupt MASK EINT0 ENIT1 EINT2 EINT3 EINT4 EINT5
  rEINT0MASK &= 0xFFFFFFC0;
 
  //Clear EINT Flag
  rEINT0PEND |= 0x0000003F;
 
}
void INTC_Init(void)
{
  // Disable All Interrupt
 rVIC0INTENCLEAR = 0xFFFFFFFF;
 rVIC1INTENCLEAR = 0xFFFFFFFF;
 
  // Clear VECT Address
  rVIC0ADDR = 0x00000000;
  rVIC1ADDR = 0x00000000;
}

void Key_IO_Init(void)
{
 //配置GPIO
 // GPN0 1 2 3 接按键K1 K2 K3 K4 配置按键为中断E_INT 
 // Configurate the Key I/O for Interrupt Mode 0x10
 rGPNCON = (rGPNCON & 0xFFFFF000) | 0x0aaa; //set GPN0 GPN1 GPN2 GPN3 GPN4 GPN5 ext.interrupt
 rGPNPUD  = (rGPNPUD&0x00000000) | 0x0000aaa;
 
}
void Led_Init(void)
{
   rGPMCON=0x11111;   //输出模式
   rGPMPUD=0x00;
   rGPMDAT=0xff;     
}
void spk_init(void)
{
 spk_GPFCON = spk_GPFCON&(~(0x1<<(31)));//spk_GPFCON &=~(0x11<<30)
 spk_GPFCON = spk_GPFCON|(0x1<<(30));//spk_GPFCON |= (0x01<<30) //output mode
 spk_GPFDAT |= 0x8000;
 spk_GPFPUD = spk_GPFPUD &(~(0x3<<(30)));
}
void spk_on(void)
{
 spk_GPFDAT = spk_GPFDAT|0x8000;
}
void spk_off(void)
{
 spk_GPFDAT = spk_GPFDAT & 0x7fff;
}
void speaker(unsigned int t)
{
 spk_on();
 delay(10*t);
 spk_off();
 delay(10*t);
}

void delay(unsigned int time)
{
 volatile unsigned int t;
 while(time)
 {
  for(t=0;t<20000;t++);
  time--;
 }
}

void led_run(unsigned int t)
{
 volatile unsigned int i;
 for(i=0;i<4;i++)
 {
  rGPMDAT = (0x01<<i);
  delay(10*t);
 }
}


// KEY Interrupt configuration


void  __irq Key_ISR(void) 
{
    volatile unsigned int i;
  // KEY 1
  if(rEINT0PEND & 0x01)
  {
       mode = 1;
    // Clear Interrupt Pend
   rEINT0PEND |= 0x01;
  }
  // KEY2
  if(rEINT0PEND & 0x02)
  {
    mode =2;
   // Clear Interrupt Pend
   rEINT0PEND |= 0x02; 
  }
  // KEY3
  if(rEINT0PEND & 0x04)
  {
     mode =3;
    // Clear Interrupt Pend
    rEINT0PEND |= 0x04; 
  }
  // KEY4
  if(rEINT0PEND & 0x08)
  {
         mode = 4;
    // Clear Interrupt Pend
    rEINT0PEND |= 0x08; 
  }
  //KEY5
  if(rEINT0PEND&0x10)
  {
   mode = 5;
   rEINT0PEND |=0x10;
  }
  //KEY6
  if(rEINT0PEND&0x20)
  {
   mode = 6;
   rEINT0PEND |= 0x20;
  }
 rVIC0ADDR = 0x00000000; 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值