【嵌入式】——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才 ...
随机推荐
- 常用代码之五:RequireJS, 一个Define需要且只能有一个返回值/对象,一个JS文件里只能放一个Define.
RequireJS 介绍说一个JS文件里只能放一个Define,这个众所周知,不提. 关于Define,它需要有一个返回值/对象,且只能有一个返回值/对象,这一点却是好多帖子没有提到的,但又非常重要的 ...
- EndNote 输出样式模板(根据国家标准制订)
EndNote 输出样式模板(根据国家标准制定) EndNote 相当于一个数据库,将添加/导入的文献存档.需要引用文献的时候就从中选择一个插入到文档中,EndNote 会自动给你编号.在文档末尾 ...
- 通过maven中properties标签定义spring版本号
一 发现问题 在pom.xml中添加依赖时语法如下 <dependency> <groupId>org.springframework</groupId> &l ...
- iOS安全攻防(十八):数据保护API
数据保护API 题外话 开篇先扯几句题外话,许多朋友都问我怎么不写防啊,我确实有点犹豫.hackers总是想象如果自己是开发者会怎么写,然后才能找到入手点.同理,开发者们也要想象自己是hackers会 ...
- Vivado中debug用法
Vivado和ISE相比ChipScope已经大幅改变,很多人都不习惯.在ISE中称为ChipScope而Vivado中就称为in system debug.下面就介绍Vivado中如何使用debug ...
- javascrip json2
http://www.json.org/json-zh.html 下载: https://github.com/douglascrockford/JSON-js
- 使用ScriptEngineManager解析json
使用ScriptEngineManager能够解析比較复杂的json串,应用比較方便,可是效率不敢说,由于这种方法相当于执行了一次js.会占资源, 代码例如以下: try { String mdski ...
- 转:Math: Math.atan() 与 Math.atan2() 计算两点间连线的夹角
我们可以使用正切操作将角度转变为斜率,那么怎样利用斜率来转换为角度呢?可以利用斜率的反正切函数将他转换为相应的角度.as中有两个函数可以计算反正切,我们来看一下. 1.Math.atan() Math ...
- 转:显示技术中的帧、帧数、帧率、 FPS
在视频领域,电影.电视.数字视频等可视为随时间连续变换的许多张画面,而“帧( Frame)”是指每一张画面.而我们日常口语习惯或者说不严谨的交流中,通常对于帧数( Frames)与帧率( Frame ...
- How to fix ERR_SSL_VERSION_INTERFERENCE on Chrome?
https://ugetfix.com/ask/how-to-fix-err_ssl_version_interference-on-chrome/ Question Issue: How to fi ...