一、arm-9 TQ2440

 key.h

 #ifndef __KEY_H__
#define __KEY_H__ #define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054) extern void key_init(void);
extern int key1(void);
extern int key2(void);
extern int key3(void);
extern int key4(void); #endif

key.c

 #include "key.h"

 void key_init(void){
//设置key 1 2 3 4 为输入引脚
GPFCON = ~0x3 & ~(0x3<<) & ~(0x3<<) & ~(0x3<<);
} int key1(void){
if(GPFDAT & (0x1<<)){
return ;
}
else{
return ;
}
} int key2(void){
if(GPFDAT & (0x1<<)){
return ;
}
else{
return ;
}
} int key3(void){
if(GPFDAT & (0x1<<)){
return ;
}
else{
return ;
}
} int key4(void){
if(GPFDAT & (0x1)){
return ;
}
else{
return ;
}
}

buzzer.h

 #ifndef __BUZZER_H__
#define __BUZZER_H__ #define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014) extern void buzzer_init(void);
extern void buzzer_on(void);
extern void buzzer_off(void); #endif

buzzer.c

 #include "buzzer.h"

 void buzzer_init(void){
GPBCON &= ~0x3;
GPBCON |= 0x1;
} void buzzer_on(void){
GPBDAT |= ;
} void buzzer_off(void){
GPBDAT &= ~;
}

led.h

 #ifndef __LED_H__
#define __LED_H__ #define GPBCON (*(volatile unsigned long*)0x56000010)
#define GPBDAT (*(volatile unsigned long*)0x56000014) extern void led_init(void);
extern void led1_on(void);
extern void led1_off(void);
extern void led2_on(void);
extern void led2_off(void);
extern void led3_on(void);
extern void led3_off(void);
extern void led4_on(void);
extern void led4_off(void); #endif

led.c

 #include "led.h"

 //初始化led寄存器
void led_init(void){
//设置 led 1 2 3 4 为输出引脚
GPBCON &= ~(0xFF<<);
GPBCON = (<<) | (<<) | (<<) | (<<);
} void led1_on(void){
//GPBDAT &= ~(1<<5);
GPBDAT &= ~(<<);
}
void led1_off(void){
GPBDAT |= <<;
} void led2_on(void){
GPBDAT &= ~(<<);
}
void led2_off(void){
GPBDAT |= (<<);
} void led3_on(void){
GPBDAT &= ~(<<);
}
void led3_off(void){
GPBDAT |= (<<);
} void led4_on(void){
GPBDAT &= ~(<<);
}
void led4_off(void){
GPBDAT |= (<<);
}

main.c

 #include "led.h"
#include "key.h"
#include "buzzer.h" void delay(void); int main(void){
led_init();
key_init();
//蜂鸣器
buzzer_init();
while(){
if(key1()){
led1_on();
led2_on();
}
else{
led1_off();
led2_off();
}
if(key2()){
led3_on();
led4_on();
}
else{
led3_off();
led4_off();
}
if(key3()){
buzzer_on();
}
else{
buzzer_off();
}
}
} void delay(void){
int i;
for(i = ; i < 0xf000; i++){
;
}
}

led.lds

 SECTIONS
{
. = 0x30000000;
.text :{
main.o (.text);
*.o (.text);
}
.data :{
*.o (.data);
}
__bss_start = .;
.bss :{
*.o (.bss);
}
__end = .;
};

Makefile

 CC=arm-linux-gcc
LD=arm-linux-ld
OBJ=arm-linux-objcopy
keyled_c:keyled_c.o
$(LD) -nostartfiles -nostdlib -T led.lds -e main -o keyled_c keyled_c.o
$(OBJ) -O binary keyled_c keyled_c.bin
keyled_c.o:keyled_c.c
$(CC) -march=armv5te -nostdlib -c -o keyled_c.o keyled_c.c
clean:
@rm -vf keyled_c.o keyled_c keyled_c.bin

上面的 led.lds 是设置代码和数据段的地址区

二、arm-A8 S5PV210

 #define GPC0CON (*(volatile unsigned long*)0xE0200060)
#define GPC0DAT (*(volatile unsigned long*)0xE0200064) #define GPH0CON (*(volatile unsigned long*)0xE0200C00)
#define GPH0DAT (*(volatile unsigned long*)0xE0200C04) #define GPD0CON (*(volatile unsigned long*)0xE02000A0)
#define GPD0DAT (*(volatile unsigned long*)0xE02000A4) #define GPD01OUT (1<<(4*1)) #define GPC03OUT (1<<(3*4))
#define GPC04OUT (1<<(4*4)) #define GPH00IN ~(0xF<<(4*0))
#define GPH01IN ~(0xF<<(4*1))
int main(void){
//设置led1 2 GPC0CON 为输出引脚
GPC0CON = GPC03OUT | GPC04OUT;
//设置按键1 2 GPH0CON 为输入引脚
GPH0CON = GPH00IN & GPH01IN;
//设置蜂鸣器 GPD0CON 为输出引脚
GPD0CON = GPD01OUT; while(){
if(GPH0DAT & 0x1){
GPC0DAT = 0x00;
GPD0DAT = 0x00;
}
else{
GPC0DAT = 0x08;
GPD0DAT = 0x02;
}
if(GPH0DAT & 0x02){
GPC0DAT = 0x00;
}
else{
GPC0DAT = 0x10;
}
}
}

  以上的宏定义都是根据开发板电路图找到CPU相对应的管脚,然后设置管脚就可以实现相应的功能。

Makefile:

 CC=arm-linux-gcc
