S3C6410裸奔——LED

发布者:码农闲散人最新更新时间:2017-01-04 来源: eefocus关键字:S3C6410  LED 手机看文章 扫描二维码
随时随地手机看文章

  最近拿出了空闲已久的Tiny6410开发板来玩一下,一直对Linux有变态的崇拜,所以这次过度没有悬念的抛弃诸如ADS1.2或RVDS等IDE开发环境。完全的VIM + GCC搞定一切。

  言简意赅,生成的BIN放入SD卡中启动,详细过程参见Tiny6410的帮助文档,配置文件附送光盘里都有。

  这里仅主要介绍一下如何点亮核心板上的4个LED,当然在此之前arm-linux-gcc交叉编译环境要搭建起来,还要添入环境变量之中(在终端中输入arm-linux-gcc -v 看是否能正确的查询到当前交叉编译器的版本号以检查是否添加成功,出现如图所示说明添加成功)。

          

  为了点亮LED,我们先看一下友善之臂Tiny6410开发板关于LED的原理图部分。

  由图可见,我们要操作的LED分别由GPK[4-7]口控制。

  然后就是看一下三星的datasheet了。

          

  可见我们把输入方向配置为输出,并输出低电平LED才会亮。  

  首先先看汇编代码。


@********************************************
@    File:led_on.s
@    function: LED
@   author: pang123hui
@********************************************
.text                        @ 定义一个代码段
.global _start                @ 定义一个全局入口
_start:                        @ 全局入口处
    LDR R0,=0x7F008800        @ 设R0为GPKCON0寄存器
     MOV R1,#0x11112222        @ 设置GPKC[4-7]为输出
     STR R1,[R0]
     LDR R0,=0x7F008808        @ R0设为GPKDAT寄存器
     MOV R1,#0x00000000        @ 设置GPKDAT[4-7]为低电平
     STR R1,[R0]
MAIN_LOOP:
     B MAIN_LOOP


汇编里的B指令为跳转指令,直接向PC寄存器赋值。B跳转是个相对跳转指令,其机器吗格式如下:

  即B跳转指令依赖于当前PC寄存器的值,这个特点使得使用B指令的程序不依赖于代码存储的位置——即不管这条代码放在什么位置,B指令都可以跳到正确的位置。这类指令被称为位置无关码。

  还有一条BL指令,除了条装之外,还将返回地址(BL的下一条指令的地址)保存在LR寄存器中,也是位置无关的指令。

  B和BL指令可跳转的范围是当前指令的前后32MB.

相关Makefile文件。


CC=arm-linux-gcc
CFLAGS=-g -c -o
led_on.bin:led_on.s
    $(CC) $(CFLAGS) led_on.o led_on.s
    arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf
    arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
    rm -f led_on.bin led_on_elf *.o


简单介绍一下相关指令。

A. arm-linux-gcc

-c  对源文件进行预处理、编译、汇编,但不做链接,生成中间OBJ文件,通常以.o结尾。

-g    添加调试信息

-o  指定输出文件。如果不指定-o filename 选项,默认输出为a.out文件。

B.  arm-linux-ld

-Ttext     startaddr

-Tdada    startaddr

-Tbss      startaddr

其中-T选项用来指定代码段、数据段、BSS段的起始地址。                      

如果不定义数据段和BBS段的起始地址,它们会被依次放在代码段的后面。

C. arm-linux-objcopy

用于将一个目标文件复制到另一个文件内,可以使用不同于源文件的格式输出到目的文件。常用于格式转化。

-O    用于指定输出的文件格式。如二进制 –O binary

-I  用于指定源文件的格式

-S  不从源文件中复制重定位信息和符号信息到目标文件

D. arm-linux-objdump

用于显示二进制文件住处。常用于进行反汇编,方便调试。

-D  反汇编所有段

-m  指定反汇编目标文件所使用的架构,如 –m arm 指定为ARM体系架构。

-b    指定输入文件的格式,这不是必须的,arm-linux-objdump能自动识别多种格式。

C语言代码。


#define rGPKCON0        (*(volatile unsigned *)(0x7F008800))
#define rGPKCON1        (*(volatile unsigned *)(0x7F008804))
#define rGPKDAT         (*(volatile unsigned *)(0x7F008808))
#define rGPKPUD         (*(volatile unsigned *)(0x7F00880C))

