ARM9无操作系统实验(一)LED部分

合集下载

ARM9ARM11裸机开发笔记1之MDK开发环境和点亮LED

ARM9ARM11裸机开发笔记1之MDK开发环境和点亮LED

ARM9ARM11裸机开发笔记1之MDK开发环境和点亮LED很多从单片机或者从CM3转到ARM9/ARM11的时候,一开始就讲得是Uboot,Linux,然后就是什么QT等高级玩意,不像单片机有什么裸机开发的概念,的确,这些高级ARM本来就是用来跑系统,谁用来它做裸机开发呢。

但是如果我们要更好了解ARM的工作原理,,尤其是想进阶嵌入式中最难的一层,驱动层的话,甚至想把其它的非Linux系统移植到ARM9/ARM11上。

我们就无法避免要跟ARM跟底层的寄存器打交道,要了解ARM的内核,时钟,GPIO,SPI,等等外设的工作原理和配置。

通过裸机的一些实验,我们就可以像用STM32这样来写ARM9/ARM11代码,让我们更深入了解ARM的原理。

我之前因为在做把MF这个系统移植到S3C2416上,基本上都靠MDK来完成调试,对ARM9/ARM11的认识有了进一步的认识。

这里我就以S3C2416为例来讲怎么建立开发环境和点亮LED灯。

1、裸机开发必要条件:玩过ARM9之上同学都知道,ARM9之类的ARM是没有内部Flash的话,我们不能直接用开发软件来对烧写代码来调试硬件,这点跟我们开发单片机是最大的区别,也是导致很多人不知道怎么来进行ARM9的裸机开发。

有同学就说,没有Flash,还有RAM,没错S3C2416内部是有RAM,但是很小,S3C2416的内部RAM在用NAND启动时候,才8K而已,S3C2440的才4K,我们要在这8K的RAM既放存数据还要放代码,那我们写不了几行代码。

所以最好的方法就是用Uboot,先把芯片的时钟,SDRAM都初始化好,那我们就可以用SDRAM来调试代码,一般都有64M的SDRAM,对我们来完全足够用了。

这里我只在开发上烧写了Uboot,内核跟文件系统都没有烧,因为如果Uboot引导了Linux内核后,Linux内核接到CPU的控制权,Debug会被关掉,我们就无法再使用Jlink对开发进行调试。

ARM9实验报告

ARM9实验报告

实时操作系统实验报告专业:电子信息工程学号:20110310215姓名: 杨雪指导老师:申屠浩实验一ARM9入门实验1、实验目的:1、熟悉软件的使用,工程的创建、编译、下载及调试程序的方法。

2、理解实验源代码每一句所代表的含义。

2、实验要求与思路:该实验要求熟练地掌握ARM9软件的使用方法以及实验程序每一步所代表的含义,了解集成开发环境的主框架窗口由标题栏、菜单条、工具条、工程管理窗口、源文件窗口、输出窗口和状态条等组成。

标题栏显示当前打开的文件名。

工程管理窗口用于显示当前打开工程的有关信息,包括工程的文件组成等内容。

说明:源文件窗口用于文本编辑器进行C、汇编等源文件的编辑以及调试时的源代码执行跟踪。

输出窗口输出编译信息、调试信息、命令行输入输出和输出一些查询结果信息等。

主框架窗口的最底端为状态栏,用于显示关于菜单条、工具条等的简单说明信息以及文本编辑器中当前光标所在的行列号等。

用户可以通过鼠标拖动,将菜单条、工具条、工程管理窗口、源文件窗口和输出窗口等随意更换顺序和位置,也可以隐藏其中的某些窗口。

在调试过程中,可以根据需要打开和关闭寄存器窗口、函数栈窗口、变量窗口、存储器窗口、数据观察窗口以及反汇编窗。

