首页 > 代码库 > 第三十四天:按键驱动与蜂鸣器驱动以及MMU

第三十四天:按键驱动与蜂鸣器驱动以及MMU

  编写按键驱动的过程和编写LED灯的驱动类似。区别在于按键是在底板上的。要从底板的电路图开始看。

   使用key为关键字查找电路图:

  

 可以得知的信息:按键松开时候XEINT26为高电平。按下时候为底电平。所以要判断按键是否被按下,就要检测XEINT26的状态。

 使用XEINT26为关键字,在核心板上查看其定义。找到下图:

   

  XEINT26在核心板上链接到GPX3_2上。然后就是去datasheet中查找GPX3_2的说明了。

  

 

   按键为检测,GPX3CON置0,GPX3DAT置1,表示按键被按下。代码如下:

 1 int (*show)(char *,...) = 0xc3e114d8; 2 int (*udelay)(int) = 0xc3e25f90; 3 void key(void) 4 { 5     unsigned long *GPX3CON = 0x11000c60; 6     unsigned long *GPX3DAT = 0x11000c64; 7  8     *GPX3CON = 0x0;     9     while(1){10         if((*GPX3DAT & 0x04) == 0x0){11             show("good moring\n");12             udelay(1000000);13         }14         if((*GPX3DAT & 0x08) == 0x0){15             show("hello world\n");16             udelay(1000000);17         }18         if((*GPX3DAT & 0x10) == 0x0){19             show("hello bunfly\n");20             udelay(1000000);21         }22         if((*GPX3DAT & 0x20) == 0x0){23             break;24         }25     26     }27 }

 

  代码的功能是按KEY1,KEY2,KEY3输出字符串,KEY4退出。

 蜂鸣器的驱动代码编写步骤类似,我这里就不描述具体过程了。直接贴代码:

 1 void (*udelay)(int) = 0xc3e25f90; 2 void  abc(void) 3 { 4     volatile unsigned long  *GPD0CON  = 0x114000a0; 5     volatile unsigned long  *GPD0DAT  = 0x114000a4; 6      7     *GPD0CON =  0x0001; 8 #if 1 9     while(1){10         *GPD0DAT = 0x1;// on11         udelay(250000);12         *GPD0DAT = 0x0;13         udelay(250000);//off14     }15 #endif16     17 }

 没有对其它控制的位进行保护。差评!

     MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。(摘自百科)

    内存映射代码如下:至今为止看到的最复杂的代码:

 1 int (*printf)(char *, ...) = 0xc3e114d8; 2  3 void init_ttb(unsigned long *ttb); 4  5 int main() 6 { 7     //0x32300000 -> 0x52300000; 8     unsigned long *pp = 0x52300000; 9     *pp = 0x22222222;10     printf("*pp is %x\n", *pp);11     //step 1: set mmu table12     unsigned long ttb = 0x70000000;13     init_ttb(ttb);14     //step 2: enable mmu table15     unsigned long mmu = 0;16     mmu = 1 | (1 << 3) | (1 << 8);17     __asm__ __volatile__(18         "mov r0, #3\n"19         "mcr p15, 0, r0, c3, c0, 0\n" //manager20         "mcr p15, 0, %0, c2, c0, 0\n" //ttb address21         "mcr p15, 0, %1, c1, c0, 0\n" //enable mmu22         :23         : "r" (ttb), "r" (mmu)24     );25 26     unsigned long *pv = 0x32300000;27     printf("*pv is %x\n", *pv);28 }29 30 void init_ttb(unsigned long *ttb)31 {32     unsigned long va = 0;33     unsigned long pa = 0;34     for(va=0x00000000; va<0x14000000; va+=0x100000){35         pa = va;36         ttb[va >> 20] = pa | 2;37     }38 39     for(va=0x40000000; va<0x80000000; va+=0x100000){40         pa = va;41         ttb[va >> 20] = pa | 2;42     }43 44     for(va=0x30000000; va<0x40000000; va+=0x100000){45         pa = va + 0x20000000;46         ttb[va >> 20] = pa | 2;47     }48 }

 

  

 

第三十四天:按键驱动与蜂鸣器驱动以及MMU