zoukankan      html  css  js  c++  java
  • 6410/210按键中断编程

    中断编程

    1、初始化按键、2、初始化中断控制器、3、中断处理

    底板原理图:

    去核心板原理图

    去找到6410的芯片手册,

    引脚配置:touch button.c

    #define GPLCON1 (volatile unsigned long *)0x7F008814

    void button_init()

    {

        *(GPLCON1) = (0b0011<<0)|(0b0011<<4)|(0b0011<<8)|(0b0011<<12);

    }

    中断控制器的初始化:touch interrupt.c(做的工作:使能中断、取消中断的屏蔽位,设置按键应该是下降沿触发)

    #define EINT0CON1 (volatile unsigned long *)0x7F008904

    #define EINT0MASK (volatile unsigned long *)0x7F008920

    #define VIC1INTENABLE(volatile unsigned long *)0x71300010

    #define EINT16_19(volatile unsigned long *)0x71300100

    #define EINT0PEND(volatile unsigned long *)0x7f8924

    void key1_isr()

    {

    }

    void key2_isr()

    {}

    void key3_isr()

    {}

    void key4_isr()

    {}

    void init_irq()

    {

        //配置下降沿触发,去找到6410手册中的外部中断的控制器,找到这个寄存器EINT0CON1

        *(EINT0CON1) = (0b010<<0)|(0b010<<4);

        //去掉对应屏蔽掩码写1清零

       

        *(EINT0MASK)=(0b1<<16)|(0b1<<17)|(0b1<<18)|(0b1<<19);

        //使能中断,我们使用的是EINT16-19,进入到向量中断控制器

    我们的EINT16-19中断隶属于32号中断源,由VIC1中断控制器控制的。

    到VIC1控制器中去使能EINT16-19对应位

    找到寄存器VICXINTENABLE这个寄存器,去搜VIC1INTENABLE这个寄存器

        *(VIC1INTENABLE)  | = 0b1;//是VIC1中断控制器的第一位;
        //去设置CPSR状态寄存器来打开我们的总中断的控制使能
       
       
        //在6410或者210有中断向量设置--向量中断方式不同于2440的非向量中断
        它没有统一的入口(不像2440),而是有许多寄存器(64),每一个寄存器对应一个中断源,该寄存器里面的值是存放的中断处理程序的地址,就可以把对应的按键的处理程序的地址放入其中,当中断产生后,那么硬件直接从对应寄存器当中去取出地址,然后去执行对应的处理程序。
        //因为它对应的是VIC1的第1号中断源(即32号),
    //从地址可以看出有64个地址,每一个地址对应一个中断源的服务程序地址
        //32号中断源对应的是VIC1的第一个地址0x71300100
       
        *(EINT16_19) = key1_isr;//把按键1的地址放到这个地方去,在这个地方别忘了还有17、18、19号中断源分别对应key2、key3、key4但是他们都对应EINT16_19这个寄存器,那么怎么去区分呢???用这个寄存器EINT0PEND。
        //在6410中需要把向量中断方式使能起来,而在210中不需要做这个事情。
        //6410向下兼容2440的非向量中断,6410默认使用非向量中断
        //在cp15的寄存器中去使能
        下面就是去实现这些中断处理了;
    a、保存环境;
    b、中断处理;
    led_on();
    c、清除中断;
    EINT0PEND记录了外部中断是否有产生中断,产生了对应位就会置一。写1清除
         还要去清除下面
    VICXADDRESS寄存器,当中断产生后,除了会去调用处理函数外,还会把记录的地址放入到这个寄存器来,所以处理完之后要对该寄存器清零。
    d、恢复环境
     
    最后还要去设置一下中断下的栈,我们之前用的是SVC下的栈
     
       
       
      

       

       

       

    }

  • 相关阅读:
    out/host/linuxx86/obj/EXECUTABLES/aapt_intermediates/aapt 64 32 操作系统
    linux 查看路由器 电脑主机 端口号 占用
    linux proc进程 pid stat statm status id 目录 解析 内存使用
    linux vim 设置大全详解
    ubuntu subclipse svn no libsvnjavahl1 in java.library.path no svnjavahl1 in java.library.path no s
    win7 安装 ubuntu 双系统 详解 easybcd 工具 不能进入 ubuntu 界面
    Atitit.json xml 序列化循环引用解决方案json
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.跨语言  文件夹与文件的io操作集合  草案
    Atitit.atijson 类库的新特性设计与实现 v3 q31
  • 原文地址:https://www.cnblogs.com/gary-guo/p/5598409.html
Copyright © 2011-2022 走看看