int main( void )
{
    // 设置GPKCON[4-7]为输出
    rGPKCON0 = 0x11112222;
    
    // 设置GPKDAT[4-7]为低电平
    rGPKDAT = 0xffffff0f;
    
    return 0;
}


  有些学习过Bootloader和内核的朋友肯定会知道,在调用C语言函数之前肯定会有一段汇编代码在前面铺路,进行一些必要的初始化工作;而那些只学过单片机而没有学过ARM的朋友肯定会觉得很奇怪,在单片机中写C代码,前面完成可以不用任何汇编代码。这是为什么呢?

  这主要是因为我们的开发环境(这里主要是指编译环境)的不同,在开发单片机程序的时候,开发环境(如KEIL)会在编译C代码的时候,给我添加启动代码(startup-51)或者在编译时已经由编译器在后台为我们初始化好了。而在开发ARM程序时,ARM处 理器支持多种模式,多种功能,而在不同的领域不同的项目里面,我们可以有选择的、适当的选择这些功能,这时,编译器就不知道我们需要什么功能,需要什么模 式,编译器也就无法给我们提供默认的“初始化”代码,所以,编译器干脆就“不管”这些了,把这些工作交由我们开发者来处理。

 这里最简单的启动代码。


@****************************************
@    File: startup.s
@    function: start up
@   author: pang123hui
@****************************************
.text
.global _start
_start:
    LDR R0,=0x7E004000        @ WATCHDOG寄存器地址
    MOV R1,#0x0
    STR R1,[R0]                @ 写入0,禁止WATCHDOG,否则CPU会不断重启
    LDR SP,=0x0c001000        @ 设置堆栈,注意:这时我们是将程序直接烧录到SDRAM中,所以堆栈要设置在SDRAM中
                            @ 如果将程序烧在NAND FLASH中,需将堆栈改为1024*4,因为NAND FLASH中的代码
                            @ 在复位后会移到内部RAM中,此RAM只有4K
    BL    main                @ 调用C程序中的main函数
halt_loop:
    B    halt_loop


这里要注意的一点是S3C6410中RAM的地址,见datasheet,如图。

最后是Makefile文件。


CC=arm-linux-gcc
CFLAGS=-g -c -o
led_on.bin:startup.s main.c
    $(CC) $(CFLAGS) startup.o startup.s
    $(CC) $(CFLAGS) main.o main.c
    arm-linux-ld -Ttext 0x0c000000 -g startup.o main.o -o led_on_elf
    arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
    rm -f led_on.bin led_on_elf *.o


  东西很简单没什么好说的,在此记录,以免忘记,如有疑问或发现本文有何错误,欢迎提出。


关键字:S3C6410  LED 引用地址:S3C6410裸奔——LED

上一篇:arm 2440和6410区别
下一篇:一步步写STM32 OS【一】 序言

推荐阅读最新更新时间:2024-03-16 15:28

LED驱动电源选配方法及注意事项
  LED驱动 电源 选配方法:   LED本身的负载特性大大影响了用 开关电源 驱动它的可靠性。LED的负载特性,即伏安特性,属二极管特性。在一定区间内,LED两端电压的升高,使其电流的增长呈指数式,爆炸型的增长。故很多用开关电源驱动的LED灯具,表现出很多不稳定特性。原因就是,开关电源的输出,并不是很干净的平滑直流电压(电流)能量,而是一种非常复杂的能量信号,其大致可以看成是平稳的。   而LED对电压变化非常敏感,LED在稳定的电流下工作时,其两端电压一般是3.0-3.6V之间(大小功率LED略有差异),当加在其两端的电压稍微波动后,其两端电流就会剧烈变动,此时电源的输出功率也即猛烈变化。若电网电压中有较突然的变大,此时很
