操作步骤:

第一步:查看开发板电路原理图
  找到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. iphone手机用wireshark抓包

    ios连上电脑 查看udid. 启动虚拟接口 rvictl -s 7e65eeaa55a1e43dbdfb44a02f9871f1f304043e 打开mac权限 sudo chmod 644 /de ...

  2. 利用WCF与Android实现图片上传并传参

    利用WCF与Android实现图片上传并传参 最近做一个项目后端使用WCF接收Android手机拍照并带其它参数保存到服务器里:刚好把最近学习的WCF利用上,本以为是个比较简单的功能应该很好实现,没想 ...

  3. fancybox关闭弹出窗口parent.$.fancybox.close();

    fancybox弹出窗口右上角会自带一个关闭窗口,并且点击遮罩层也会关闭fancybox 有时我们不需要这样进行关闭,隐藏关闭窗口,并且遮罩层不可点击 在弹出窗口页面加一链接进行关闭使用parent. ...

  4. java文件上传--基于ajaxFileUpload+struts2

    jQuery插件ajaxFileUpload可以实现ajax文件上传,使用非常简单. 下面做一个简单的demo(以上传图片为例),实现图片上传,图片显示,图片下载 注:以下的代码是在项目的基础上进行开 ...

  5. node包管理器

    NPM小结   nodejs的出现,可以算是前端里程碑式的一个事件,它让前端攻城狮们摆脱了浏览器的束缚,踏上了一个更加宽广的舞台.前端的可能性,从此更加具有想象空间. 随着一系列基于nodes的应用/ ...

  6. Go语言Web框架gwk介绍4

    Go语言Web框架gwk介绍 (四)   事件 gwk支持事件系统,但并没有硬编码有哪些事件,而是采用了比较松散的定义方式. 订阅事件有两种方式: 调用On函数或者OnFunc函数 func On(m ...

  7. 实现Avl平衡树

    实现Avl平衡树   一.介绍 AVL树是一种自平衡的二叉搜索树,它由Adelson-Velskii和 Landis于1962年发表在论文<An algorithm for the organi ...

  8. linux内核skb操作

    1,struct sk_buff数据结构 struct sk_buff{ //这两个结构必须放在最前面 struct sk_buff *next; struct sk_buff *prev; stru ...

  9. Python中BeautifulSoup中对HTML标签的提取

    一开始使用了beautifulSoup的get_text()进行字符串的提取,后来一直提取失败,并提示错误为TypeError: 'NoneType' object is not callable 返 ...

  10. 如何发布一个自定义Node.js模块到NPM(详细步骤)

    咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...