【嵌入式】——arm裸机开发 step by step 之 按键控制 LED 和 蜂鸣器
一、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 和 蜂鸣器的更多相关文章
- ARM裸机开发中内存管理库RT_HEAP的使用
在使用arm芯片进行裸机开发的时候,很多时候都需要内存管理的功能,我们可以使用自己写的内存管理程序,也可以直接使用标准库,不过我一般比较喜欢标准库,速度快,今天就来说说在C语言环境下怎么样进行内存的动 ...
- 【嵌入式】——arm裸机开发 step by step 之 串口通信
一.在使用S5PV210的串口发送和接收的时候,首先要对S5PV210的串口进行配置,我们使用轮询方式时的配置有哪些? 1.配置GPIO,使对应管脚作为串口的发送和接收管脚 GPA0 0 1 管脚 2 ...
- ARM裸机开发之交叉工具链和MakeFile工程管理
一.交叉工具链 嵌入式Linux开发采用交叉开发,简单来说就是在宿主机(PC机)上面编译出能够在其他硬件平台上面运行的程序.在这个过程中,需要用到许多的交叉工具,这些交叉工具的集合就叫做交叉工具链.下 ...
- 嵌入式ARM系统开发基础
从.net到delplhi 从windows到Linxu 未来有多远? 如何突破自己? 什么是自己? 我从哪里来,要到哪里去? 世界是什么? 是世选择了我,还是我选择了世界? 怎么才能够完成蜕变? 去 ...
- Cubieboard2裸机开发之(二)板载LED交替闪烁
前言 电路原理在文章http://www.cnblogs.com/lknlfy/p/3583806.html中已经说明,两个LED的原理图是一样的.要使两个LED交替闪烁,只需要在点亮蓝色LED,熄灭 ...
- S3C2440—2.裸机开发步骤及工具使用
文章目录 一.裸机开发步骤简介 1.在X86架构的Windows系统中 2.在X86架构的Ubuntu系统中 3.ARM裸机开发 二.soucre insight使用 1.sourec insight ...
- Step by Step: 基于MFC下的COM组件开发-Helloworld
http://blog.csdn.net/sybifei/article/details/45008745 [这篇文章有问题, 仅供参考] http://blog.csdn.net/define_us ...
- 精通initramfs构建step by step
(一)hello world 一.initramfs是什么 在2.6版本的linux内核中,都包含一个压缩过的cpio格式 的打包文件.当内核启动时,会从这个打包文件中导出文件到内核的rootfs ...
- Step By Step(Lua编译执行与错误)
Step By Step(Lua编译执行与错误) 1. 编译: Lua中提供了dofile函数,它是一种内置的操作,用于运行Lua代码块.但实际上dofile只是一个辅助函数,loadfile才 ...
随机推荐
- java文件传输接口
开发的时候碰到这样的需求:需要在一个系统(客户端发送请求)中将文件传输至另外一个系统(服务端接收)中去的实现方式,可以批量传输文件,代码如下: 客户端请求: public String upLoadF ...
- Vuex 入门指南
1.Vuex是什么? 我们还是像以往一样先看一看官方文档对此的解读(Vuex 是什么? · GitBook) Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的 ...
- J2EE--Servlet生命周期与原理
Servlet是在server上执行的小程序.而在java中应用程序多是在容器中进行生命周期的管理(这里指Tomact容器). Servlet主要的架构图 首先是 web页面通过提交表单 tomact ...
- HTML5学习笔记(五):CSS基础
CSS 指层叠样式表 (Cascading Style Sheets),在网页中用来定义网页的元素如何进行显示. CSS 对大小写不敏感.不过存在一个例外:如果涉及到与 HTML 文档一起工作的话,c ...
- [Windows Azure] How to use the Table Storage Service
How to use the Table Storage Service version 1.7 version 2.0 This guide will show you how to perform ...
- (原创)一个简洁通用的调用DLL函数的帮助类
本次介绍一种调用dll函数的通用简洁的方法,消除了原来调用方式的重复与繁琐,使得我们调用dll函数的方式更加方便简洁.用过dll的人会发现c++中调用dll中的函数有点繁琐,调用过程是这样的:在加载d ...
- C#之Console
Console.Write 表示向控制台直接写入字符串,不进行换行,可继续接着前面的字符写入.Console.WriteLine 表示向控制台写入字符串后换行.Console.Read 表示从控制 ...
- ny106 背包问题
背包问题 时间限制:3000 ms | 内存限制:65535 KB ...
- python 三元表达式 if for 构建List 进阶用法
1.简单的for...[if]...语句 Python中,for...[if]...语句一种简洁的构建List的方法,从for给定的List中选择出满足if条件的元素组成新的List,其中if是可以省 ...
- #define SIG_DFL ((void(*)(int))0)
在linux内的信号处理函数中,有#define SIG_DFL ((void(*)(int))0)和#define SIG_IGN ((void(*)(int))1)两个宏定义.要理解这两个宏定义, ...