操作步骤:

第一步:查看开发板电路原理图
  找到LED 的管脚所对应的寄存器


  nLED_1 - GPK4
  nLED_2 - GPK5
  nLED_3 - GPK6
  nLED_4 - GPK7
  由原理图可知LED对应的寄存器为GPK寄存器,由二极管的特性可知当LED_n为低电平时LED灯亮
第二步:查看数据手册找到GPK寄存器的地址及每位表示的意义

  Register  Address
  GPKCON0   0x7F008800
  GPKCON1   0x7F008804
  GPKDAT    0x7F008808
  GPKPUD    0x7F00880C
  通过数据手册知道GPK寄存器有两个控制寄存器(GPKCON0和GPKCON1)和一个数据寄存器(GPKPDAT)
  [GPK0 GPK1 GPK2 GPK3 GPK4 GPK5 GPK6 GPK7] 在GPKCON0中每4位表示一个GBKn(0<=n<=7)
  [GPK8 GPK9 GPK10 GPK11 GPK12 GPK13 GPK14 GPK15] 在GPKCON1中每4位表示一个GBKn(8<=n<=15)
第三步:设置寄存器的值
  由第一步可知主要用到的管脚为GPK4、GPK5、GPK6、GPK7
  由第二步可知GPK[4-7]有GPKCON0 控制
  1)将管脚设置为输出
  LED作为显示是属于输出由数据手册可知(0000 = Input 0001 = Output)故只要讲GPKn对应的4位设置为0001即表示输出
  2)将管脚的值设为低电平
  LED的数据寄存器为GPKDAT,由数据手册关于GPKDAT的介绍就可知GPKDAT第n位的值即表示GPKn(0<=n<=15)的电平状态(一般都是0表示低电平,1表示高电平)
第四步:编写代码
  1)关看门狗
    通过数据手册找到看门狗的控制寄存器地址
    Register    Address
   WTCON     0x7E004000
  2)设置控制寄存器(GPKCON0)的值
  3)设置数据寄存器(GPKDAT)的值
第五步:编写Makefile

 led.bin: start.o main.o
arm-linux-ld -Ttext 0x50000000 -o led.elf $^
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led_elf.dis
%.o : %.S
arm-linux-gcc -o $@ $< -c
%.o : %.c
arm-linux-gcc -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis -rf

Makefile Code

第六步:在虚拟机Linux环境下编译生成.bin文件

第七步:将上一步生成的.bin文件烧写到开发板上运行

代码实现:

汇编版:

 .global _start
_start:
//关闭看门狗,防止不断重启
ldr r0,= 0x7E004000 //;将看门狗寄存器的地址赋给r0
mov r1,# //;将r1赋值为0
str r1, [r0] //;将r1的值装载到r0寄存器中
//;即将地址为0x7E004000的寄存器的值赋值为0
//设置GPKCON0寄存器
ldr r0, =0x7E008800 //;将GPKCON0寄存器的地址赋值为r0
ldr r1, =0x11110000 //;转换为0001,0001,0001,0001,0000,0000,0000,0000
str r1, [r0] //;即将 GPK7,GPK6,GPK5,GPK4 赋值设置成为输出 mov r2, #0x1000
led_blink:
//设置GPKDAT寄存器 使GPK4-GPK7引脚输出低电平,LED亮
ldr r0, =0x7F008808 //;将GPKDAT寄存器的地址赋值为r0
mov r1, #
str r1, [r0]
//延时
bl delay //设置GPKDAT寄存器 使GPK4-GPK7引脚输出高电平,LED灭
ldr r0, =0x7F008808 //;将GPKDAT寄存器的地址赋值为r0
mov r1, #0x00f0
str r1, [r0]
//延时
bl delay sub r2 ,r2 ,# //;表示r2=r2-1
cmp r2, # //;将r2和0比较
bne led_blink //;如果r2!=0 则跳转到 led_blink处执行 halt:
b halt //;死循环 delay:
mov r0, #0x1000000 delay_loop:
cmp r0,#;
sub r0, r0, #
bne delay_loop
mov pc, lr

汇编 Code

C语言版:

 //start.S
.global _start
_start:
//关看门狗
ldr r0, =0x7E004000
mov r1, #
str r1, [r0] // 设置堆栈
ldr sp,=0xC002000 //SRAM 的映射地址是0X0C000000 //调用点灯函数
bl main
halt:
b halt //////////////////////////
//Tiny6410Addr.halt
#ifndef _Tiny6410Addr_H
#define _Tiny6410Addr_H
//GPK
#define GPKIO_BASE (0x7F008800)
#define rGPKCON0 (*(volatile unsigned long*)(GPKIO_BASE+0x00))
#define rGPKDAT (*(volatile unsigned long*)(GPKIO_BASE+0x08)) #endif ///////////////////
//led.c
#include "Tiny6410Addr.h"
#define GPK4_OUT (1<<4*4)
#define GPK5_OUT (1<<4*5)
#define GPK6_OUT (1<<4*6)
#define GPK7_OUT (1<<4*7)
//延时函数
void delay()
{
volatile int i = 0x10000;
while (i--);
} int main()
{
unsigned int i = 0x10;
//将GPK4-7设置为输出
rGPKCON0 = GPK4_OUT | GPK5_OUT |GPK6_OUT |GPK7_OUT;
//跑马灯式
while ()
{
rGPKDAT = i;
i++;
if(i == 0x100)
i=0x10;
delay();
} return ;
}

