Tiny6410之按键裸机驱动
操作步骤:
第一步:查看开发板电路原理图
找到LED 和按键的管脚所对应的寄存器
LED:(见Tiny6410之LED裸机驱动)
nLED_1 - GPK4
nLED_2 - GPK5
nLED_3 - GPK6
nLED_4 - GPK7
Buttons:
K1 GPN0
K2 GPN1
K3 GPN2
K4 GPN3
由原理图可知LED对应的寄存器为GPK寄存器,buttons 对应的寄存器为GPL,由二极管的特性可知当LED_n为低电平时LED灯亮
第二步:查看数据手册找到GPK寄存器和 GPL寄存器的地址及每位表示的意义
LED:(见Tiny6410之LED裸机驱动)
Register Address
GPKCON0 0x7F008800
GPKCON1 0x7F008804
GPKDAT 0x7F008808
GPKPUD 0x7F00880C
BUTTONS:
GPNCON 0x7F008830
GPNDAT 0x7F008834
GPLPUD 0x7F008838
通过数据手册知道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)
通过数据手册知道GPL寄存器有两个控制寄存器(GPLCON0和GPLCON1)和一个数据寄存器(GPLDAT)
[GPN0-GPN15] 在GPLCON0中每2位表示一个GBNn(0<=n<=15)
第三步:设置寄存器的值
由第一步可知LED主要用到的管脚为GPK4、GPK5、GPK6、GPK7;Buttons主要用到的管脚是GPL8、GPL9、GPL10、GPL11;
由第二步可知GPK[4-7]有GPKCON0 控制、GPL[8-11]由GPLCON1控制
1)LED将管脚设置为输出、Buttons将管脚设置为输入
LED作为显示是属于输出由数据手册可知(0000 = Input 0001 = Output)故只要讲GPKn对应的4位设置为0001即表示输出
Buttons作为按键是属于输如由数据手册可知(00 = Input 01 = Output)故只要讲GPNn对应的4位设置为00即表示输入
2)LED将管脚的值设为低电平LED灯亮
Buttons将管脚的值设置为高电平即表示按下
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
第六步:将代码在虚拟机上编译生成.bin 文件
第七步:将.bin文件烧写到开发板运行
第八步:实验现象,一个按键控制一个灯的灭
代码实现:
//start.S
.global _start
_start:
//关看门狗
ldr r0, =0x7E004000
mov r1, #
str r1, [r0] // 设置堆栈
ldr sp,=0xC002000 //SRAM 的映射地址是0X0C000000 //调用点灯函数
bl main
halt:
b halt
/////////////////////////////
//Tiny6410Addr.h
#ifndef _Tiny6410Addr_H
#define _Tiny6410Addr_H
//GPK
#define GPIO_BASE (0x7F008800)
#define rGPKCON0 (*(volatile unsigned long *)(GPIO_BASE+0x00))
#define rGPKDAT (*(volatile unsigned long *)(GPIO_BASE+0x08)) //GPN
#define rGPNCON (*(volatile unsigned long *)(GPIO_BASE+0x30))
#define rGPNDAT (*(volatile unsigned long *)(GPIO_BASE+0x34)) #endif //////////////////////////
//button.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 data = 0xF0;
//将GPK4-7设置为输出
rGPKCON0 = GPK4_OUT | GPK5_OUT |GPK6_OUT |GPK7_OUT;
// 配置GPN为输入功能
rGPNCON = ;
while ()
{
//K1按下
if (rGPNDAT & (<<))
GPKDAT &= ~(<<);
else
GPKDAT |=data;
//K2按下
if (rGPNDAT & (<<))
GPKDAT &= ~(<<);
else
GPKDAT |=data;
//K3按下
if (rGPNDAT & (<<))
GPKDAT &= ~(<<);
else
GPKDAT |=data;
//K4按下
if (rGPNDAT & (<<))
GPKDAT &= ~(<<);
else
GPKDAT |=data;
} }
C Code
Tiny6410之按键裸机驱动的更多相关文章
- Tiny6410之UART裸机驱动
UART简介: UART(Universal Asynchronous Receiver and Transmitter)通用异步收发器(异步串行通信口),是一种通用的数据通信协议,它包括了RS232 ...
- Tiny6410之LED裸机驱动
操作步骤: 第一步:查看开发板电路原理图 找到LED 的管脚所对应的寄存器 nLED_1 - GPK4 nLED_2 - GPK5 nLED_3 - GPK6 nLED_4 - GPK7 由原理图可知 ...
- Tiny6410之控制icache驱动
什么是cache: 基于程序访问的局限性,在主存和CPU通用寄存器之间设置了一类高速的.容量较小的存储器,把正在执行的指令地址附件的一部分指令或数据从主存调入这类存储器,供CPU 在一段时间内使 ...
- 蜕变成蝶~Linux设备驱动之按键设备驱动
在上述的驱动系列博客中,我们已经了解了关于阻塞和非阻塞.异步通知.轮询.内存和I/O口访问.并发控制等知识,按键设备驱动相对来说是比较简单的,本章内容可以加深我们对字符设备驱动架构.阻塞与非阻塞.中断 ...
- 2440裸机驱动之PWM开发
原文http://blog.chinaunix.net/uid-14114479-id-3125685.html ARM驱动蜂鸣器的方式有两种:一种是PWM输出口直接驱动,另一种是利用IO定时翻转电平 ...
- Tiny6410之NAND FLASH驱动
一.NAND FLASH的特点 S3C6410的NAND FLASH控制器有如下特点 1.自导入模式:复位后,引导代码被送入到8KB的STEPPINGSTONE中,引导代码移动完毕,引导代码将在STE ...
- 基于NIOS-II的示波器:PART1 按键&显示屏驱动&界面
NIOS II 相关资料以及基础入门 <NiosII的奇幻漂流> <Nios II那些事儿> 本文所有的硬件基础以及工程参考来自魏坤示波仪,重新实现驱动并重构工程. 基于NIO ...
- Linux按键设备驱动一
① request_irq函数用于注册中断 int request_irq(unsigned int irq, void(*handler)(int, void*, struct pt_reg*), ...
- DM9000裸机驱动程序设计
对于任何一个硬件模块的设计,首先第一步都是要先了解硬件本身后,再开始程序的软件设计.而由于DM9000的芯片文档内容很多,要驱动好网卡,需要很长时间,特别对于新手比较困难,所以可以参考linux内核代 ...
随机推荐
- jQuery $.ajaxSend()
语法: $("#msg").ajaxSend(function(evt,request,settings){}); AJAX请求发送前执行函数.Ajax事件. XMLHttpReq ...
- Ling to entity实现分页
Ling to entity实现分页 最近用MVC做的一个项目涉及到分页,中间用了entity framework来查数据库,不用直接写sql语句,方便了很多. 一般分页的思路是获得两个变量的值: 1 ...
- zookeeper使用跟原理
zookeeper使用和原理 zookeeper介绍zookeeper是一个为分布式应用提供一致性服务的软件,它是开源的Hadoop项目中的一个子项目,并且根据google发表的<The Chu ...
- Hadoop Streaming Command Details and Q&A
Hadoop Streaming Hadoopstreaming is a utility that comes with the Hadoop distribution. The utilityal ...
- Linux系统 nfs 共享及 挂载mount 配置
要把 A服务器(192.168.1.1)的 /home 目录挂载到 B服务器(192.168.1.2)的/mnt目录 我们先在 A 服务器上编辑/etc/exports 文件, 添加下面这行代码 /h ...
- C/C++ 内存对齐
一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...
- are both mapped to the url-pattern 错误解决方法
今天运行tomcat的时候出现报了一大波错误,下面我截取了部分错误信息: 严重:A child container failed during start java.util.concurrent.E ...
- JS的运算问题……
在公司实习期间,发现了一个JS很奇怪的问题. 今天在这里来探讨一下 第一个问题 在生活中或者其他语言中一般相加是这样的:0.1+0.2=0.3; 但在JS中却是这样:0.1+0.2=0.3000000 ...
- KendoUI 用下来的小总结
Kendoui Aspnetmvc * 引用jquery.1.10以上 * 1.项目引用 Kendo.Mvc.dll 2.页面引用 @using Kendo.Mvc.UI; 3.Name和 HtmlA ...
- 搞定单模式匹配(简单,KMP)
模式匹配是查找的一种,分为单模式匹配和多模式匹配.查找,就是在一个集合中查找一个或多个元素,查找一个元素就叫单模式匹配,查找多个元素就是多模式匹配,这里只探讨单模式匹配.虽然模式匹配看上去与数字的查找 ...