ARM7 跑马灯 - 下家山

学习ARM7从跑马灯和蜂鸣器开始 (一)(嵌入式学习连载) - 2010-08-19 下家山

http://forum.eet-cn.com/BLOG_ARTICLE_5024.HTM?from=Blogpage_relatedarticle

ARM7的学习以荷兰Philips的ARM芯片LPC系列为代表(该部门已被NXP收购),嵌入式在中国的发展,特别是ARM7的普及离不开广州周立功的功劳,从2002年开始他主推LPC系列ARM芯片,并发展大学计划,可谓是中国大陆的一只“凌阳”。

本文以LPC2136为例进行讲解。

一、认识LPC2136开发板实物图

二、认识LPC2136开发板原理图

三、第一个程序:跑马灯的实现原理

通过LED灯实验熟悉lpc arm系列soc的控制原理。

以lpc2136为例(lpc2103,lpc2114,lpc2104,lpc2106同)

1: 搞清楚板子上的led连在CPU的哪个引脚

很多板子是通过跳线帽连起来的,需要注意!!!这里,led1,led2,led3分别连到了P0.0,P0.1,P0.2。

2:弄清IO控制原理

PINSEL0是个32位寄存器,用来配置P0.0~P0.31的功能。对一个从来没有接触单片机或ARM的人来说,这个图也许看不懂,下面做一个比较详细的分析,如果你掌握了lpc2136的IO控制原理,那么所有单片机,ARM,及其他架构的CPU的IO控制原理理同。这就是触类旁通。

位1到0用来配置P0.0:

当位1到0为00时,P0.0配置为GPIO功能(即通用输入输出引脚);

当位1到0为01时,P0.0配置为TXD功能(UART0);

当位1到0为10时,P0.0配置为PWM1;

当位1到0为11时,保留;

3:PINSEL0应该配置为多少

因为我们这里是要让LED亮起来,也就是要给LED所连在CPU上的引脚一个电平,所以我们这里应该配置这几个引脚为GPIO功能。

我们板子上的3个LED对应到P0.0,P0.1,P0.2。

PINSEL0 = 0x00000000;(0x表示用16进制表示,因为我们这里只做LED实验,其他引脚不考虑,采用默认配置,所有引脚在系统上电复位时的默认值为0)

4:引脚方向如何定

功能配置好了,那么这四个引脚是设置成输入还是输出呢?

此设置是通过IO0DIR寄存器来实现的。

其实很多初学者不清楚“输入”和“输出”的概念。这里做出通俗解释:

这里所说的“输入”和“输出”是针对CPU来说的,即输入就是外部(外设)有个信号进入到CPU,输出就是CPU输出一个信号到外部(外设)。举一个例子大家就明白了:

我们日常用的键盘设备,键盘线上肯定是有几根数据线的,这个不用质疑。那么当我们按下某一个键时,肯定是有一个信号给到了电脑CPU,那么这个信号对电脑CPU来说就是输入信号,或者说键盘对电脑来说就是输入设备了。

当我们开机看到电脑显示器显示的信息(不管是文本信息还是图像信息),显示器与电脑主板之间肯定是有数据线连起来的,那么这些信息就是CPU通过电脑显卡把数据输出到显示器的,显示器对电脑来说就是输出设备。

通过这样解释,大家应该能够知道我们这里的四个引脚应该配置成输出。

IO0DIR=0x00000007;(其他引脚采用默认值:输入)

5:设置引脚值

现在功能配置好了,方向也设置好了,还剩下最后一个问题:

是输出高电平,还是输出低电平呢?

当要输出高电平:由IO0SET寄存器来完成。

当要输出低电平:由IO0CLR寄存器来完成。

6:什么情况下输出高,什么情况下输出低

回到“图1”,稍微懂一点电路知识的人,应该知道是低电平LED亮,高电平LED灭。所以,当你要让LED亮的时候就输出低电平,否则,输出高电平。

7.写代码实现跑马灯

下面是led实验工程代码main.c中的代码内容

#include "config.h" #include "delay.h"

上面两条语句用来包含config.h和delay.h两个头文件,因为下面要用到的uint32,IO0DIR等寄存器,还有delay()函数等内容都定义在这些头文件里面。

#define LED_1 1<<0 #define LED_2 1<<1 #define LED_3 1<<2

上面四条语句用来定义四个led等所在引脚的位置,便于程序使用。

#define LED1_TO_3 (LED_1|LED_2|LED_3)

上面这条语句把四个LED灯所在引脚或运算后定义到一个常量LED1_TO_3中,也是为了方便程序编写。

/****************************************************************************
* 名称:initSystem()
* 功能:初始化IO
****************************************************************************/

void initSystem(void)
{
PINSEL1 = PINSEL1 & (~(0xff<<12)); //led1~3设置为GPIO
IO0DIR=IO0DIR | LED1_TO_3; //led1~3设置为输出功能
IO0SET=IO0SET | LED1_TO_3; //led1~3同时输出高
}
上面的initSystem函数是为了初始化cpu的各个IO脚的状态,及设置四个LED灯所在IO脚的状态,并初始化它们。

/****************************************************************************
* 名称:Led_On(uint32 num)
* 功能:点亮LED
****************************************************************************/
void Led_On(uint32 num)
{
IO0SET=IO0SET | LED1_TO_3; //所有的led灭
IO0CLR=IO0CLR | num; //点亮num
}
上面的这个函数是为了点亮所给led号,其中参数num就是传进来的参数,代表哪个LED。

/****************************************************************************
* 名称:main()
* 功能:初始化led,并实现3个led灯轮流闪烁的效果。
****************************************************************************/
int main(void)
{

initSystem();
while(1)
{
Led_On(LED_1);
delay(10);
Led_On(LED_2);
delay(10);
Led_On(LED_3);
delay(10);
}
return 0;
}

Ads的安装使用方法见附录一。

四、独立写第一个程序:蜂鸣器

如果,跑马灯完全搞懂了,蜂鸣器程序是可以独立完成的。

.END

No comments:

Post a Comment