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内核代 ...
随机推荐
- 项目Splash页面的开发与设计
项目Splash页面的开发与设计 首先建立一个安卓的项目,然后修改manifest.xml文件,修改应用程序的logo和显示名称,效果图如下: 对应的代码如下: 1 <?xml version= ...
- 搭建一个完整的Java开发环境
搭建一个完整的Java开发环境 作为一个Java程序员,配置一个java开发环境是必备的技能,今天给广大菜鸟初学者补上一课.环境的配置,大概就分三个1,JDK 2,Tomcat(或者其他的)3,ecl ...
- kindeditor使用方法
一.下载编辑器 下载KindEditor最新版本(本版本为4.1.10) 下载页面:http://kindeditor.net/down.php 二.部署编辑器 解压kindeditor-x.x.x. ...
- sqlserver 注释提取工具
小程序大智慧,sqlserver 注释提取工具 开篇背景 我习惯在写表的创建脚本时将注释直接写在脚本里,比如 ? /*账套*/ CREATE TABLE [dbo].[AccountingBook] ...
- Android Widget(窗口小部件)
Android Widget简介 应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widget Provide ...
- JUC锁机制
JUC锁机制(Lock)学习笔记,附详细源码解析 JUC锁机制(Lock)学习笔记,附详细源码解析 2013-08-22 20:03 by CM4J, 56 阅读, 0 评论,收藏, 编辑 锁机制学习 ...
- Kemaswill 机器学习 数据挖掘 推荐系统 Ranking SVM 简介
Ranking SVM 简介 排序一直是信息检索的核心问题之一,Learning to Rank(简称LTR)用机器学习的思想来解决排序问题(关于Learning to Rank的简介请见我的博文Le ...
- 案例研究:Web应用出现间歇性的SqlException
案例研究:Web应用出现间歇性的SqlException 2013-07-29 14:36 by 微软互联网开发支持, 231 阅读, 3 评论, 收藏, 编辑 最近有客户找到我,说他们生产环境的事件 ...
- Python学习入门基础教程(learning Python)--6.4 Python的list与函数
list是python下的一种数据类型,他和其他类型如整形.浮点型.字符串等数据类型一样也可作为函数的型参和实参来使用! 1.list作为参数 list数据类型可以作为函数的参数传递给函数取做相应的处 ...
- 【C语言】指针模块
本文目录 直接引用 一.什么是指针? 二.指针的定义 三.指针的初始化 四.指针运算符 五.指针的用途举例 六.关于指针的疑问 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得 ...