这次是按键中断,首先呢,中断初始化方面确实比较麻烦。我自己设计的裸机程序是TQ板子上四个按键,当按键按下时触发一次中断,并且LED灯对应的就会亮,这里要赞一下TQ的板子,按键4用的是子中断,当时我调程序的时候发现每次只要我按下按键4就陷入死循环出不来了,后来文彬指点了一句会不会是子中断的问题一出口我就知道问题出在哪了,其实他是知道的,故意让我纠结一下,还好没让我纠结那么久。
程序是我自己编的,有一开始自己写的有点乱然后后边整理了一下并且参考了别人编程的风格习惯所以就形成了我下面给出的程序,有在板子上运行处成功,关于一些头文件跟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。