C Code

Tiny6410之LED裸机驱动的更多相关文章

  1. Tiny6410之按键裸机驱动

    操作步骤: 第一步:查看开发板电路原理图 找到LED 和按键的管脚所对应的寄存器 LED:(见Tiny6410之LED裸机驱动) nLED_1 - GPK4 nLED_2 - GPK5 nLED_3 ...

  2. 四、使用汇编编写LED裸机驱动

    1. 确定硬件连接 打开OK6410底板电路图,找到LED,可以发现NLEDx为0时LED点亮. 找到LED的控制引脚,发现LED控制引脚通过连接器连到了核心板: 打开核心板电路图,找到对应的连接器中 ...

  3. Tiny6410之UART裸机驱动

    UART简介: UART(Universal Asynchronous Receiver and Transmitter)通用异步收发器(异步串行通信口),是一种通用的数据通信协议,它包括了RS232 ...

  4. Tiny6410之控制icache驱动

    什么是cache:    基于程序访问的局限性,在主存和CPU通用寄存器之间设置了一类高速的.容量较小的存储器,把正在执行的指令地址附件的一部分指令或数据从主存调入这类存储器,供CPU 在一段时间内使 ...

  5. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  6. Arduino 数码管LED屏驱动

    今天測试数码管LED屏驱动,用某产品的一个共阴极的LED屏,依据电路图做数码管LED屏的检測. 代码写得有些冗长,有好几种驱动的方法,这里仅仅是当中一种最直接的方案,抽出时间要做个更有效率的调用和驱动 ...

  7. 旧接口注册LED字符驱动设备(动态映射)

    #include <linux/init.h> // __init __exit #include <linux/module.h> // module_init module ...

  8. Linux内核的LED设备驱动框架【转】

    /************************************************************************************ *本文为个人学习记录,如有错 ...

  9. 嵌入式Linux学习笔记(三) 字符型设备驱动--LED的驱动开发

    在成功构建了一个能够运行在开发板平台的系统后,下一步就要正式开始应用的开发(这里前提是有一定的C语言基础,对ARM体系的软/硬件,这部分有疑问可能要参考其它教程),根据需求仔细分解任务,可以发现包含的 ...

随机推荐

  1. 【Yom框架】漫谈个人框架的设计之三:业务接口+UI层的设计(基于Castle实现的Repository)

    Repository层设计的文章见:[http://www.cnblogs.com/yomho/p/3297042.html]   一.概要设计 上面Reposity 应该为 Repository 特 ...

  2. 【译】TensorFlow Python Docs 之 overview

    Overview 综述 TensorFlow has APIs available in several languages both for constructing and executing a ...

  3. WinForm中 事件 委托 多线程的应用

    WinForm中 事件 委托 多线程的应用[以一个下载进度条为例] 第一步:首先我们创建一个winfor的项目 第二步:我们建一个窗体在一个窗体里面 打开一个另外的窗体 另外的窗体有一个按钮 点击后就 ...

  4. myeclipse maven编译出错

    从.net 到java  快一年了.这一年学了很多东西.从开发角度来说俩个语言查不到.部署上差异较大.不过java处理问题上确实不太统一.好多问题在网上没有正确的回答.刚换台式机发现 mvn inst ...

  5. [修]开启MySQL远程访问权限 允许远程连接

    原文地址:http://www.cnblogs.com/XL-Liang/archive/2012/05/03/2481310.html 这个地址也许更有帮助:http://www.cppblog.c ...

  6. flask 真是太棒啦,阅读手册后就能做出一个博客了

    真是很好的东西,有很多有益处的东西. 有template引擎, 有flask自己带的g (用来处理访问与数据库打开关闭的) 有flask自己的处理session的功能 自带的jinja2模板引擎也是比 ...

  7. Android获取SD卡中选中图片的路径(URL)

    最近在做一个图片上传的功能,需要提供上传图片在SD卡中的路径,在网上看了些例子,改改调试成功,代码很简单.其布局文件如下: [html]  view plain copy   <?xml ver ...

  8. Android tools:context=".MainActivity"的作用

    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content& ...

  9. 第 1 章 Node.js 介绍

    本章内容包括: 什么是 Node.js 框架,为什么要用 Node.js 框架,使用 Node.js 框架能够解决什么问题,在哪些场合下应该考虑使用 Node.js 框架. 如何下载 Node.js ...

  10. 简单的通讯录(C语言实现)

    通讯录实现的功能 --: .添加联系人 .删除联系人 .查找联系人 .修改联系人 .显示联系人 .清空通讯录 .按照姓名进行排序 .退出程序 该通讯录将联系人的信息保存在文件中 在VS2013中打开文 ...