TQ2440之按键中断

发布者:支持中文最新更新时间:2016-04-22 来源: eefocus关键字:TQ2440  按键中断 手机看文章 扫描二维码
随时随地手机看文章
这次是按键中断,首先呢,中断初始化方面确实比较麻烦。我自己设计的裸机程序是TQ板子上四个按键,当按键按下时触发一次中断,并且LED灯对应的就会亮,这里要赞一下TQ的板子,按键4用的是子中断,当时我调程序的时候发现每次只要我按下按键4就陷入死循环出不来了,后来文彬指点了一句会不会是子中断的问题一出口我就知道问题出在哪了,其实他是知道的,故意让我纠结一下,还好没让我纠结那么久。TQ2440之按键中断TQ2440之按键中断程序是我自己编的,有一开始自己写的有点乱然后后边整理了一下并且参考了别人编程的风格习惯所以就形成了我下面给出的程序,有在板子上运行处成功,关于一些头文件跟c文件就不说了,真正有心在做裸机的知道解决方法。
#include "2440addr.h"
#include"option.h"
 
    
#define LED1_ON (rGPBDAT &= ~(1<<5) ) //置0灯亮,置1灯灭
#define LED1_OFF (rGPBDAT |=(1<<5) ) 
#define LED2_ON (rGPBDAT &= ~(1<<6) )
#define LED2_OFF (rGPBDAT |=(1<<6) ) 
#define LED3_ON (rGPBDAT &= ~(1<<7) )
#define LED3_OFF (rGPBDAT |=(1<<7) ) 
#define LED4_ON (rGPBDAT &= ~(1<<8) )
#define LED4_OFF (rGPBDAT |=(1<<8) )        
   
void delay(void)
{
unsigned int i,j;
for(i=0;i<1000;i++)
for(j=0;j<6000;j++)//纯粹是为了灯亮的好看不会闪烁;
;
}
 
void __irq Key1_ISR(void)//提前定义,不然下边的pISR_EINT那里会报错,原因c语言检测不到函数定义
{
rSRCPND |= (1<<1);//清除中断标志位,下面相同
rINTPND |= (1<<1);
LED1_ON;
delay();
LED1_OFF;
}
 
void __irq Key2_ISR(void)
{
rSRCPND |= (1<<4);
rINTPND |= (1<<4);
rEINTPEND |= (1<<4);//使能EINT4,因为它是复用的,所以要加上这句
rEINTMASK &= (~(1<<4));//中断屏蔽
LED2_ON;
delay();
LED2_OFF;
}
 
void __irq Key3_ISR(void)
{
rSRCPND |= (1<<2);
rINTPND |= (1<<2);
LED3_ON;
delay();
LED3_OFF;
}
 
void __irq Key4_ISR(void)
{
rSRCPND |= (1<<0);
rINTPND |= (1<<0);
LED4_ON;
delay();
LED4_OFF;
}
 
void led_init(void)//初始化灯
{
rGPBCON = 0x15400;//全部设置为I/O输出
rGPBUP = 0x00;//使能上拉电阻
rGPBDAT |= (1<<5)|(1<<6)|(1<<7)|(1<<8);//先让灯全灭,不然看不到效果
}
 
void key_init(void)//初始化中断
{
rGPFCON |= (1<<1)|(1<<3)|(1<<5)|(1<<9); //设置寄存器为中断方式
rEXTINT0 |= (1<<1)|(1<<5)|(1<<9)|(1<<17);//设置外部中断为下降沿方式触发
rEINTMASK &= (~(1<<4));//EINT4中断有效 
rEINTPEND |= (1<<4);//写1清除EINT4中断标志位
rSRCPND |= (1<<0)|(1<<1)|(1<<2)|(1<<4);//EINT0、1、2、4等待请求服务
rINTMSK &= (~(1<<0))&(~(1<<1))&(~(1<<2))&(~(1<<4));//设置cpu服务EINT0、1、2、4
rINTPND |= (1<<0)|(1<<1)|(1<<2)|(1<<4);//优先级的问题,IRQ决定服务哪个哪个中断源先
pISR_EINT0 = (unsigned)Key4_ISR;
pISR_EINT1 = (unsigned)Key1_ISR;
pISR_EINT2 = (unsigned)Key3_ISR;
    pISR_EINT4_7 = (unsigned)Key2_ISR;//就是这里啦,报unsigned错误让我调了好几天的地方,这里是设置中断服务子程序地址
}
 
void Main(void)
{
MMU_Init();
led_init();//初始化灯
key_init();//初始化中断
while(1);//死循环,等待按键中断
}
 
 
最近比较懒,好久没开博客看看了,下次再把串口裸机程序发上来,做好了,可是懒得写。最近要复习期末考,做到nand flash的操作裸机程序就暂且放一放,等考完试后再把它完成之后就正式进入驱动的学习,同时可能会学习一下UC/OS ii。
关键字:TQ2440  按键中断 引用地址:TQ2440之按键中断

上一篇:关于启动代码2440init.s(三)
下一篇:TQ2440之串口传输数据

推荐阅读最新更新时间:2024-03-16 14:51

