Mini2440学习笔记(二)——GPIO

来源:互联网 发布:陈奕迅48首选淘宝 编辑:程序博客网 时间:2024/05/16 17:24


硬件连接:

Mini2440有四个LED,使用的管脚是GPB5到GPB8,当管脚输出低电平时,led亮;六个按键使用的管脚是GPG0、GPG3、GPG5、GPG6、GPG7、GPG11,按下按键时,管脚是低电平状态。

 

GPIO寄存器:

GPXCON:每两位配置一个管脚,00为输入,01为输出;

GPXDAT:端口的数据寄存器,每一位表示对应管脚的状态,0为低电平,1为高电平;

GPXUP:设置管脚的上拉电阻,每一位对应一个管脚,0为使能,1为禁止。

 

[c-sharp] view plaincopy
  1. #ifndef S3c2440A_H  
  2. #define S3C2440A_H  
  3.   
  4. /* 
  5.  * GPIO Register 
  6.  */  
  7. //GPB  
  8. #define GPBCON (*(volatile unsigned long *)0x56000010)  
  9. #define GPBDAT (*(volatile unsigned long *)0x56000014)  
  10. #define GPBUP  (*(volatile unsigned long *)0x56000018)  
  11. //GPG  
  12. #define GPGCON (*(volatile unsigned long *)0x56000060)  
  13. #define GPGDAT (*(volatile unsigned long *)0x56000064)  
  14. #define GPGUP  (*(volatile unsigned long *)0x56000068)  
  15.  
  16. #endif  

 

程序:

使用按键控制LED的亮灭,Key1~Key6非别表示数字1~6,每个LED代表一个二进制位,例如,当按下Key3时,LED1和LED2亮,表示二进制的0011。该程序可下载到内部4K-ROM中运行。

[c-sharp] view plaincopy
  1. @******************************************************************************  
  2. @ File:init.S  
  3. @ 功能:通过它转入C程序  
  4. @******************************************************************************  
  5.   
  6. .text  
  7. .global _start  
  8. _start:  
  9.             ldr     r0, =0x53000000     @ WATCHDOG寄存器地址  
  10.             mov     r1, #0x0  
  11.             str   r1, [r0]              @ 写入0,禁止WATCHDOG,否则CPU会不断重启  
  12.   
  13.             ldr     sp, =1024*4         @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K  
  14.                                         @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K  
  15.             bl      main                @ 调用C程序中的main函数  
  16. halt_loop:  
  17.             b       halt_loop  

 

[cpp] view plaincopy
  1. /* 
  2.  * gpio.c 
  3.  * 用按键控制LED 
  4.  * 六个按键Key1~Key6,四个LED 
  5.  */  
  6. #include "s3c2440a.h"  
  7.   
  8. int main(void)  
  9. {  
  10.     unsigned long key=0;  
  11.     unsigned long led=0;  
  12.   
  13.     //led  
  14.     GPBCON &= (~(0xff<<10));  
  15.     GPBCON |= (0x55<<10);  //将GPB5~GPB8的管脚设为输出  
  16.     GPBUP &= (~(0xf<<5));  
  17.     GPBUP |= (0xf<<5);   //禁止GPB5~GPB8的上拉电阻  
  18.   
  19.     //key  
  20.     GPGCON &= ~((3<<0)|(3<<6)|(3<<10)|(3<<12)|(3<<14)|(3<<22));  //将GPG0、3、5、6、7、11设为输入  
  21.     GPGUP |= ((1<<0)|(1<<3)|(1<<5)|(1<<6)|(1<<7)|(1<<11));   //禁止上拉  
  22.   
  23.     while(1)  
  24.     {  
  25.         key = GPGDAT;   //读取按键的状态  
  26.         if(!(key & (1<<0)))    //Key1  
  27.         {  
  28.             GPBDAT &= (~(0xf<<5));  
  29.             GPBDAT |= ((0xf-1)<<5);  
  30.         }  
  31.         if(!(key & (1<<3)))   //Key2  
  32.         {  
  33.             GPBDAT &= (~(0xf<<5));  
  34.             GPBDAT |= ((0xf-2)<<5);  
  35.         }  
  36.         if(!(key & (1<<5)))  //Key3  
  37.         {  
  38.             GPBDAT &= (~(0xf<<5));  
  39.             GPBDAT |= ((0xf-3)<<5);  
  40.         }  
  41.         if(!(key & (1<<6)))    //Key4  
  42.         {  
  43.             GPBDAT &= (~(0xf<<5));  
  44.             GPBDAT |= ((0xf-4)<<5);  
  45.         }  
  46.         if(!(key & (1<<7)))   //Key5  
  47.         {  
  48.             GPBDAT &= (~(0xf<<5));  
  49.             GPBDAT |= ((0xf-5)<<5);  
  50.         }  
  51.         if(!(key & (1<<11)))    //Key6  
  52.         {  
  53.             GPBDAT &= (~(0xf<<5));  
  54.             GPBDAT |= ((0xf-6)<<5);  
  55.         }  
  56.     }  
  57.   
  58.     return 0;  
  59. }  
  

 

Makefile: 

[c-sharp] view plaincopy
  1. all:init.S gpio.c  
  2.     arm-elf-gcc -g -c -o init.o init.S  
  3.     arm-elf-gcc -g -c -o gpio.o gpio.c  
  4.     arm-elf-ld -Tgpio.lds -g init.o gpio.o -o gpio_elf  
  5.     arm-elf-objcopy -O binary -S gpio_elf gpio.bin  
  6.     arm-elf-objdump -D -m arm gpio_elf > gpio.dis  
  7. clean:  
  8.     rm -f gpio_elf gpio.bin gpio.dis *.o  



0 0
原创粉丝点击