当前位置:
文档之家› ARM9无操作系统实验(一)LED部分
ARM9无操作系统实验(一)LED部分
Led0.c 主程序 程序控制流程:
开始
设置 GPB5 为输出状态
置位 GPB5,LED0 熄灭
设置 GPB 端口禁止上拉
清零 GPB5,点亮 LED0
结束
将程序加载到开发板上,就可以看实验的结果了,其它 LED 灯的控制和 LED0 一样,只是 寄存器的设置值不同罢了。
实验二、流水灯 终于能点亮一个 LED 灯了,那么它有什么用呢?它的主要用途在于一些状态的显示上,
GPB5 LED0 GPB6 LED1 GPB8 LED2 GPB10 LED3 ********************************************/
/*---------地址声明----------*/
#include "2440addr.h"
注释:在本程序的开头,引入一个 2440addr.h 的头文件,该文件中定义了我们要常用的 寄存器的地址,以后的程序中,只需引入即可。引入的方法是将这个头文件直接放在 ADS 安装文件的 include 中就行了。
S3C2440 无操作系统实验——LED 部分
S3C2440 无操作系统实验(一)——LED 部分
小小达摩 2011-6-23
硬件:飞凌 FL2440 开发板 软件:ADS1.2
拿到 ARM 开发板,应该从哪儿开始学习呢?困扰了很多初学者,当然也正在困扰我, 因为我也是初学者。所以我想与其困惑,还不如先做些自己能做的,将会做的做熟悉了,也 许就找到学习的方向了吧。那么从哪儿入手呢,想来想去,那就从点亮一个 LED 灯作为学 习的起点。虽然很多人,不推荐用学习单片机的模式来学习 ARM,但是我感觉基础还是重 要的,再说高级的学习暂时也不会呀,呵呵。虽然这样学习会慢点,但是总比开发板落厚厚 一层灰要划得来吧(开发板买了快 2 年了,拿来玩的时间不超过 2 个月,也许很多朋友都有 这样的经历吧)。所以,把它拿出来,开始学习吧。
注意:前面必须要有空格,不能顶格写;前面的数字为了方便分析程序才加的,编写程序的 时候不需要。init.s 程序只是在跳转的目标函数上有区别,所以以后的程序只需要改变第四 句和第五句中的函数名就行了,所以,以后省略对此函数的介绍。 程序分析: 第一句: AREA |DATA|,CODE,READONLY 这句是用 AREA 伪指令定义一个段名为|DATA|的代码段,属性为只读。再给段命名的时候 要注意,如果是以非字母开头的话,那么要用“|”将段名括起来。所以本句中的段名取掉 “|”也可以正常执行。
不管是单片机还是 ARM,对其进行控制其实就是对相应的寄存器进行控制,如果能够 对常用寄存器进行熟练的操作,那么基本也就掌握了这种芯片的使用方法。所以就先从寄存 器介绍开始。
1、相应寄存器介绍:
LED 灯是接在某一个 I/O 上的,点亮或者熄灭 LED 灯其实就是对 I/O 口寄存器的操作。 ARM 的 I/O 口寄存器主要包括端口配置寄存器 GPXCON、端口数据寄存器 GPXDAT、端口 上拉电阻使能寄存器 GPXUP、MISCELLANEOUS 控制寄存器和外部中断寄存器五种(其 中 X 为芯片的 I/O 口字母)。在这个试验中我们只使用前三个寄存器,下面就对这三个寄存 器进行简单的介绍。
/*---------地址声明----------*/ #include "2440addr.h"
/*---------变量声明---------*/ #define uint unsigned int
/*---------函数声明----------*/ void Delay(uint); void BoardInit(void); uint tab[]={ 0x29E,0xffe,0xfde,0xfbe, 0xefe,0xbfe,0xefe,0xfbe, 0xfde,0xebe,0xbde,0xffe}; 注释:用数组方式来实现花样灯。
0 无操作系统实验——LED 部分
电路板采用 10K 的电阻,就是为了减弱 LED 灯的亮度,要不就会很刺眼。所以在设计电路 的时候,可以根据实际需要做些调整。
LED 的工作原理很简单,要让 LED 发光,首先要将 I/O 口设置为输出模式,然后控制 I/O 口输出不同的电平。当输出为低电平时,LED 灯发光;反之当输出为高电平时,LED 灯 熄灭。
第 6 页(共 8 页)
S3C2440 无操作系统实验——LED 部分
要求的方式流动,那应该怎么实现呢?那么就是下面要实现的花样灯实验的内容了。 实验三 花样灯 花样灯的目的就是让 LED 灯可以随意流动。 /****************************************** 程序的目的:花样灯 I/O 口与 LED 的对应关系: GPB5 LED0 GPB6 LED1 GPB8 LED2 GPB10 LED3 ********************************************/
3、例程
下面就通过几个例子来练习下这几种寄存器的用法。如果不会使用 ADS,可以参考下我写 的《ADS 使用方法》一文,可以方便快速上手。 实验一:点亮一个 LED 灯。 首先要编写 init.s 汇编源文件,这段程序的目的是进行一些初始化操作,并跳转到主函数中 继续执行后面的程序。 Init.s 程序: 1 AREA |DATA|,CODE,READONLY 2 ENTRY 3 ldr r13,=0x1000 4 IMPORT led0 5 b led0 6 END
//程序进入流水灯死循环
/*---------延时函数---------*/ void delay(uint x) {
uint i,j,k; for(i=0;i<x;i++)
for(j=0;j<=0xff;j++) for(k=0;k<=0xff;k++);
} 到现在,流水灯的实验就做完了。但是这种流水灯太过于单调,我想让 LED 灯按照我
int LSD_Main(void)
{ rGPBCON=0x1dd7fc;
//将 GPB5、GPB6、GPB8、GPB10 设置为输出
rGPBUP=0xfff;
//禁止 GPB 端口上拉
rGPBDAT=((1<<5)|(1<<6)|(1<<8)|(1<<10)); //让 LED 灯全灭
while(1) {
当快递员找到张三后,就通知张三有个包裹需要签收。同样的道理,ARM 芯片找到相 应寄存器后,也先要设置端口配置寄存器 GPBCON,也就是告诉寄存器做好接收数据或者 输出数据或者响应外部中断的准备,下表为它的功能描述:
第 1 页(共 8 页)
S3C2440 无操作系统实验——LED 部分
当张三签收后,就可以得到包裹了。ARM 设置完 I/O 口状态后,就准备读/写数据了。 这个功能可以通过设置数据寄存器 GPBDAT 来实现。下表即为它的功能描述:
第 3 页(共 8 页)
S3C2440 无操作系统实验——LED 部分
第二句: ENTRY 也是伪指令,用来指定汇编程序的入口点。 第三句: ldr r13,=0x1000 LDR 指令用于从寄存器中将一个 32 位的字数据传送到目的寄存器中。因为 2440 处理器的 内部有 4K 的 RAM,0x1000 是放到了 4K 的最高端,也就是堆栈所对应的地址。 第四句: IMPORT led0 IMPORT 伪指令用于通知标号 led0 在其它源文件中定义,但要在当前源文件中引用。 第五句: b led0 B 为最简单的跳转指令,当遇到 B 指令,ARM 处理器就立即跳转到给定的目标地址,并从 那里继续执行。 第六句: END END 伪指令用于通知编译器已经到了源程序的结尾。
到此,需要的寄存器就配置完成了,那么接下来介绍下 LED 在开发板上的电路原理图。
2、电路原理图介绍:
电路如下图所示,这个电路采用灌电流方式驱动 LED,只需加一限流电阻即可。根据 基本电路知识可以计算出限流电阻 R 的值:
U (电源)-U(LED压降)
R=
I / O推荐电流
由 LED 的手册参数可知,当 LED 内流过 10mA 的电流时,两端压降约为 1.7V,即 U(LED 压降)=1.7V;S3C2440 普通 I/O 口推荐电流为 4mA。据此就可以计算出 R 的值为 400Ω,一般会留有余量,比如取到 470Ω。因为 LED 灯的亮度由流过的电流决定,FL2440
/*---------变量声明---------*/
#define uint unsigned int /*---------函数声明----------*/ void delay(uint);
//延时函数
#define LED0_ON() (rGPBDAT&=~(1<<5)) //LED0 点亮 #define LED1_ON() (rGPBDAT&=~(1<<6)) //LED1 点亮
LED0_ON(); delay(30); LED0_OFF(); LED1_ON(); delay(30); LED1_OFF(); LED2_ON(); delay(30); LED2_OFF(); LED3_ON(); delay(30); LED3_OFF(); delay(30); } return 0; }
//LED0 熄灭
#define LED1_OFF() (rGPBDAT|=(1<<6))
//LED1 熄灭
#define LED2_OFF() (rGPBDAT|=(1<<8))
//LED2 熄灭
#define LED3_OFF() (rGPBDAT|=(1<<10)) //LED3 熄灭
注释:这种对 LED 的控制方式非常方便。 /*-----------主函数----------*/