3、实验程序:程序1源代码如下:/*------------------------------------------------------------------------------------------*//* constant define*//*------------------------------------------------------------------------------------------*/.equ x, 45 /* x=45 */.equ y, 64 /* y=64 */.equ stack_top, 0x1000 /* define the top address for stacks */.global _start/*------------------------------------------------------------------------------------------*//* code*//*------------------------------------------------------------------------------------------*/.text_start: /* code start */mov sp, #stack_topmov r0, #x /* put x value into R0 */str r0, [sp] /* save the value of R0 into stacks */mov r0, #y /* put y value into R0 */ldr r1, [sp] /* read the data from stack,and put it into R1 */ADD r0, r0, r1STR r0, [sp]stop:b stop /* end the code ,cycling */.end程序2源代码如下:.equ x, 45 /* x=45 */.equ y, 64 /* y=64 */.equ z, 87 /* z=87 */.equ stack_top, 0x1000 /* define the top address for stacks */.global _start/*------------------------------------------------------------------------------------------*//* code*//*------------------------------------------------------------------------------------------*/.text_start: /* code start */mov r0, #x /* put x value into R0 */mov r0, r0, lsl #8 /* R0 = R0 << 8 */mov r1, #y /* put y value into R1 */add r2, r0, r1, lsr #1 /* R2 = (R1>>1) + R0 */MOV sp, #0x1000STR r2, [sp]mov r0, #z /* put z value into R0 */and r0, r0, #0xFF /* get low 8 bit from R0 */mov r1, #y /* put y value into R1 */add r2, r0, r1, lsr #1 /* R2 = (R1>>1) + R0 */LDR r0, [sp] /* put y value into R1 */MOV r1, #0x01ORR r0, r0, r1mov r1, R2 /* put y value into R1 */add r2, r0, r1, lsr #1 /* R2 = (R1>>1) + R0 */stop:b stop /* end the code ,cycling*/.end4、实验分析程序1部分代码解释如下:mov sp, #stack_topmov r0, #x /* 把x的值移到r0*/str r0, [sp] /* 把r0的值放入堆栈*/mov r0, #y /*把y的值移到r0 */ldr r1, [sp] /*从堆栈中读取数据并放入r1 */ADD r0, r0, r1 /*把r0和r1的值相加并赋值给r0*/STR r0, [sp]程序2部分代码解释如下:.equ x, 45 /* x=45 */.equ y, 64 /* y=64 */.equ z, 87 /* z=87 */.equ stack_top, 0x1000 /* 给堆栈定义首地址*/.global _start/*------------------------------------------------------------------------------------------*//* code*//*------------------------------------------------------------------------------------------*/.text_start: /* code start */mov r0, #x /*把x=2Dh赋给r0 */mov r0, r0, lsl #8 /* r0左移八位为2d00h */mov r1, #y /*把y=40h赋给r1 */add r2, r0, r1, lsr #1 /*r2= r1右移一位2dh+r0 =2d20h*/MOV sp, #0x1000 /*sp的地址为08h*/STR r2, [sp] /*读sp的内容赋给r2/mov r0, #z /*把z=57h赋给r0 */and r0, r0, #0xFF /* 把r0和FF相与得到r0的低八位*/mov r1, #y /*把y=40h赋给r1 */add r2, r0, r1, lsr #1 /* r2= r1右移一位20h+r0 =77h */LDR r0, [sp] /*将sp 地址处的数据读出,保存到r0 中*/ MOV r1, #0x01 /*把01h赋给r1*/ORR r0, r0, r1 /*r0与r1相或,得到2d21h存入r0*/mov r1, R2 /* 把r2=77h赋给r1 */add r2, r0, r1, lsr #1 /* R2 = r1右移一位+ R0=2d5ch */5、实验截图:程序1截图实验2截图6、实验感想通过该实验,我熟悉了软件的使用,熟练地掌握了工程的创建、编译、下载及调试程序的方法,理解了实验源代码每一句所代表的含义,对于ARM9有了更深的认识并对老师上课所讲的内容有了更深的理解。

arm9实验报告

