一、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. Python 爬虫实例(15) 爬取 百度百聘(微信公众号)

    今天闲的无聊,爬取了一个网站,百度百聘,仅供学习参考 直接上代码: #-*-coding:utf-8-*- from common.contest import * def spider(): hea ...

  2. 启动和停止kafka 及kafka manager

    启动kafka: sh /app/pet_kafka_xxxx_cluster/bin/kafka-server-start.sh -daemon /app/pet_kafka_xxxx_cluste ...

  3. 怎么在linux 用nginx做代理 配置.net core

    1. 安装 .net core到centos7 2. 安装nginx 配置代理: vim /opt/nginx/conf/nginx.conf server { listen 80; server_n ...

  4. HTTP报文头Accept和Content-Type总结

    1.Accept属于请求头, Content-Type属于实体头. Http报头分为通用报头,请求报头,响应报头和实体报头. 请求方的http报头结构:通用报头|请求报头|实体报头 响应方的http报 ...

  5. JS两日期相减

    JS两日期相减,主要用到下面两个方法 dateObject.setFullYear(year,month,day) 方法 stringObject.split(separator) 方法 functi ...

  6. React Native在开发过程中遇到的一些问题(俗称:坑)

    4900 服务器地址错误 运行时产生以下错误:Could not connect to development server. 1.URL地址设置 问题: Could not connect to d ...

  7. Android 开发之修改 app 的字体大小(老人模式)

    新的需求(可参见 微信和QQ改变字体): app 字体不随着系统字体大小变化 app 设置中有设置字体大小的开关,变大以后,整个 app 字体变大. 解决方案:(字体需要采用 dp 为单位,不能使用 ...

  8. [na]交换机原理/macof

    交换机的工作原理 简单来说,就是根据源mac学习-->形成cam表,根据cam表转发. 正常情况下先arp广播,sw收到后发到本vlan所有出口,所有机器学习更新arp缓存. 目标机返回单播ar ...

  9. [svc]mount命令及解决因/etc/fstab错误导致系统不能启动故障

    mount命令-手动挂载设备 格式: mount [options] [-t fstype] [-o option] 设备 挂载点 mount -n -o remount,rw / - Mount t ...

  10. js 动画3 完美框架

    js 框架: function getStyle(obj,attr){ if(obj.currentStyle){ return obj.currentStyle[attr]; } else{ ret ...