1.看原理图
找到管脚 GPX1_1
2.看数据手册
对外设置:
GPX1CON: 0x11000C20 7:4->0xf WAKEUP_INT1
EXT_INT41CON: 0x11000E04 6:4 -> 0x2 触发方式:下降沿触发
EXT_INT41_MASK: 0x11000F04 1 -> 0 GPX1_1管脚的中断使能
对内设置:
ICDISER_CPU: 0x10490104 -> 1 使能GIC
ICDIPTR14_CPU0 = 0x01010101; //默认设置:背景
ICDDCR: 0x10490000 0->1 分发使能
ICCICR_CPU0: 0x10480000 0->1 接口使能
ICCPMR_CPU0: 0x10480004 7:0 -> 255 最低优先级
代码如下:
#define GPA1CON (*(volatile unsigned int *)0x11400020)
#define ULCON2 (*(volatile unsigned int *)0x13820000)
#define UBRDIV2 (*(volatile unsigned int *)0x13820028)
#define UFRACVAL2 (*(volatile unsigned int *)0x1382002C)
#define UCON2 (*(volatile unsigned int *)0x13820004)
#define UTXH2 (*(volatile unsigned int *)0x13820020)
#define UTRSTAT2 (*(volatile unsigned int *)0x13820010)
#define ADCCON (*(volatile unsigned int *)0x126C0000)
#define ADCDAT (*(volatile unsigned int *)0x126C000C)
#define ADCMUX (*(volatile unsigned int *)0x126C001C)
//————————————————
#define GPX1CON (*(volatile unsigned int *)0x11000C20)
#define EXT_INT41CON (*(volatile unsigned int *)0x11000E04)
#define EXT_INT41_MASK (*(volatile unsigned int *)0x11000F04)
#define ICDISER_CPU (*(volatile unsigned int *)0x10490104)
#define ICDIPTR14_CPU0 (*(volatile unsigned int *)0x10490838)
#define ICDDCR (*(volatile unsigned int *)0x10490000)
#define ICCICR_CPU0 (*(volatile unsigned int *)0x10480000)
#define ICCPMR_CPU0 (*(volatile unsigned int *)0x10480004)
#define ICCIAR_CPU0 (*(volatile unsigned int *)0x1048000C)
#define EXT_INT41_PEND (*(volatile unsigned int *)0x11000F44)
#define ICDICPR_CPU (*(volatile unsigned int *)0x10490284)
#define ICCEOIR_CPU0 (*(volatile unsigned int *)0x10480010)
//延时
void mydelay(int x)
{
int i;
while(x--)
{
for(i=1000;i>0;i--);
}
}
//uart初始化
void UART_Init()
{
//1.对外设置
GPA1CON &= ~0xff;
GPA1CON |= 0x22;
//2.对内设置
ULCON2 = 0x3;//数据位:8 停止位:1 奇偶校验位:无 模式:Normal
//波特率: 115200
UBRDIV2 = 53;//波特率的分频值
UFRACVAL2 = 4;
UCON2 = 0x5;//轮询模式发送和接收
}
//发送字符
void uart_send_byte(char ch)
{
while((UTRSTAT2 & 0x2) == 0);//等发送buffer空
UTXH2 = ch;//发送ch
}
void uart_send_str(char *str)
{
while(*str)
{
uart_send_byte(*str);
str++;
}
}
//按键irq中断初始化
void IRQ_Init()
{
//1.对外设置
GPX1CON |= 0xf << 4;//管脚功能: INT
EXT_INT41CON &= ~(0x7 << 4);
EXT_INT41CON |= 0x2 << 4;//触发方式: 下降沿触发
EXT_INT41_MASK &= ~0x2;//中断管脚使能
//2.对内设置
ICDISER_CPU |= 0x1 << 25;//使能EXINT9 -> port No
ICDIPTR14_CPU0 = 0x01010101; //默认设置:背景
ICDDCR |= 0x1;//分发使能
ICCICR_CPU0 |= 0x1;//CPU0接口使能
ICCPMR_CPU0 &= ~0xff ;
ICCPMR_CPU0 |= 255;//指定cpu0的优先级
}
//中断处理函数
void irq_do()
{
int id = ICCIAR_CPU0 & 0x3ff;//获取中断的ID
switch(id)
{
case 57: //EXINT9
uart_send_byte('i');
EXT_INT41_PEND |= 0x2; //清中断标志位
ICDICPR_CPU |= 0x1 << 25;
break;
case 58:
break;
default:
break;
}
ICCEOIR_CPU0 &= ~0x3ff;
ICCEOIR_CPU0 |= id; //结束中断
}
int main(int argc, char *argv[])
{
UART_Init();
IRQ_Init();
while(1)
{
uart_send_byte('a');
mydelay(500);
}
return 0;
}