TQ2440国嵌学院gboot-bss段初始化
BSS段主要用来存放未初始化的全局变量 首先先查看我们的链接器脚本文件,也就是gboot.lds OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { . = 0x30008000; . = ALIGN(4); .text : { start.o (.text) *(.text) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); bss_start = .; .bss : { *(.bss) } bss_end = .; } 可以看到上面bss段的开始地址bss_start和结束地址bss_end,
[单片机]
TQ2440之串口传输数据
串口打印,好东西啊这个。目标就是从板子传输数据打印在超级终端上,也就是在电脑上能显示板子传输的数据即可,这个比较容易,有参考了TQ自带的2440lib.c文件,对初始化那些参考芯片跟那个c文件之后很快程序就出来了,有更简便的方法,但是要自己写出来才比较印象深刻。 程序如下: #include 2440addr.h #include Option.h #include def.h //一旦用到U32怎么不行 unsigned int PCLK; extern void Uart_Printf(char *fmt,...);//函数申明,不然一直提示警告 extern void Uart_Select(int ch);
[单片机]
单片机学习之十二:按键控制跑马灯(中断
一、实验现象: 二极管作左右跑马灯,当按下外部按键K0时,8个二极管全部闪烁5次后从K0按下之前的位置继续作跑马灯。 二、实验目的 掌握堆栈在中断程序中的作用 掌握让程序保护现场的方法 三、实验任务分析: 有了以前各个试验的经验,相信这个试验对我们来说,难度不是很大。我们唯一接触到的新的知识点是:让程序从返回中断之前的位置继续执行跑马灯,那么如何能够让程序在进入中断之前记住当时所处的位置,在执行中断之后,能够返回这个地方继续往下执行呢? 我们可以这样作:在进入中断之前,把该时刻的程序信息放到一个地方保存下来,在返回中断之前,再到这个地方把我们存放的程序信息取出来。这样不就可以从进入中
[单片机]
单片机学习之十二:<font color='red'>按键</font>控制跑马灯(<font color='red'>中断</font>)
移植uboot-2012.04.01到TQ2440
开发环境 主机开发环境:ubuntu12.04 BootLoader:u-boot-2012.04.01 kernel:linux-2.6.30.4 CPU:s3c2440 开发板:TQ2440 交叉编译工具链:arm-linux-gcc 4.3.3 步骤 具体移植步骤参见https://www.bilibili.com/video/BV1Pt411n7cv 我是参考韦东山的移植教程做的,期间遇到好多问题,但是都解决了,具体步骤暂时先不写呢,有时间在写,哈哈。 实验现象 当u-boot在TQ2440上启动成功后,采用韦东山编译的uImage运行不了,如下图 显示无法挂载根文件系统,可能他的内核有哪些配置和我的板卡不一致
[单片机]
移植uboot-2012.04.01到<font color='red'>TQ2440</font>
利用定时器中断使用独立按键
按下独立按键s2(键盘第一个按键)数码管显示1; 按下独立按键s3(键盘第一个按键)数码管显示2; 按下独立按键s5(键盘第一个按键)数码管显示4; #include reg52.h #include intrins.h #define uint unsigned int #define uchar unsigned char sbit DU = P2^6;//数码管段选 sbit WE = P2^7;//数码管位选 sbit s2 = P3^0;//独立按键s2 sbit s3 = P3^1;//独立按键s3 sbit s5 = P3^3;//独立按键s5 uchar num ; //共阴极数码管段选表1、2、
[单片机]
单片机学习之十一:中断方式按键
1、 实验现象 最右面的数码管初始显示0,每次按下外部按键K0执行加一,计数到九时重新回零。 2、 实验目的 掌握中断方式响应按键的原理 掌握中断服务程序的具体编写:如何进行键的识别,如何去抖动 3、 实验任务分析 上一个试验我们了解了查询方式按键的原理。当单片机工作于查询方式的时候,要不间断的对外部按键进行查询,其间单片机不能干其他的任何工作。如果单片机的工作量较大,这种方式就很难适应。 为了进一步提高单片机的工作效率,可以采用中断方式。 中断方式的按键响应过程如下:单片机处理自己的工作,如果有按键按下,向单片机发出中断请求,单片机就会停下现在正在处理的工作,转去执行中断程序,执行之后回来继续刚才的工作;如果
[单片机]
单片机学习之十一:<font color='red'>中断</font>方式<font color='red'>按键</font>
8051/2 单片机基础 LED闪烁,蜂鸣器,数码管驱动,独立按键中断,定时中断,串口通信
从软件转硬件路总是很艰难,各种电路知识,3个多月了,现在总算是入门了。 AT 8051/2 1.驱动LED闪烁 2.驱动蜂鸣器进行响动 3.驱动共阳级,单数码管,0—9 变化(MPX1-CA) - 使用8排阻 + NPN三极管 4.驱动共阴级,但数码管,0-9 变化(MPX1-CC) - 使用芯片74HC245 + PNP三极管 5.独立按键,控制单片机,并点亮/熄灭LED 6.中断,控制点亮/熄灭LED - INT0 , INT1 7.定时中断,控制点亮/熄灭LED - T0 , T1 8.串口通信 电路图: C代码: /** * 8051 DEMO 1 * 1.驱动LED闪烁 * 2.驱动蜂鸣器进行响动 *
[单片机]
8051/2 单片机基础 LED闪烁,蜂鸣器,数码管驱动,独立<font color='red'>按键</font>,<font color='red'>中断</font>,定时<font color='red'>中断</font>,串口通信
TQ2440之uboot---6.start.S中relocate部分分析,adr与ldr区别
在u-boot的start.S中有这么一段 relocate: /*relocate U-Boot to RAM */ adr r0, _start /*r0 - current position of code */ ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ cmp r0, r1 /* don't reloc duringdebug */ beq clear_bss ldr r2, _armboot_start ldr
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved