加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ARM 按键实验

发布时间:2020-12-15 06:44:59 所属栏目:百科 来源:网络整理
导读:? 下面这个是没有使用中断功能的 #include "2410addr.h" #define LED1??????????????? (15)??????????????? // rGPB[5] =1 ; #define LED2??????????????? (16)??????????????? // rGPB[6] =1 ; #define LED3??????????????? (17)??????????????? // rGPB[7]
?

下面这个是没有使用中断功能的

#include "2410addr.h"

#define LED1??????????????? (1<<5)??????????????? // rGPB[5] =1 ;
#define LED2??????????????? (1<<6)??????????????? // rGPB[6] =1 ;
#define LED3??????????????? (1<<7)??????????????? // rGPB[7] =1 ;
#define LED4??????????????? (1<<8)??????????????? // rGPB[8] =1 ;

#define KEY1??????????????? (1<<1)??????????????? // rGPF[1] =1 ;
#define KEY2??????????????? (1<<4)??????????????? // rGPF[4] =1 ;
#define KEY3??????????????? (1<<2)??????????????? // rGPF[2] =1 ;
#define KEY4??????????????? (1<<0)??????????????? // rGPF[0] =1 ;


void Main(void){
???
??? rGPBCON = 0x015550;
??? rGPBUP? = 0x7ff;
??? rGPFUP = 0xf800;?????????????????????? //? KEY [7:0] => PU En
?rGPFCON=0xfcc0;????????????????????? //KEY[7:0] => INPUT;
?
??
??? while (1){
??? rGPBDAT = 0xfff;
???
??? if ( !(rGPFDAT & KEY1) )
?????? rGPBDAT=rGPBDAT & ~LED1;
??????
??? if ( !(rGPFDAT & KEY2) )
?????? rGPBDAT=rGPBDAT & ~LED2;
???
??? if ( !(rGPFDAT & KEY3) )
?????? rGPBDAT=rGPBDAT & ~LED3;
???
??? if ( !(rGPFDAT & KEY4) )
?????? rGPBDAT=rGPBDAT & ~LED4;
???
?? }
?}?

?

下面这个是使用中断功能的

#define GLOBAL_CLK? 1

#include "def.h"
#include "2440addr.h"
#include "mmu.h"
#include "option.h"

#define LED1??????????????? (1<<5)??????????????? // rGPB[5] =1 ;
#define LED2??????????????? (1<<6)??????????????? // rGPB[6] =1 ;
#define LED3??????????????? (1<<7)??????????????? // rGPB[7] =1 ;
#define LED4??????????????? (1<<8)??????????????? // rGPB[8] =1 ;

#define KEY1??????????????? (1<<1)??????????????? // rGPF[1] =1 ;
#define KEY2??????????????? (1<<4)??????????????? // rGPF[4] =1 ;
#define KEY3??????????????? (1<<2)??????????????? // rGPF[2] =1 ;
#define KEY4??????????????? (1<<0)??????????????? // rGPF[0] =1 ;

void Delay1(int time)
{
? unsigned int i,j;
? for(i=1;i<100;i++)
??? for(j=1;j<time;j++)
????? ;
}

void LightLED(void){
?
?? if ( !(rGPFDAT & KEY1) )
?????? rGPBDAT=rGPBDAT & ~LED1;
??????
??? if ( !(rGPFDAT & KEY2) )
?????? rGPBDAT=rGPBDAT & ~LED2;
???
??? if ( !(rGPFDAT & KEY3) )
?????? rGPBDAT=rGPBDAT & ~LED3;
???
??? if ( !(rGPFDAT & KEY4) )
?????? rGPBDAT=rGPBDAT & ~LED4;
??????
??? Delay1( 20000 ) ;
??????
???? rGPBDAT = 0xfff;
}
void __irq IRQ_KEY1(void){
??
?? ClearPending(BIT_EINT0);
?
?? LightLED();??
}

void __irq IRQ_KEY2(void){
??
?? ClearPending(BIT_EINT1);
??
?? LightLED();
}

void __irq IRQ_KEY3(void){
??
?? ClearPending(BIT_EINT2);
??
?? LightLED();
}

void __irq IRQ_KEY4(void){
??
?? if(rEINTPEND &(1<<4))
?? {??????
????? rEINTPEND = (1<<4);
????? ClearPending(BIT_EINT4_7);
????? rGPBDAT=rGPBDAT & ~LED4;
?????
????? rGPBDAT = 0xfff;
?? }
?? else
?? {
????? rEINTPEND=0xffffff;
????? ClearPending(BIT_EINT4_7);??
?? }
??
?? LightLED();?
}

void EINT_Init(void){
??
?? //我这里的按键接口是
?? // k4-GPF0 -- 设置为中断应该是10
?? // k3-GPF2 -- 10
?? // k2-GPF4 -- 10
?? // k1-GPF1 -- 10
?? rGPFCON = 0xfeea;//222221 10 11 10 10 10
?? //rGPFUP = 0x7ff;
?? rEXTINT0 = 0x020222; //set eint0,1,2,4 falling edge interrupt
?? // 0 010 0 000 0 010 0 010 0 010?
??
?? pISR_EINT0 = (unsigned int)IRQ_KEY1;
?? pISR_EINT1 = (unsigned int)IRQ_KEY2;
?? pISR_EINT2 = (unsigned int)IRQ_KEY3;
?? pISR_EINT4_7 = (unsigned int)IRQ_KEY4;
??
?? rEINTPEND = 0xffffff; //clear interrupt flag?
??
?? //不需要下面的设置也行
?? //rPRIORITY= 0x00000000;
?? //rSRCPND |= BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7;
?? //rINTPND |= BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7;
?? //rINTMOD=0x00000000;
??
?? rEINTMASK = 0x000ffe8f;//enable EINT0,EINT1,EINT2,EINT4
?? rINTMSK=0xffffffe8;//1110 1000
??? //11...111 0 1 0 0 0
??
?? //下面这样写也行,只是没有直接指定数值的好,估计是开了其他中断吧
?? //闪烁很快
?? //rEINTMASK = ~(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);
?? //rINTMSK = ~(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);
}
??
void Main(void){

??? MMU_Init();
???
??? rGPBCON = 0x015550;
??? rGPBUP? = 0x7ff;??
??
??? rGPBDAT = 0xfff;
???
??? EINT_Init();
??? while (1);
??
?}

中断调试花的时间最长。主要是不知道要实现中断功能,必须先进行MMU的初始化(如果不想要MMU,我想必须要下载到flash才行)。至于为什么要MMU我也搞不懂。估计是要进行0x0地址映射到0x30000000的地址吧。因为我听说中断向量表都是从0x0开始的,不进行映射,一按键就会弹出运行错误。这里观察ClearPending函数的传入参数,可以知道那个键被按下了。但是奇怪得很。按的键不一定就能确定是对应的LED灯要亮,要查看按键对应的输出端口的数据才只知道该哪个个灯亮. 这里我也比较困惑,为什么明明调用了EINT0的中断服务程序,偏偏是LED4亮呢?

这里只设置按键对应的寄存器为中断用途就可以了。我看到在阿南的书中里还要在中断服务程序里配置为输出用途。其实我想在2440是不需要的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读