嵌入式裸机程序之点亮LED

1.GPIO介绍

S3C2440A包含130个多功能输入输出引脚,共分为9组:GPA~GPJ。通过查看数据手册,可知每组接口有GPxCON,端口配置寄存器;GPxDAT,端口数据寄存器;GPxUP,端口上拉寄存器;但并不是每组GPIO都包含全部寄存器。除此之外,还有杂项控制寄存器、外部中断寄存器等。

2.本节目标

本节介绍最简单的GPIO应用——点亮LED灯。在程序模板的基础下,修改程序。需要准备的文档:S3C2440数据手册,TQ2440开发板电路原理图。

通过查看电路原理图,TQ2440的LED在GPB5~GPB8

通过查看数据手册,要控制一个GPIO需要配置GPxDAT、GPxCON、GPxUP三组寄存器即可。

3.程序分析

程序已保存在GPIO文件夹中,可在我的Github中浏览,这里只介绍关键的部分。

宏定义:

1
2
3
4
#define GPB5_out (1<<(5*2))
#define GPB6_out (1<<(6*2))
#define GPB7_out (1<<(7*2))
#define GPB8_out (1<<(8*2))

这部分主要为定义4个GPIO的设置准备,将这4个IO接口设置为输出模式。

1
GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out;

在主程序中,先设置GPB的5~8位设置为输出,通过逻辑与,生成需要设置给GPBCON的最终结果。

因GPBUP寄存器默认值为0x0,即使能上拉功能,在此不需修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
while(1)
{
i++;
if( i%2==1 )
GPBDAT |=(1<<5);
else
GPBDAT &=~(1<<5);
if( i%2==1 )
GPBDAT |=(1<<6);
else
GPBDAT &=~(1<<6);
if( i%2==1 )
GPBDAT |=(1<<7);
else
GPBDAT &=~(1<<7);
if( i%2==1 )
GPBDAT |=(1<<8);
else
GPBDAT &=~(1<<8);
delay(500);
}

在设置好GPBCON后,设置一个大循环,给GPBDAT设置不同的值来控制LED引脚的高低电位。程序效果为LED亮500ms暗500ms。通过一个变量的最低位值来确定亮暗状态。

程序中,i变量数值范围为0~255,但实际并未设置超出范围后重置变量值,这是因为在i到达255后再加1其值会变为0。

点亮LED通常是学习单片机的第一节课,ARM裸机程序也是如此。程序中,有部分代码是在后面学习才会涉及到的,这里只需会用即可。建议自己再翻阅芯片数据手册,更详细地了解GPIO的使用规则。


嵌入式裸机程序之点亮LED
http://atime.cc/2012/02/01/91/
作者
ATIME
发布于
2012年2月1日
许可协议