ARM实验5 —— 按键中断实验
key_int按键中断实验
实验内容:
通过开发板上的按键中断控制led灯进行跑马灯并打印信息。
通过简单事例说明猎户座4412处理器的GIC中断处理的应用,设置key2按键连接的引脚为中断模式,当识别按键被按下时进入相应的中断处理函数
实验目的:
熟悉开发环境的使用
掌握猎户座4412处理器的中断过程及编程。
实验平台:
fs4412开发板,eclipse,secureCRT。
实验步骤:

对外设进行使能:
1.查看key2在开发板的位置:

2.查看UART_RING在核心板的位置:

3.查看GPX1在芯片手册的位置:

4.查看GPX1的中断源:

5.设置TXT_INT41[1]为下降沿触发。

6.使能TXT_INT41[1]

实验代码
#include "exynos_4412.h"
typedef enum
{
false,
true
}bool;
void do_irq()
{
// 获取中断号
unsigned int irq_num = CPU0.ICCIAR & 0x3ff;
switch(irq_num)
{
case :
printf("This interrupt id is %d\n", irq_num); led_isOn(true);
mydelay_ms();
led_isOn(false);
//mydelay_ms(1000); EXT_INT41_PEND = 0x1 << ; // 清pend(置1清0)
ICDICPR.ICDICPR1 = 0x1 << ; // 清中断使能位
break;
case :
printf("58This interrupt id is %d\n", irq_num);
break;
default:
printf("Interrupt is not exist!\n");
break;
} // 把处理器中处理完的中断号返回给gic
// 告诉gic该中断处理结束,可以送入下一个pending进入
CPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x3ff)) | irq_num;
} void peripheral_init()
{
GPX1.CON = 0xf << ; // 配置GPIO为外部中断
EXT_INT41_CON = 0x2 << ; // 下降沿触发中断
EXT_INT41_MASK = 0x0; // 使能相应外设
} void gic_init()
{
ICDDCR = 0x1; // 使能中断到分配器
ICDISER.ICDISER1 = 0x1 << ; // 使能按键中断号
CPU0.ICCICR = 0x1; // 把中断从cpu接口送入处理器
// 屏蔽中断优先级,255表示所有中断都允许通过
CPU0.ICCPMR = 0xff;
ICDIPTR.ICDIPTR14 = 0x1 << ; // 选择cpu接口
} void mydelay_ms(int ms)
{
int i, j;
while(ms--)
{
for (i = ; i < ; i++)
for (j = ; j < ; j++);
}
} void len_init(){
GPX1.CON = (GPX1.CON& (~0xf)) | 0x1;
GPF3.CON = GPF3.CON | (0x1<<);
GPF3.CON = GPF3.CON | (0x1<<);
GPX2.CON = GPX2.CON & (~(0xf<<)) | (0x1<<);
}
void led_isOn(bool bFlag)
{
if(bFlag == false)
GPX2.DAT &= ~(0x1<<); // led is off
else
GPX2.DAT |= 0x1<<; // LED is on mydelay_ms(); if(bFlag == false)
GPX1.DAT &= ~0x1; // led is off
else
GPX1.DAT |= 0x1; // LED is on mydelay_ms();
if(bFlag == false)
GPF3.DAT &= ~(0x1<<); // led is off
else
GPF3.DAT |= 0x1<<; // LED is on
mydelay_ms(); if(bFlag == false)
GPF3.DAT &= ~(0x1<<); // led is off
else
GPF3.DAT |= 0x1<<; // LED is on }
int main()
{
peripheral_init();
gic_init(); len_init(); int i = ;
while()
{
printf("i = %d\n", i++);
mydelay_ms();
} return ;
}
实验结果;

拓展:根据key2 的代码写一个key3 的代码。
查看k3在开发板的位置:

查看SIM_DET 在核心板的位置;

查看GPX1_2在芯片手册的位置;
中断源:

代码:
/*
* main.c
*
* Created on: 2018-9-24
* Author: Administrator
*/ #include"exynos_4412.h"
typedef enum
{
false,
true
}bool; void do_irq()
{
// 获取中断号
unsigned int irq_num = CPU0.ICCIAR & 0x3ff;
switch(irq_num)
{ case :
printf("58This interrupt id is %d\n", irq_num);
led_isOn(true);
mydelay_ms();
led_isOn(false);
//mydelay_ms(1000); EXT_INT41_PEND = 0x1 << ; // 清pend(置1清0)
ICDICPR.ICDICPR1 = 0x1 << ; // 清中断使能位 break;
default:
printf("Interrupt is not exist!\n");
break;
} // 把处理器中处理完的中断号返回给gic
// 告诉gic该中断处理结束,可以送入下一个pending进入
CPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x3ff)) | irq_num;
} void peripheral_init()
{
GPX1.CON = 0xf << ; // 配置GPIO为外部中断
EXT_INT41_CON = 0x2 << ; // 下降沿触发中断
EXT_INT41_MASK = 0x0; // 使能相应外设
} void gic_init()
{
ICDDCR = 0x1; // 使能中断到分配器
ICDISER.ICDISER1 = 0x1 << ; // 使能按键中断号
CPU0.ICCICR = 0x1; // 把中断从cpu接口送入处理器
// 屏蔽中断优先级,255表示所有中断都允许通过
CPU0.ICCPMR = 0xff;
ICDIPTR.ICDIPTR14 = 0x1 << ; // 选择cpu接口
} void len_init(){
GPX1.CON = (GPX1.CON& (~0xf)) | 0x1;
GPF3.CON = GPF3.CON | (0x1<<);
GPF3.CON = GPF3.CON | (0x1<<);
GPX2.CON = GPX2.CON & (~(0xf<<)) | (0x1<<);
}
void led_isOn(bool bFlag)
{
if(bFlag == false)
GPX2.DAT &= ~(0x1<<); // led is off
else
GPX2.DAT |= 0x1<<; // LED is on mydelay_ms(); if(bFlag == false)
GPX1.DAT &= ~0x1; // led is off
else
GPX1.DAT |= 0x1; // LED is on mydelay_ms();
if(bFlag == false)
GPF3.DAT &= ~(0x1<<); // led is off
else
GPF3.DAT |= 0x1<<; // LED is on
mydelay_ms(); if(bFlag == false)
GPF3.DAT &= ~(0x1<<); // led is off
else
GPF3.DAT |= 0x1<<; // LED is on } void mydelay_ms(int ms)
{
int i, j;
while(ms--)
{
for (i = ; i < ; i++)
for (j = ; j < ; j++);
}
} int main(){
peripheral_init();
gic_init();
len_init();
int i = ;
while()
{
printf("i = %d\n", i++);
mydelay_ms();
} return ;
}

拓展二,由原先的中断使用CPU0,改为使用cpu1;
代码
#include "exynos_4412.h"
typedef enum
{
false,
true
}bool;
void do_irq()
{
// 获取中断号
unsigned int irq_num = CPU0.ICCIAR & 0x3ff;
switch(irq_num)
{
case :
printf("This interrupt id is %d\n", irq_num); led_isOn(true);
mydelay_ms();
led_isOn(false);
//mydelay_ms(1000); EXT_INT41_PEND = 0x1 << ; // 清pend(置1清0)
ICDICPR.ICDICPR1 = 0x1 << ; // 清中断使能位
break;
case :
printf("58This interrupt id is %d\n", irq_num);
break;
default:
printf("Interrupt is not exist!\n");
break;
} // 把处理器中处理完的中断号返回给gic
// 告诉gic该中断处理结束,可以送入下一个pending进入
CPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x3ff)) | irq_num;
} void peripheral_init()
{
GPX1.CON = 0xf << ; // 配置GPIO为外部中断
EXT_INT41_CON = 0x2 << ; // 下降沿触发中断
EXT_INT41_MASK = 0x0; // 使能相应外设
} void gic_init()
{
ICDDCR = 0x1; // 使能中断到分配器
ICDISER.ICDISER1 = 0x1 << ; // 使能按键中断号
CPU1.ICCICR = 0x1; // 把中断从cpu接口送入处理器
// 屏蔽中断优先级,255表示所有中断都允许通过
CPU1.ICCPMR = 0xff;
ICDIPTR.ICDIPTR14 = 0x1 << ; // 选择cpu接口
} void mydelay_ms(int ms)
{
int i, j;
while(ms--)
{
for (i = ; i < ; i++)
for (j = ; j < ; j++);
}
} void len_init(){
GPX1.CON = (GPX1.CON& (~0xf)) | 0x1;
GPF3.CON = GPF3.CON | (0x1<<);
GPF3.CON = GPF3.CON | (0x1<<);
GPX2.CON = GPX2.CON & (~(0xf<<)) | (0x1<<);
}
void led_isOn(bool bFlag)
{
if(bFlag == false)
GPX2.DAT &= ~(0x1<<); // led is off
else
GPX2.DAT |= 0x1<<; // LED is on mydelay_ms(); if(bFlag == false)
GPX1.DAT &= ~0x1; // led is off
else
GPX1.DAT |= 0x1; // LED is on mydelay_ms();
if(bFlag == false)
GPF3.DAT &= ~(0x1<<); // led is off
else
GPF3.DAT |= 0x1<<; // LED is on
mydelay_ms(); if(bFlag == false)
GPF3.DAT &= ~(0x1<<); // led is off
else
GPF3.DAT |= 0x1<<; // LED is on }
int main()
{
peripheral_init();
gic_init(); len_init(); int i = ;
while()
{
printf("i = %d\n", i++);
mydelay_ms();
} return ;
}
结果

ARM实验5 —— 按键中断实验的更多相关文章
- cc2530的第三次实验,按键中断控制流水灯
cc2530的第三次实验:按键中断控制流水灯 效果为按一次按键,流水灯亮一次 实验相关电路图: 实验相关寄存器: 初始化函数 //初始化LED灯 //设置P1SEL,通用为0,外设为1 1111110 ...
- 【黑金ZYNQ7000系列原创视频教程】06.ZYNQ来自FPGA的中断——按键中断实验
黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36640&extra=page%3D1 爱奇艺地址: http: ...
- FPGA与simulink联合实时环路系列——实验三 按键key
实验三 按键key 实验内容 在FPGA的实验中,经常涉及到按键的使用,按键是必不可少的人机交互的器件之一,在这些实验中,有时将按键的键值读取显示到数码管.LCD或者是通过串口传送到PC的串口助手上进 ...
- u-boot中断功能初步分析之---------按键中断
作者:彭东林 邮箱:pengdonglin137@163.com QQ: 405728433 以前一直有个疑问,在U-boot下到底能不能使用中断,为了验证这个问题,于是乎,昨天晚上我在自己的 TQ2 ...
- S02_CH08_ ZYNQ 定时器中断实验
S02_CH08_ ZYNQ 定时器中断实验 上一章实现了PS接受来自PL的中断,本章将在ZYNQ的纯PS里实现私有定时器中断.每隔一秒中断一次,在中断函数里计数加1,通过串口打印输出. 8.1中断原 ...
- 嵌入式02 STM32 实验08 外部中断
一.中断 由于某个事件的发生,CPU暂停当前正在执行的程序,转而执行处理事件的一个程序.该程序执行完成后,CPU接着执行被暂停的程序.这个过程称为中断.(我正在捉泥鳅,但是我妈喊我回家吃饭,我必须回家 ...
- 基于ZYNQ 的UART中断实验之串口写数据到DDR3中
1.参考 UG585 网络笔记 2.理论知识 参见上一次实验:基于ZYNQ 的UART中断实验 3.实验目的 练习使用UART的中断实验,并将接收到的数据写入到DDR3中. 4.实验过程 建立工程,设 ...
- S02_CH09_UART串口中断实验
S02_CH09_UART串口中断实验 本章的UART中断将在之前PL_PS中断和定时器中断上推导出来,因此本章有点难度,如果前两章还不是很熟悉的话,需要返回到前面两章把这两章的内容再次消化一下,再来 ...
- CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)
目录 1.前期预备知识 1.1 新大陆Zigbee模块按键电路图 1.2 CC2530相关寄存器 1.3 CC2530中断走向图 1.4 使用C语言为51单片机编写中断程序 1.5 *函数指针 2. ...
随机推荐
- Codeforces Round #520 (Div. 2) B math(素数因子的应用)
题意: 给出一个n ; 有两个操作: 1,mul A , n=n*A : 2,sqrt() , n=sqrt(n) 开更出来必须是整数 : 求出经过这些操作后得出的最小 n , 和 ...
- java Sprint boot 学习之一
<properties> <project.build.sourceEncoding>UTF-</project.build.sourceEncoding> < ...
- pandas学习3(数据处理)
- python 中is和= = 的区别
Python中的对象包含三要素:id.type.value,其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值. is判断的是a对象是否就是b对象,是通过id来判断的: ==判 ...
- Launch iCar Scan Android Scanner Support Bluetooth X431 iDiag Update Version
Autonumen.com release new Launch iCar Scan for Android,Launch iCarScan Bluetooth Scanner is update v ...
- Redis未授权访问反弹shell
Redis未授权访问反弹shell 目标主机:10.104.11.178 攻击机:kali 攻击步骤: 1.与目标主机连接 root@kali:~# /usr/redis/redis-cli -h 1 ...
- Jenkins遇到哪些坑~
1Jenkins关闭和重启实现方式. 1.关闭Jenkins 只需要在访问jenkins服务器的网址url地址后加上exit.例如我jenkins的地址http://localhost:8080/ ...
- Neutron命令测试2
/etc/network/interfaces auto loiface lo inet loopback auto eth0iface eth0 inet manualup ifconfig $IF ...
- 修改linux文件权限命令
修改linux文件权限命令:chmod Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限分为只读,只写和可执行三种.以文 ...
- HDU 3829——Cat VS Dog——————【最大独立集】
Cat VS Dog Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit S ...