typedef unsigned long uint32_t;
#define wdtcon (*((volatile uint32_t *)0x53000000))
#define GPFCON (*((volatile uint32_t *)0X56000050))
#define GPFDATA (*((volatile uint32_t *)0X56000054))
#define GPFUP (*((volatile uint32_t *)0X56000058))
#define GPGCON (*((volatile uint32_t *)0X56000060))
#define SRCPND (*((volatile uint32_t *)0X4A000000))
#define INTMOD (*((volatile uint32_t *)0X4A000004))
#define INTMASK (*((volatile uint32_t *)0X4A000008))
#define PRIORITY (*((volatile uint32_t *)0X4A00000C))
#define EXTINT0 (*((volatile uint32_t *)0X56000088))
#define EXTINT1 (*((volatile uint32_t *)0X5600008C))
#define EINTMASK (*((volatile uint32_t *)0X560000A4))
#define EINTPEND (*((volatile uint32_t *)0X560000A8))
#define INTPEND (*((volatile uint32_t *)0X4A000010))
#define INTOFFSET (*((volatile uint32_t *)0X4A000014))
#define Fall_INT 2
#define KEY1_EINT 0
#define KEY2_EINT 2
#define KEY3_EINT 5
#define KEY1_PIN 0
#define KEY2_PIN 2
#define KEY3_PIN 3
/*
* LED1,LED2,LED4对应GPF4、GPF5、GPF6
*/
#define GPF4_out (1<<(4*2))
#define GPF5_out (1<<(5*2))
#define GPF6_out (1<<(6*2))
#define GPF4_msk (3<<(4*2))
#define GPF5_msk (3<<(5*2))
#define GPF6_msk (3<<(6*2))
/*
* S2,S3,S4对应GPF0、GPF2、GPG3
*/
#define GPF0_eint (0x2<<(0*2))
#define GPF2_eint (0x2<<(2*2))
#define GPG3_eint (0x2<<(3*2))
#define GPF0_msk (3<<(0*2))
#define GPF2_msk (3<<(2*2))
#define GPG3_msk (3<<(3*2))
#define LED1 4
#define LED2 5
#define LED3 6
#define output 1
#define eint 2
#define Ledon 0
#define Ledclose 1
#define Led_ON(n) GPFDATA &= ~((Ledclose << LED##n))
#define Led_Toggle(n) GPFDATA ^= ((Ledclose << LED##n))
#define Led_CLOSE(n) GPFDATA |= (Ledclose << LED##n)
void disable_watch_dog(void)
{
wdtcon = 0;
}
void delayms(uint32_t u32delayms)
{
uint32_t i;
for(i = 0; i < 1000*u32delayms; i++)
{
}
}
void ledinit(void)
{
// LED1,LED2,LED4对应的3根引脚设为输出
GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);
GPFCON |= GPF4_out | GPF5_out | GPF6_out;
//GPFCON = 0; 给这个寄存器直接赋值,其中这个寄存器有一些是保留位,会导致系统复位。
//GPFCON |= (output << (LED1 * 2)) | (output << (LED2 * 2)) | (output << (LED3 * 2));
//GPFDATA = wdtcon;
//delayms(2);
//GPFDATA |= ((Ledclose << LED1) | (Ledclose << LED2) | (Ledclose << LED3));
//GPFUP = 0;
/* */
}
void initKeyIRQ(void)
{
GPFCON |= (eint << (KEY1_PIN * 2)) | (eint << (KEY2_PIN * 2));
GPGCON |= (eint << (KEY3_PIN * 2));
SRCPND = (1 << KEY1_EINT) | (1 << KEY2_EINT)| (1 << KEY3_EINT);
INTPEND = (1 << KEY1_EINT) | (1 << KEY2_EINT)| (1 << KEY3_EINT);
EINTMASK &= ~(1 << 11);
INTMOD = 0;
/*
//PRIORITY = 0;
PRIORITY = (PRIORITY & ((~0x01) | (0x3<<7))) | (0x0 << 7) ;
//PRIORITY = (PRIORITY & ((~0x01) | (0x3<<7))) | (0x0 << 7) ;
//EXTINT0 |= (Fall_INT << (KEY1_EINT * 4)) | (Fall_INT << (KEY2_EINT * 4));
//EXTINT1 |= (Fall_INT << (12));
INTMASK &= ~((1 << KEY1_EINT) | (1 << KEY2_EINT) | (1 << KEY3_EINT));
// S2,S3对应的2根引脚设为中断引脚 EINT0,ENT2
GPFCON &= ~(GPF0_msk | GPF2_msk);
GPFCON |= GPF0_eint | GPF2_eint;
// S4对应的引脚设为中断引脚EINT11
GPGCON &= ~GPG3_msk;
GPGCON |= GPG3_eint;
// 对于EINT11,需要在EINTMASK寄存器中使能它
EINTMASK &= ~(1<<11);
*/
/*
* 设定优先级:
* ARB_SEL0 = 00b, ARB_MODE0 = 0: REQ1 > REQ3,即EINT0 > EINT2
* 仲裁器1、6无需设置
* 最终:
* EINT0 > EINT2 > EINT11即K2 > K3 > K4
*/
PRIORITY = (PRIORITY & ((~0x01) | (0x3<<7))) | (0x0 << 7) ;
// EINT0、EINT2、EINT8_23使能
INTMASK &= (~(1<<0)) & (~(1<<2)) & (~(1<<5));
}
void EINT_Handle(void)
{
uint32_t offt;
offt = INTOFFSET;
switch(offt)
{
case 0:
//GPFDATA |= (0x7<<4); // 所有LED熄灭
Led_Toggle(1);
//GPFDATA &= ~(1<<4); // LED1点亮
break;
case 2:
//GPFDATA |= (0x7<<4); // 所有LED熄灭
Led_Toggle(2);
//GPFDATA &= ~(1<<5); // LED1点亮
break;
case 5:
//GPFDATA |= (0x7<<4); // 所有LED熄灭
Led_Toggle(3);
//GPFDATA &= ~(1<<6); // LED1点亮
break;
}
delayms(50);
if(5 == offt)
{
EINTPEND = (1 << 11);
}
SRCPND = (1 << offt);
INTPEND = (1 << offt);
#define wdtcon (*((volatile uint32_t *)0x53000000))
#define GPFCON (*((volatile uint32_t *)0X56000050))
#define GPFDATA (*((volatile uint32_t *)0X56000054))
#define GPFUP (*((volatile uint32_t *)0X56000058))
#define GPGCON (*((volatile uint32_t *)0X56000060))
#define SRCPND (*((volatile uint32_t *)0X4A000000))
#define INTMOD (*((volatile uint32_t *)0X4A000004))
#define INTMASK (*((volatile uint32_t *)0X4A000008))
#define PRIORITY (*((volatile uint32_t *)0X4A00000C))
#define EXTINT0 (*((volatile uint32_t *)0X56000088))
#define EXTINT1 (*((volatile uint32_t *)0X5600008C))
#define EINTMASK (*((volatile uint32_t *)0X560000A4))
#define EINTPEND (*((volatile uint32_t *)0X560000A8))
#define INTPEND (*((volatile uint32_t *)0X4A000010))
#define INTOFFSET (*((volatile uint32_t *)0X4A000014))
#define Fall_INT 2
#define KEY1_EINT 0
#define KEY2_EINT 2
#define KEY3_EINT 5
#define KEY1_PIN 0
#define KEY2_PIN 2
#define KEY3_PIN 3
/*
* LED1,LED2,LED4对应GPF4、GPF5、GPF6
*/
#define GPF4_out (1<<(4*2))
#define GPF5_out (1<<(5*2))
#define GPF6_out (1<<(6*2))
#define GPF4_msk (3<<(4*2))
#define GPF5_msk (3<<(5*2))
#define GPF6_msk (3<<(6*2))
/*
* S2,S3,S4对应GPF0、GPF2、GPG3
*/
#define GPF0_eint (0x2<<(0*2))
#define GPF2_eint (0x2<<(2*2))
#define GPG3_eint (0x2<<(3*2))
#define GPF0_msk (3<<(0*2))
#define GPF2_msk (3<<(2*2))
#define GPG3_msk (3<<(3*2))
#define LED1 4
#define LED2 5
#define LED3 6
#define output 1
#define eint 2
#define Ledon 0
#define Ledclose 1
#define Led_ON(n) GPFDATA &= ~((Ledclose << LED##n))
#define Led_Toggle(n) GPFDATA ^= ((Ledclose << LED##n))
#define Led_CLOSE(n) GPFDATA |= (Ledclose << LED##n)
void disable_watch_dog(void)
{
wdtcon = 0;
}
void delayms(uint32_t u32delayms)
{
uint32_t i;
for(i = 0; i < 1000*u32delayms; i++)
{
}
}
void ledinit(void)
{
// LED1,LED2,LED4对应的3根引脚设为输出
GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);
GPFCON |= GPF4_out | GPF5_out | GPF6_out;
//GPFCON = 0; 给这个寄存器直接赋值,其中这个寄存器有一些是保留位,会导致系统复位。
//GPFCON |= (output << (LED1 * 2)) | (output << (LED2 * 2)) | (output << (LED3 * 2));
//GPFDATA = wdtcon;
//delayms(2);
//GPFDATA |= ((Ledclose << LED1) | (Ledclose << LED2) | (Ledclose << LED3));
//GPFUP = 0;
/* */
}
void initKeyIRQ(void)
{
GPFCON |= (eint << (KEY1_PIN * 2)) | (eint << (KEY2_PIN * 2));
GPGCON |= (eint << (KEY3_PIN * 2));
SRCPND = (1 << KEY1_EINT) | (1 << KEY2_EINT)| (1 << KEY3_EINT);
INTPEND = (1 << KEY1_EINT) | (1 << KEY2_EINT)| (1 << KEY3_EINT);
EINTMASK &= ~(1 << 11);
INTMOD = 0;
/*
//PRIORITY = 0;
PRIORITY = (PRIORITY & ((~0x01) | (0x3<<7))) | (0x0 << 7) ;
//PRIORITY = (PRIORITY & ((~0x01) | (0x3<<7))) | (0x0 << 7) ;
//EXTINT0 |= (Fall_INT << (KEY1_EINT * 4)) | (Fall_INT << (KEY2_EINT * 4));
//EXTINT1 |= (Fall_INT << (12));
INTMASK &= ~((1 << KEY1_EINT) | (1 << KEY2_EINT) | (1 << KEY3_EINT));
// S2,S3对应的2根引脚设为中断引脚 EINT0,ENT2
GPFCON &= ~(GPF0_msk | GPF2_msk);
GPFCON |= GPF0_eint | GPF2_eint;
// S4对应的引脚设为中断引脚EINT11
GPGCON &= ~GPG3_msk;
GPGCON |= GPG3_eint;
// 对于EINT11,需要在EINTMASK寄存器中使能它
EINTMASK &= ~(1<<11);
*/
/*
* 设定优先级:
* ARB_SEL0 = 00b, ARB_MODE0 = 0: REQ1 > REQ3,即EINT0 > EINT2
* 仲裁器1、6无需设置
* 最终:
* EINT0 > EINT2 > EINT11即K2 > K3 > K4
*/
PRIORITY = (PRIORITY & ((~0x01) | (0x3<<7))) | (0x0 << 7) ;
// EINT0、EINT2、EINT8_23使能
INTMASK &= (~(1<<0)) & (~(1<<2)) & (~(1<<5));
}
void EINT_Handle(void)
{
uint32_t offt;
offt = INTOFFSET;
switch(offt)
{
case 0:
//GPFDATA |= (0x7<<4); // 所有LED熄灭
Led_Toggle(1);
//GPFDATA &= ~(1<<4); // LED1点亮
break;
case 2:
//GPFDATA |= (0x7<<4); // 所有LED熄灭
Led_Toggle(2);
//GPFDATA &= ~(1<<5); // LED1点亮
break;
case 5:
//GPFDATA |= (0x7<<4); // 所有LED熄灭
Led_Toggle(3);
//GPFDATA &= ~(1<<6); // LED1点亮
break;
}
delayms(50);
if(5 == offt)
{
EINTPEND = (1 << 11);
}
SRCPND = (1 << offt);
INTPEND = (1 << offt);
}
后来网上查了一下, 写保留位,会导致不可预料的错误 !