操作步骤:

第一步:查看开发板电路原理图
  找到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. 安装oracle后,Tomcat 登陆 localhost 要求用户名和密码

    localhost 要求用户名和密码同时安装了tomcat和oracle9i后,启动Tomcat--连接到localhost 提示:位于 XDB 的服务器 localhost 要求用户名和密码,原因是 ...

  2. iOS 开发问题集锦(三)

    iOS 开发问题集锦(三) 介于群里大部分童鞋都是新手,为了大家能够更好的提问,并且提的问题能更好的得到回答,下面写几点提问时的注意事项: 1.认真对待你的问题,在提问题前有过认真的思考: 2.先在 ...

  3. 开发win8 metro monogame,显示pubcenter广告时会使游戏卡住的问题的解决方法。

    开发win8 metro游戏,使用monogame,并且还加上pubcenter广告,但是在x64的机子上遇到了问题,广告一出,游戏卡死.经过一系列的判断,发现monogame一直在update和dr ...

  4. IOS Objective-C 协议,委托

    IOS Objective-C 协议,委托 IOS开发使用的语言Objective-C(以下简称OBJ-C)是一种扩展自C语言的面向对象语言.在OBJ-C中有一个很重要概念:消息.在最近的学习当中逐渐 ...

  5. 简洁AngularJS框架后台管理系统bootstrap后台模板

    最近在做一个后台管理的项目,但是没有设计图完全,所以就发现一款非常不错的模版. 这个模版是基于 AngularJS 和 bootstrap 的后台管理系统模版. Minovate是 AngularJS ...

  6. pch文件的作用和配置

    pch文件说白了就是一个头文件,只不过这个头文件的类在全局都可以使用,所以说非常的方便,并不用在每个类里面都写一些重复类的头文件,只要将用到的类的头文件放到pch文件里面就行了,当然了还有就是宏定义, ...

  7. 微信JSAPI支付 跟 所遇到的那些坑

    首先介绍一下我在调用微信支付接口使用的是 weixin.senparc SDK,非常方便好用开源的一个微信开发SDK. weixin.senparc SDK 官网:http://weixin.senp ...

  8. python之路 - 基础2

    1.导入模块 import 模块名 form 模块名 import 模块中的函数 可以将模块放入同级目录中,也可以将模块放入site-packages目录中 import sys print (sys ...

  9. Jquery中toggle的用法详情

    jquery ----toggle([speed],[easing],[fn]) 用于绑定两个或多个事件处理器函数,以响应被选元素的轮流的click事件 如果元素是可见的,切换为隐藏的:如果元素是隐藏 ...

  10. XtraBackup增量备份

    mysql:5.6.29xtrabackup:2.2.10mysql数据目录:/data/mysqlmysql备份目录:/data/dbbak/ #确保有足够的磁盘空间 官方文档:https://ww ...