LD=arm-linux-ld
OBJ=arm-linux-objcopy
keyled_c:keyled_c.o
$(LD) -nostartfiles -nostdlib -Ttext=0x20008000 -e main -o keyled_c keyled_c.o
$(OBJ) -O binary keyled_c keyled_c.bin
keyled_c.o:keyled_c.c
$(CC) -march=armv5te -nostdlib -c -o keyled_c.o keyled_c.c
clean:
@rm -vf keyled_c.o keyled_c keyled_c.bin

【嵌入式】——arm裸机开发 step by step 之 按键控制 LED 和 蜂鸣器的更多相关文章

  1. ARM裸机开发中内存管理库RT_HEAP的使用

    在使用arm芯片进行裸机开发的时候,很多时候都需要内存管理的功能,我们可以使用自己写的内存管理程序,也可以直接使用标准库,不过我一般比较喜欢标准库,速度快,今天就来说说在C语言环境下怎么样进行内存的动 ...

  2. 【嵌入式】——arm裸机开发 step by step 之 串口通信

    一.在使用S5PV210的串口发送和接收的时候,首先要对S5PV210的串口进行配置,我们使用轮询方式时的配置有哪些? 1.配置GPIO,使对应管脚作为串口的发送和接收管脚 GPA0 0 1 管脚 2 ...

  3. ARM裸机开发之交叉工具链和MakeFile工程管理

    一.交叉工具链 嵌入式Linux开发采用交叉开发,简单来说就是在宿主机(PC机)上面编译出能够在其他硬件平台上面运行的程序.在这个过程中,需要用到许多的交叉工具,这些交叉工具的集合就叫做交叉工具链.下 ...

  4. 嵌入式ARM系统开发基础

    从.net到delplhi 从windows到Linxu 未来有多远? 如何突破自己? 什么是自己? 我从哪里来,要到哪里去? 世界是什么? 是世选择了我,还是我选择了世界? 怎么才能够完成蜕变? 去 ...

  5. Cubieboard2裸机开发之(二)板载LED交替闪烁

    前言 电路原理在文章http://www.cnblogs.com/lknlfy/p/3583806.html中已经说明,两个LED的原理图是一样的.要使两个LED交替闪烁,只需要在点亮蓝色LED,熄灭 ...

  6. S3C2440—2.裸机开发步骤及工具使用

    文章目录 一.裸机开发步骤简介 1.在X86架构的Windows系统中 2.在X86架构的Ubuntu系统中 3.ARM裸机开发 二.soucre insight使用 1.sourec insight ...

  7. Step by Step: 基于MFC下的COM组件开发-Helloworld

    http://blog.csdn.net/sybifei/article/details/45008745 [这篇文章有问题, 仅供参考] http://blog.csdn.net/define_us ...

  8. 精通initramfs构建step by step

    (一)hello world  一.initramfs是什么  在2.6版本的linux内核中,都包含一个压缩过的cpio格式 的打包文件.当内核启动时,会从这个打包文件中导出文件到内核的rootfs ...

  9. Step By Step(Lua编译执行与错误)

    Step By Step(Lua编译执行与错误) 1. 编译:    Lua中提供了dofile函数,它是一种内置的操作,用于运行Lua代码块.但实际上dofile只是一个辅助函数,loadfile才 ...

随机推荐

  1. django admin 根据choice字段选择的不同来显示不同的页面

    一.举例 tip/tip.js var react = function () { if (django.jQuery('#id_tiptype').val() == 'content') { dja ...

  2. Java使用Rabbitmq惊喜队列queue和消息内容的本地持久化核心方法。(内容存储在硬盘)

    _Channel.queueDeclare(queue, true, false, false, null); _Channel.basicPublish(_ExchangeName, queue,M ...

  3. 【Android开发】Android应用程序目录结构

    原文:http://android.eoe.cn/topic/summary Android开发之旅:组件生命周期吴秦 Android开发之旅:HelloWorld项目的目录结构 * HelloWor ...

  4. 黑马程序猿————Java基础日常笔记---反射与正則表達式

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...

  5. lua -- 事件响应与局部变量

    -- 这里要注意的点是:虽然nAmount是局部变量,却在控件的响应函数中使用 -- 因为控件的响应函数是在该变量的区域内,所以可以用 -- 如果控件的响应函数在外部,那么该变量就要声明成为全局变量 ...

  6. 15个Spring的核心注释示例

    众所周知,Spring DI和Spring IOC是Spring Framework的核心概念.让我们从org.springframework.beans.factory.annotation和org ...

  7. drools规则引擎初探

    https://www.cnblogs.com/yuebintse/p/5767996.html 1.drools是什么 Drools是为Java量身定制的基于Charles  Forgy的RETE算 ...

  8. pandas数组和numpy数组在使用索引数组过滤数组时的区别

    numpy array 过滤后的数组,索引值从 0 开始. pandas Series 过滤后的 Series ,保持原来的索引,原来索引是几,就是几. 什么意思呢,来看个栗子: import num ...

  9. linux命令(36):vimdiff文件对比

    启动方法 首先保证系统中的diff命令是可用的.Vim的diff模式是依赖于diff命令的.Vimdiff的基本用法就是: # vimdiff FILE_LEFT FILE_RIGHT 或者 # vi ...

  10. 03-老马jQuery教程-DOM操作

    jQuery DOM操作 在没有jQuery之前,DOM的操作相对来说有点麻烦,尤其是DOM节点的搜索.目前我们已经学习了jQuery的选择器,接下带大家一块学习jQuery的DOM操作,jQuery ...