arm9实验报告
for(i=0;i<1000000;i++); //延时
rGPGCON = rGPGCON & 0xfff0ffff | 0x00050000;
rGPGDAT = rGPGDAT & 0xeff | 0x200;
for(i=0;i<10000000;i++); //延时
2、掌握三星S3C2410UART相关寄存器的配置;
3、能够用C语言编写三星S3C2410相应的串口程序;
4、学习A/D转换的接口电路;
5、掌握三星S3C2410的A/D转换器相关的寄存器配置方法和编程方法。
二、实验仪器设备
1、EL-ARM-830教学实验箱,奔腾E系列PC机,仿真调试电缆;
data = 0x55; //给全局变量赋值
while(1)
{
Uart_Printf("%x ", data); //串口0输出
Delay(1000);
2、PC操作系统WINXP,ADS1.2集成开发环境,仿真调试电缆驱动程序。
三、实验原理
ARM的UART实验
三星S3C2410的UART单元提供3个独立的异步串行I/O口,都可以运行于中断模式或DMA模式,它最高可支持115200bps的传输速率。三星S3C2410中每个UART通道包含两个用于接收和发送数据的16位FIFO队列。
3、了解ARM9的中断原理,能够对三星S3C2410的中断资源及其相关中断寄存器进行合理配置;掌握三星S3C2410中断的编箱,奔腾E系列PC机,仿真调试电缆;
2、PC操作系统WINXP,ADS1.2集成开发环境,仿真调试电缆驱动程序。

ARM9实验

ARM9实验

实验一:ADS 1.2集成开发环境练习1.1 实验目的:了解ADS1.2集成开发环境的使用方法1.2 实验设备:①硬件:PC机②软件:Windows xp系统,ADS1.2集成开发环境1.3 实验内容:①建立一个新的工程;②建立一个汇编文件,并添加到工程中;③设置文本编辑器支持中文;④设置编译链接控制选项;⑤编译链接工程;⑥调试工程1.4 实验步骤①新建一个目录。

启动ADS1.2,选择File-New,使用ARM Executable Image 工程模板建立一个工程;②选择File-New中的File新建一个新的汇编文件*.s,并添加到刚才的项目中,并选中三种生成文件。

③编写*.s中的内容:把R0和R1中的内容相加并保存到R0中④设置Edit-Perference-Font & Tabs:Font:Fixedsys;选中Tab Inserts Spaces⑤设置Edit-DebugRel Settings-ARM Linker:Output-Simple:ROBase-0x40000000,RW Base-0x40003000Options-Image entry point:0x40000000⑥P roject-Make:编译链接工程⑦P roject-Debug:调试追踪程序1.5 思考强行重新编译工程的所有文件:Project-Remove Object code,删除工程中的*.obj文件*.s 文件程序参考:AREA Example1, CODE,READONL Y ;声明代码段ExampleENTRY ;声明程序入口CODE32 ;声明32位ARM指令STARTMOV R0, #15 ;设置参数MOV R1,#8ADDS R0,R0,R1 ;R0=R0+R1B STARTEND实验二:汇编指令实验2.1 实验目的:①了解ADS1.2集成开发环境的使用方法;②掌握ARM 汇编指令的用法,并能编写简单的汇编程序;③掌握指令的条件执行和使用LDR/STR指令完成存储器的访问2.2 实验设备:①硬件:PC机②软件:Windows xp系统,ADS1.2集成开发环境2.3 实验内容:①使用LDR指令读取0x40003100上的数据,将数据加1,若结果小于10则使用STR指令把结果写回原地址,若结果大于等于10,则把0写原地址。

arm9开发板实验报告1

arm9开发板实验报告1

轻工业学院实训报告实训名称:项目一:编写从A/D转换器的通道x获取模拟数据,并将转换后的数字量以波形的形式在LCD上显示的程序项目二:触摸屏驱动程序设计姓名:克歌院(系):计算机与通信工程学院专业班级:嵌入式09--01学号: 1指导教师:雪琴成绩:时间:2011年 8月 29日至 2011年 9 月 7 日一、需求说明1.巩固和强化学生的嵌入式系统的基本概念和开发流程,掌握基本知识和基本技能。

2.掌握硬件开发平台、开发资源和软件开发环境,尤其是裸机嵌入式系统开发方法。

掌握汇编和C语言混合编程技巧,熟悉系统启动引导过程,能够成功移植嵌入式系统引导程序。

培养和训练学生综合利用所学基本知识和基本技能进行小型裸机程序开发的技能。

3.明确思路和任务,查询相关书籍、资料,综合了解ARM的AD转换器和LCD 驱动器,重点分析时S3C2440的LCD 驱动器的工作原理和初始化方法。

分析与AD转换相关的寄存器,编写AD转换器的初始化函数,编写获取AD转换结果的函数。

分析与LCD相关的寄存器,编写LCD 驱动器的初始化函数,配置显示方式。

分析LCD绘图的API函数。

编写主函数,将AD转换结果在LCD上以波形的方式显示,同时以串口输出到PC机。

进入调试。

实现转换数据实时输出,实现串口输出数据与LCD 波形显示的一致。

4.明确思路和任务,查询相关书籍、资料,重点分析S3C2440的触摸屏接口工作原理和相关寄存器。

编写触摸屏初始化函数,确定XY位置转换模式。

编写触摸屏中断初始化函数,中断服务函数。

编写屏幕校准函数。

确定坐标计算公式。

编写触点数据采集函数。

编写主函数,进入调试。

实现触摸屏坐标点x、y的正确读取。

二、功能描述项目一:编写从A/D转换器的通道x获取模拟数据,并将转换后的数字量以波形的形式在LCD上显示的程序。

项目二:通过对AD转换器的配置——触摸屏自动测试x/y位置模式,选择进入到触摸屏驱动函数。

在进行触摸屏测试时,先进入函数判断是否启动A/D转换,如果不是的话就跳出此函数,如果是的话进行下面的判断,看A/D转换是否结束,如果是,跳出函数,如果不是运行程序,并输出x、y的值。

北航ARM9嵌入式实验实验报告

北航ARM9嵌入式实验实验报告

实验一ARM基础知识和开发环境一、实验目的◆掌握ARM的串行口工作原理◆学习编程实现ARM的UART通讯◆掌握S3C2410寄存器配置方法二、实验内容◆熟悉打开已有工程的步骤,掌握仿真调试的方法。

◆建立一个新工程,熟练掌握编译器和链接器的设置方法。

◆从串口输入字符串,将0~9数字在超级终端上连续显示,“Enter”键换行。

◆将第三步得到的字符转换成BCD码,限制在0~1023,用于控制直流电机。

三、预备知识◆了解EW ARM集成开发环境的基本功能◆学习串口通讯的基本知识◆熟悉S3C2410串口有关的寄存器四、实验设备及工具◆硬件:ARM嵌入式开发平台、PC机Pentium100以上、用于ARM920T的JTAG仿真器、串口线。

◆软件:PC机操作系统WinXP、EWARM集成开发环境、仿真器驱动程序、超级终端通讯程序。

五、实验原理及说明1)异步串行通信异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。

