Linux—GPIO

来源:互联网 发布:程序员开发工具网 编辑:程序博客网 时间:2024/06/07 07:09
  1. 查看原理图,我的JZ2440开发板连接图是
    LED1: nLED_1 –> GPF4
    LED2: nLED_2 –> GPF5
    LED3: nLED_4 –> GPF6

S1: EINT0–> GPF0
S2: EINT2 –> GPF2
S3: EINT11 –> GPG3
2. 查看S3C2440手册
控制GPF口的寄存器如下:

GPFCOND寄存器控制I/O口的功能(输入/输出/中断)。
GPFDAT寄存器存放I/O口的状态(高电平/低电平)
GPFUP寄存器控制I/O口是否使能上拉
电路图里LED和Key都接有上拉电阻,不用内部上拉。
控制GPG口的寄存器也类似。
3. 编写代码
@************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@************************************************************

.text.global _start                    @代码开始地址定义个标记_start:    ldr     r0, =0x53000000     @ WATCHDOG寄存器地址    mov    r1, #0x0           @给r1 赋值0x0    str     r1, [r0]             @ 写入0,禁止WATCHDOG,否则CPU会不断重启    ldr  sp, =1024*4      @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K                      @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K                      @调用C函数前要先设置堆栈    bl   main            @调用C程序中的main函数,并将下一条指令地址定义为返回地址halt_loop:    b   halt_loop                @死循环

/*************************************************************
File:key_led.c
功能:实现按键控制LED灯的亮灭
*************************************************************/

 #define GPFCON      (*(volatile unsigned long *)0x56000050)    //设置GPFCON地址 #define GPFDAT      (*(volatile unsigned long *)0x56000054)       //设置GFPDAT地址 #define GPGCON      (*(volatile unsigned long *)0x56000060)   //设置GPGCON地址 #define GPGDAT      (*(volatile unsigned long *)0x56000064)   //设置GPFDAT地址 #define    GPF4_out    (1<<(4*2))       //  0000 0001 0000 0000      #define    GPF5_out    (1<<(5*2))     //  0000 0100 0000 0000 #define    GPF6_out    (1<<(6*2))       //  0001 0000 0000 0000 #define    GPF4_msk    (3<<(4*2))       //  0000 0011 0000 0000 #define    GPF5_msk    (3<<(5*2))     //  0000 1100 0000 0000 #define    GPF6_msk    (3<<(6*2))     //  0011 0000 0000 0000 #define  GPF0_in     (0<<(0*2)) #define  GPF2_in     (0<<(2*2)) #define  GPG3_in     (0<<(3*2)) #define  GPF0_msk    (3<<(0*2)) #define  GPF2_msk    (3<<(2*2)) #define  GPG3_msk    (3<<(3*2))int main()  {    unsigned long dwDat;         // LED1,LED2,LED4对应的3根引脚设为输出    GPFCON & = ~(GPF4_msk | GPF5_msk | GPF6_msk) ;     //将GPF4-6设置为输入                        //0011 1111 0000 0000 取反 1100 0000 1111 1111     GPFCON |= GPF4_out | GPF5_out | GPF6_out ;        //将GPF4-6设置为输出                        //0001 0101 0000 0000    // S2,S3对应的2根引脚设为输入    GPFCON &= ~(GPF0_msk | GPF2_msk);    GPFCON |= GPF0_in | GPF2_in;    // S4对应的引脚设为输入    GPGCON &= ~GPG3_msk;    GPGCON |= GPG3_in;    while(1)    {            //若Kn为0(表示按下),则令LEDn为0(表示点亮)            dwDat = GPFDAT;             // 读取GPF管脚电平状态            if (dwDat & (1<<0))        // S2没有按下                GPFDAT |= (1<<4);       // LED1熄灭            else                    GPFDAT &= ~(1<<4);      // LED1点亮            if (dwDat & (1<<2))         // S3没有按下                GPFDAT |= (1<<5);       // LED2熄灭            else                    GPFDAT &= ~(1<<5);      // LED2点亮            dwDat = GPGDAT;             // 读取GPG管脚电平状态            if (dwDat & (1<<3))         // S4没有按下                GPFDAT |= (1<<6);       // LED3熄灭            else                    GPFDAT &= ~(1<<6);      // LED3点亮    }    return 0;}

之后编写makefile文件,即可生成可执行文件烧录到开发板。
编译和烧录过程http://blog.csdn.net/owhfg/article/details/62226849

0 0