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. ...
随机推荐
- sharepoint_study_目录学习笔记(长期更新)
1. _catalogs/masterpage:这个是SharePoint网站的母版页样式库页面,这里放了网站上所有的母版页(网站设置--Web设计器库--母版页和页面布局). 2. 15\TEMP ...
- Margarite and the best present
Little girl Margarita is a big fan of competitive programming. She especially loves problems about a ...
- django 请求体和请求体相关知识
请求头ContentType ContentType指的是请求体的编码类型,常见的类型共有3种: django 如果发送post请求,或者表单提交数据.如果不设置enctype属性. 就会以appli ...
- java向数据库插入数据时的错误: Duplicate entry '' for key 'PRIMARY' 问题解决
错误提示为:你插入的记录与数据表中原有记录的主键重复了(Duplicate).所以插入失败 mysql主键设置成auto_increment时,进行并发性能测试出现主键反复Duplicate entr ...
- Electron、Node.js、JavaScript、JQuery、Vue.js、Angular.js,layui,bootstrap
转载:https://blog.csdn.net/meplusplus/article/details/79033786 layui :是基于jquery库的封装开发. bootstrap:同样基于 ...
- linux及hadoop基本操作
cd 命令:切换目录 () 切换到目录“/usr/local” ) 切换到当前目录的上一级目录 ) 切换到当前登录 Linux 系统的用户的自己的主文件夹 ls 命令:查看文件与目录 ...
- java——快排、冒泡、希尔、归并
直接贴代码 快排: public class Test { private static void sort(int[] nums){ if(nums == null || nums.length = ...
- 使用vue-cli脚手架安装和webpack-simple模板项目生成
Vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目. GitHub地址是:https://github.com/vuejs/vue-cli 一. ...
- Hadoop Intro - Configure
Hadoop学习(二) Hadoop配置文件参数详解 Hadoop运行模式分为安全模式和非安全模式,在这里,我将讲述非安全模式下,主要配置文件的重要参数功能及作用,本文所使用的Hadoop版本为2 ...
- CharacterController控制的物体移动
CharacterController控制的物体移动: public class playerMove : MonoBehaviour { public float Speed; private C ...