加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

裸奔程序之LED详解

发布时间:2020-12-15 18:32:54 所属栏目:百科 来源:网络整理
导读:?????开发环境ADS1.2 ???? 实验实现功能:TQ2440开发板LED1-LED4从右向左循环点亮。下面是main.c程序 ------------------------------------------------------------------------------------------------------------------- #include "2440addr.h"???????
?????开发环境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寄存器的地址映射的定义,可以省去我们自己定义寄存器地址。

?

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

?

?????? 下面我们开始分析程序,结合原理图以及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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读