[电源管理]
基于AVR的LED照明灯控制系统的应用设计
简介:本方案利用红外遥控较好地实现了家用LED照明调光控制,ATmega8与红外遥控远距离控制的优势还可以得到进一步的发挥:ATmega8的3个定时器可配置为3路PWM输出,即可以控制3串LED灯,可以为多色LED照明与装饰照明提供支持;ATmega8强大的处理能力也可以为个性化的照明方案提供强大的支持;红外收发系统除了能发送控制信号外,还能将灯光控制方案传输给ATmega8。 1 LED照明灯控制系统原理 系统原理图如图1所示。当红外接收器接收到红外遥控信号时,通过外部中断将AVR单片机从休眠模式中唤醒;AVR单片机开始解析红外信号,如果与系统地址匹配,则将根据解析到的命令改变LED恒流源驱动的输入,从而改变LED灯的状
[单片机]
基于AVR的<font color='red'>LED</font>照明灯控制系统的应用设计
32LED单片机心形花样流水灯
#include reg51.h #include intrins.h #define uint unsigned int #define uchar unsigned char uchar code zou ={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//单个从0到7 uchar code you ={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//单个从7到0 uchar code liang0_7 ={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; // 逐个点亮0~7 uchar code lia
[单片机]
智能显示器LED背光驱动器案例分析
小型便携式电子系统一直在不断向前发展,诸如移动电话、PMP(个人媒体播放器)、DSC(数码相机)、DVC(数字摄像机)、PME(便携式医疗设备)和GPS(全球定位系统),功能特性一代比一代丰富。随之而来的是一些外围电路的要求也趋于雷同,因为它们的电源、端口和MMI(人机界面)都使用相似的技术。 低功耗全功能产品的三种策略 随着便携式系统的功能增加以及性能的提高,对功耗进行管理的需求也日益提高。因此,OEM厂商用来解决功耗问题的策略也在不断发展。 第一级策略专注于能量管理子系统的效率,包括尽量减小DC/DC转换器、LDO、电池管理和电池保护电路上的损耗。 这是一种以电源子系统为中心的方法,很大程度上取决于
[电源管理]
智能显示器<font color='red'>LED</font>背光驱动器案例分析
光驭未来:欧司朗崭星®系统解码照明“碳中和”之路
近期,“东北限电”频频登上热搜,全国多个省份也陆续发布了“有序用电”的通知。而在上半年“双控”目标完成情况出炉后,各地进一步加快了步伐,纷纷推出多种能耗“双控”举措。很显然,“限电”并不是解决问题的根本办法,能耗双控的目标是在“碳达峰”、“碳中和”的背景下各省区转变经济发展模式必须要面对的挑战。可以说,碳中和不仅是一场能源革命,更是中国推进低碳新工业体系建设的历史性机遇,而如何未雨绸缪,走在低碳时代的前沿,是每个企业必须仔细思考的问题。 在现代化商业建筑中,照明用电占整体用电量的近20%,仅次于空调系统。照明领域的节能降耗是减少碳排放和减轻电网压力的一个快捷且经济的方式。根据联合国环境署的联合能效倡议(U4E),LED灯比传统
[工业控制]
光驭未来:欧司朗崭星®系统解码照明“碳中和”之路
LT3799:隔离型反激式LED驱动器
LT®3799 是一款具功率因数校正功能的隔离型反激式控制器,专为驱动 LED 而设计。该控制器采用临界导通模式,因而允许使用一个小的变压器。这款控制器运用一种新颖的电流检测方案,能够向副端输送经过良好调节的电流,而无需采用一个光耦合器。此器件内置了一个强大的栅极驱动器,用于驱动一个外部高电压 MOSFET。LT3799 采用了一个板上乘法器,通常可实现 0.97 的功率因数。FAULT 引脚负责告知开路和短路 LED 情况。 LT3799 运用微功率迟滞启动,以在采用离线输入电压时实现高效运作,并利用第三个绕组来为器件供电。一个内部 LDO 负责为器件的内部电路和栅极驱动器提供经过良好调节的电源。 特点 ●具极少外部组件的
[电源管理]
LT3799:隔离型反激式<font color='red'>LED</font>驱动器
四字LED点阵显示屏的制作
  随着LED的快速发展,大街小巷到处都可见到行行色色LED广告屏。它以其高亮度,低功耗。显示内容易改等特点备受青睐,于是笔者动手制作了一个四字LED点阵显示屏,现介绍给大家,以供参考。    一、显示汉字原理   我们以UCDOS中文宋体"大"字库为例,如图1所示。每一个字由16行16列的点阵组成显示。   即国标汉字库中的每一个字均由256点阵来表示。   我们可以把每一个点理解为一个像素,而把每一个字的字形理解为一幅图像。事实上这个汉字屏不仅可以显示汉字,也可以显示256像素的图片。 图1显示宋体"大"字实例。   图2是8X8点阵的原理图。其实就是64个发光二极管。以8X8矩阵的形式连接
[电源管理]
四字<font color='red'>LED</font>点阵显示屏的制作
蓝光LED光子晶体技术原理及制程详解
  为回避 日亚 化学的 蓝光led 加萤光粉制技术专利,各业者纷纷投入其它能达到散发出白光的 LED 技术,目前最被期待的技术是利用UV LED 来达到白光的目的,但是,UV LED 仍旧有著光外漏及低 亮度 两个不易克服的困难。使得除了继续努力来解决相关的问题外,不得不再去寻求其它的材料或技术来达到散发出白光的LED 技术。   在1987 年,国籍相异且分居不同地点的两位学者,ELi Yablonovitch 与Sajeev John 几乎同一时间在理论上发现,电磁波在周期性介电质中的传播状态具有频带结构,利用两种以上不同折射率(或介电常数)材料做周期性变化来达成 光子 能带的物质。所以光子晶体(Photon ic Cr
[电源管理]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved