Mini2440学习笔记(二)——GPIO
2015-06-08 17:48
465 查看
硬件连接:
Mini2440有四个LED,使用的管脚是GPB5到GPB8,当管脚输出低电平时,led亮;六个按键使用的管脚是GPG0、GPG3、GPG5、GPG6、GPG7、GPG11,按下按键时,管脚是低电平状态。GPIO寄存器:
GPXCON:每两位配置一个管脚,00为输入,01为输出;GPXDAT:端口的数据寄存器,每一位表示对应管脚的状态,0为低电平,1为高电平;
GPXUP:设置管脚的上拉电阻,每一位对应一个管脚,0为使能,1为禁止。
[c-sharp]
view plaincopy
#ifndef S3c2440A_H
#define S3C2440A_H
/*
* GPIO Register
*/
//GPB
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
#define GPBUP (*(volatile unsigned long *)0x56000018)
//GPG
#define GPGCON (*(volatile unsigned long *)0x56000060)
#define GPGDAT (*(volatile unsigned long *)0x56000064)
#define GPGUP (*(volatile unsigned long *)0x56000068)
#endif
程序:
使用按键控制LED的亮灭,Key1~Key6非别表示数字1~6,每个LED代表一个二进制位,例如,当按下Key3时,LED1和LED2亮,表示二进制的0011。该程序可下载到内部4K-ROM中运行。[c-sharp]
view plaincopy
@******************************************************************************
@ File:init.S
@ 功能:通过它转入C程序
@******************************************************************************
.text
.global _start
_start:
ldr r0, =0x53000000 @ WATCHDOG寄存器地址
mov r1, #0x0
str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
bl main @ 调用C程序中的main函数
halt_loop:
b halt_loop
[cpp]
view plaincopy
/*
* gpio.c
* 用按键控制LED
* 六个按键Key1~Key6,四个LED
*/
#include "s3c2440a.h"
int main(void)
{
unsigned long key=0;
unsigned long led=0;
//led
GPBCON &= (~(0xff<<10));
GPBCON |= (0x55<<10); //将GPB5~GPB8的管脚设为输出
GPBUP &= (~(0xf<<5));
GPBUP |= (0xf<<5); //禁止GPB5~GPB8的上拉电阻
//key
GPGCON &= ~((3<<0)|(3<<6)|(3<<10)|(3<<12)|(3<<14)|(3<<22)); //将GPG0、3、5、6、7、11设为输入
GPGUP |= ((1<<0)|(1<<3)|(1<<5)|(1<<6)|(1<<7)|(1<<11)); //禁止上拉
while(1)
{
key = GPGDAT; //读取按键的状态
if(!(key & (1<<0))) //Key1
{
GPBDAT &= (~(0xf<<5));
GPBDAT |= ((0xf-1)<<5);
}
if(!(key & (1<<3))) //Key2
{
GPBDAT &= (~(0xf<<5));
GPBDAT |= ((0xf-2)<<5);
}
if(!(key & (1<<5))) //Key3
{
GPBDAT &= (~(0xf<<5));
GPBDAT |= ((0xf-3)<<5);
}
if(!(key & (1<<6))) //Key4
{
GPBDAT &= (~(0xf<<5));
GPBDAT |= ((0xf-4)<<5);
}
if(!(key & (1<<7))) //Key5
{
GPBDAT &= (~(0xf<<5));
GPBDAT |= ((0xf-5)<<5);
}
if(!(key & (1<<11))) //Key6
{
GPBDAT &= (~(0xf<<5));
GPBDAT |= ((0xf-6)<<5);
}
}
return 0;
}
Makefile:
[c-sharp]
view plaincopy
all:init.S gpio.c
arm-elf-gcc -g -c -o init.o init.S
arm-elf-gcc -g -c -o gpio.o gpio.c
arm-elf-ld -Tgpio.lds -g init.o gpio.o -o gpio_elf
arm-elf-objcopy -O binary -S gpio_elf gpio.bin
arm-elf-objdump -D -m arm gpio_elf > gpio.dis
clean:
rm -f gpio_elf gpio.bin gpio.dis *.o
相关文章推荐
- Linux socket 初步
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区
- Linux VS Unix:Linux欲一统天下 Unix不死
- linux下设定环境变量
- Linux下修改MySQL编码的方法