ARM嵌入式体系结构与技术接口:实现按键k2中断


                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;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

এ᭄星辰

混口饭吃。。。。。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值