数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。

接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。

为了恢复发送的信息,双方必须协调工作。

在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。

但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。

图1-1 串行通信字符格式图1-1给出异步串行通信中一个字符的传送格式。

开始前,线路处于空闲状态,送出连续“1”。

传送开始时首先发一个“0”作为起始位(即双方同步信号),然后出现在通信线上的是字符的二进制编码数据。

每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。

后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。

基于arm9嵌入式led跑马灯设计

基于arm9嵌入式led跑马灯设计

《嵌入式系统设计与应用》综合实验题目基于ARM9的LED跑马灯设计小组成员王坚孙海涛吴烨学号***********2013132500320131325009学院信息与控制专业信息工程(系统工程方向)指导教师孙伟二O一六年五月二十九日摘要.................................................................................................... 错误!未定义书签。

一、设计内容.................................................................................. 错误!未定义书签。

1.1 设计任务............................................................................... 错误!未定义书签。

1.2 设计目的............................................................................... 错误!未定义书签。

1.3 设计要求............................................................................... 错误!未定义书签。

二、设计方案.................................................................................... 错误!未定义书签。

2.1 系统组成............................................................................... 错误!未定义书签。

ARM9控制LED流水灯程序设计

ARM9控制LED流水灯程序设计

ARM9控制LED流水灯程序设计存档资料成绩:华东交通大学理工学院课程设计报告书课程名称嵌入式系统原理及应用题目 ARM9 I/O口控制LED流水灯程序设计分院电信分院专业班级通信工程 2008-2 学号 20080210420224 学生姓名骆玉春指导教师徐涢基2012年 12月 30 日华东交通大学理工学院课程设计报告华东交通大学理工学院课程设计任务书专业通信工程班级 2008级2班姓名骆玉春一、课程设计题目 ARM9 I/O口控制LED流水灯想设计二、课程设计工作:自2011 年 12 月 28 日起至 2012月 2 日止。

年 1三、课程设计的内容要求:1.了解ARM9的I/O口的工作原理;2.基于arm920T的内核,在开发板或者实验箱上,实现LED的流水控制;3.了解I/O口怎么控制LED的输出;4.掌握设置I/O口的状态需要设置的寄存器GPBCON、GPBDAT、GPBUP;5.掌握在ADS环境下建立工程,用H-JTAG来调试程序,生成.HEX文件;6.总结本次课程设计的知识点。

学生签名:201 年月日- 1 -华东交通大学理工学院课程设计报告课程设计评阅意见等级序号项目优秀良好中等及格不及格1 课程设计态度评价2 出勤情况评价3 任务难度评价4 工作量饱满评价5 任务难度评价6 设计中创新性评价7 论文书写规范化评价8 综合应用能力评价综合评定等级评阅人职称20 年月日- 2 -华东交通大学理工学院课程设计报告目录课程设计任务书...................................................................... ..2 第1章课程设计目的..............................................................4 第2章S3C2440的I/O口配置. (5)第3章 S3C2440的I/O口寄存器 (6)第4章课程设计过程 (9)4.1 设计步骤...................................................................... (9)4.2 部分原理图 (9)4.3 源程序...................................................................... (10)4.4 编译调试结果................................................................17 第8章课程设计心得...........................................................19 参考文献...................................................................... . (20)- 3 -华东交通大学理工学院课程设计报告第1章课程设计目的这学期开了嵌入式这门课程,之前就了解到嵌入式系统是当前最热门最有发展前途的IT 应用领域之一。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 的控制方式非常方便。 /*-----------主函数----------*/
相关文档
最新文档