6410/210按键中断编程
2016-06-19 17:22
281 查看
中断编程
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下的栈
}
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下的栈
}
相关文章推荐
- Python-format函数
- List列表的用法以及使用
- MATLAB 与Modelsim之间对测试系统的联合仿真
- Spring-----Spring Jar包
- JavaSE学习53:细说多线程之内存可见性
- C#类详解
- 练习:C# -- 多态
- 运行python程序
- java对象与json对象间的相互转换
- 为什么在C++中需要虚函数
- JAVA图书馆库存管理系统程序代码(管理系统+用户购买结账系统)
- 01.Java 集合 - 概述
- 20145311王亦徐《JAVA程序设计》课程总结
- Ruby on Rails(二) - 初探Ruby on Rails, 搭建一个博客项目并发布(草稿)
- JAVA学习总结十七
- Ubuntu 16.04下指定Sublime Text 3 默认python编译版本
- spring IOC装配bean
- CE6810交换机通过FTP进行文件传输
- Spring-----Spring整合Struts2实例
- PHP打印输出数组内容及结构函数print_r与var_dump