ARM_4412_按键中断



#define GPX2CON   (volatile unsigned int *)0x11000c40
#define GPX2DAT   (volatile unsigned int *)0x11000c44
#define GPD0CON   (volatile unsigned int *)0x114000a0
#define TCFG0  (volatile unsigned int *)0x139D0000
#define TCFG1  (volatile unsigned int *)0x139D0004


#define TCNTB0  (volatile unsigned int *)0x139D000c
#define TCMPB0  (volatile unsigned int *)0x139D0010
#define TCON  (volatile unsigned int *)0x139D0008




#define GPA1CON  (volatile unsigned int *)0x11400020
#define ULCON2  (volatile unsigned int *)0x13820000
#define UCON2  (volatile unsigned int *)0x13820004
#define UTRSTAT2  (volatile unsigned int *)0x13820010


#define UTXH2  (volatile unsigned int *)0x13820020
#define URXH2  (volatile unsigned int *)0x13820024
#define UBRDIV2 (volatile unsigned int *)0x13820028
#define UFRACVAL2 (volatile unsigned int *)0x1382002c




#define WTCON  (volatile unsigned int *)0x10060000


#define WTDAT  (volatile unsigned int *)0x10060004


#define WTCNT  (volatile unsigned int *)0x10060008








//按钮2配置
#define GPX1CON  (volatile unsigned int *)0x11000c20 //复用关系
#define GPX1DAT (volatile unsigned int *)0x11000c24
#define  EXT_INT41CON (volatile unsigned int *)0x11000e04 //触发方式
#define  EXT_INT41_MASK (volatile unsigned int *)0x11000f04 //开启外部中断
#define  EXT_INT41_PEND (volatile unsigned int *)0x11000f44 //中断是否发生的标志位




//GIC
//中断源  57
#define   ICCICR_CPU0 (volatile unsigned int *)0x10480000 //哪个cpu来处理
#define   ICCIAR_CPU0 (volatile unsigned int *)0x1048000c //判断哪个中断号产生的中断
#define   ICDDCR (volatile unsigned int *)0x10490000 //GIC总开关
#define   ICCEOIR_CPU0 (volatile unsigned int *)0x10480010 //清中断
#define   ICDISER_CPU (volatile unsigned int *)0x10490104 //配置GIC中的57号中断使能
#define   ICDIPTR_CPU (volatile unsigned int *)0x10490838


















void led_init(void)
{
*GPX2CON = *GPX2CON & ~(0xf << 28) | (0x1 << 28);//output
}


void led_on(void)
{
*GPX2DAT = *GPX2DAT | (0x1 << 7);
}


void led_off(void)
{
*GPX2DAT = *GPX2DAT & ~(0x1 << 7);
}


void delay_ms(void)
{
int i = 0;
while(i < 0x100000)
i++;
}




void buzzer_init(void)
{
*GPD0CON = *GPD0CON & ~(0xf) | 0x2; //复用功能 设置为TOUT0
//Timer Input Clock Frequency = PCLK/({prescaler value + 1})/{divider value}
*TCFG0 = 249; //一级分频
*TCFG1 = 3;   //二级分频


*TCNTB0 = 500;
*TCMPB0 = 250;


*TCON = 0xa;  //auto reload ; update TCNTB0 and TCMPB0 ; stop timer
*TCON = 0x9;  //auto reload  ; start timer


}


void uart_init(void)
{
*GPA1CON = *GPA1CON & ~0xff | 0x22; //复用关系
*ULCON2 = 0x3;
*UCON2 = *UCON2 & ~0xf | 0x5;
*UBRDIV2 = 53;
*UFRACVAL2 = 4;


}


char uart_rxd(void)
{
while(!(*UTRSTAT2 & 0x1))
;
return *URXH2;
}


void uart_txd(char c)
{
while(!(*UTRSTAT2 & 0x2))
;
*UTXH2 = c;
}


void wdt_init(void)
{
*WTCON = *WTCON & ~0xff<<8 | 249<<8;
*WTCON = *WTCON | 0x1<<5 | 0x3<<3 | 0x1;
*WTCNT = 1024;
}


void do_irq(void)
{


//设置中断发生的状态位
*EXT_INT41_PEND |= (0x3<<1);


if((*ICCIAR_CPU0 & 57))
{
if((*GPX1DAT & 0x2))
led_off();
else
led_on();
*ICCEOIR_CPU0 = *ICCEOIR_CPU0 & (~0x3ff) | 57;


}
if((*ICCIAR_CPU0 & 58))
{
if((*GPX1DAT & 0x2))
led_off();
else
led_on();
*ICCEOIR_CPU0 = *ICCEOIR_CPU0 & (~0x3ff) | 58;


}




}


void key2_init(void)
{


//复用关系
*GPX1CON = *GPX1CON |(0xff<<4);
//触发方式 双沿触发
*EXT_INT41CON = *EXT_INT41CON & ~(0x77)<<4 | (0x44<<4);
//开启EXT INT 41 这个中断
*EXT_INT41_MASK = *EXT_INT41_MASK & ~(0x2<<1);


//开启对应cpu来处理
*ICCICR_CPU0 = 0x1;
//开启GIC总开关
*ICDDCR = 0x1;
//开启对应GIC中的57号中断
*ICDISER_CPU |= (0x2<<25);
//开启CPU中哪个接口来处理中断
*ICDIPTR_CPU = *ICDIPTR_CPU & ~(0xffff)<<8 | 0x101<<8;


}


int main(void)
{
led_init();
// wdt_init();
// buzzer_init();
uart_init();
key2_init();


while(1)
{
//uart_txd(uart_rxd());
//*WTCNT = 0x4000;
//led_on();
// delay_ms();
//led_off();
//delay_ms();
}


}
发布了33 篇原创文章 · 获赞 7 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/shunli008/article/details/78256981
今日推荐