裸奔程序之LED详解

     开发环境ADS1.2

     实验实现功能:TQ2440开发板LED1-LED4从右向左循环点亮。下面是main.c程序

-------------------------------------------------------------------------------------------------------------------

#include "2440addr.h"        

#define  LED1_ON (rGPBDAT &=~(1<<5))
#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)
{
    int i,j;
    for(i=0;i<1000000;i++)
        for(j=0;j<1000;j++);
}

int main()
{
    rGPBCON &=~((3<<10)|(3<<12)|(3<<14)|(3<<16));  //对GPBCON[10:17]清零
    rGPBCON |=((1<<10)|(1<<12)|(1<<14)|(1<<16));     //设置GPB5~8为输出
    rGPBUP &=~((1<<5)|(1<<6)|(1<<7)|(1<<8));           //设置GPB5~8的上拉功能
    rGPBDAT |=(1<<5)|(1<<6)|(1<<7)|(1<<8);              //关闭LED

   while(1)
   {
          LED1_ON;Delay();LED1_OFF;
          LED2_ON;Delay();LED2_OFF;
          LED3_ON;Delay();LED3_OFF;
          LED4_ON;Delay();LED4_OFF;
   }
    return 0;
}

-------------------------------------------------------------------------------------------------------------------

#include "2440addr.h" ,里面主要是TQ公司写的一些关于S3C2440寄存器的地址映射的定义,可以省去我们自己定义寄存器地址。

裸奔程序之LED详解_第1张图片

 

     上图是天嵌公司底板原理图,关于4个LED的设计,很简单,只要是nLED x(1-4)连接的IO设置为输出,上拉,且为低电平的时候,对应的LED就点亮了。这里,对应TQ公司核心板所接的GPIO口为,GPB5~GPB8。所以我们要设置的寄存器有三种,分别是GPBCON、GPBUP、GPBDAT;它们的功能分别是,设置输入或输出,设置是否上拉,设置输出是1还是0,当然它们还有复用功能的作用,这里未涉及,故不详述。

裸奔程序之LED详解_第2张图片

 

       下面我们开始分析程序,结合原理图以及S3C2440技术手册以及我们的程序,首先从main函数开始:
       rGPBCON &=~((3<<10)|(3<<12)|(3<<14)|(3<<16)); //对GPBCON[10:17]清零
       执行完这句之后,GPBCON这个寄存器的[10:17]位都为0;
       rGPBCON |=((1<<10)|(1<<12)|(1<<14)|(1<<16)); //设置GPB5~8为输出
       执行完这句之后,GPBCON的[10:17]位为 01010101,即将GPB5~GPB8设置为输出;
       rGPBUP &=~((1<<5)|(1<<6)|(1<<7)|(1<<8)); //设置GPB5~8的上拉功能
       执行完这句之后,GPB5~GPB8内部上拉功能有效;
       rGPBDAT |=(1<<5)|(1<<6)|(1<<7)|(1<<8); //关闭LED
       执行完这句之后,GPB5-GPB8写入1,即初始化LED,全部关闭LED;
       进入死循环后;执行LED1_ON;查看LED1_ON,我们将其宏定义为:
       #define LED1_ON (rGPBDAT &=~(1<<5))   
       即GPB5写入0;即点亮LED1;同理LED1_OFF,GPB5写入1;即关闭LED1;其他亦如此。  
       延时程序很简单,不多说。最后,因为main函数为返回值为int型函数,故返回0.
       LED程序就分析完毕。
       编译成功后,通过串口工具SecureCRT,首先把TQ2440开发板打到NOR FALSH  启动电源后再SecureCRT选择菜单里选择a ,再通过USB工具DNW烧入刚才编译成功.bin文件,将开关再次打开NAND FLASH,重启开发板,既可以看到我们一开始所描述的现象啦。O(∩_∩)O
 

 

你可能感兴趣的:(裸奔程序之LED详解)