Mini2440学习笔记(二)——GPIO
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Mini2440学习笔记(二)——GPIO
硬件连接:
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
1.#ifndef S3c2440A_H
2.#define S3C2440A_H
3.
4./*
5.* GPIO Register
6.*/
7.//GPB
8.#define GPBCON (*(volatile unsigned long *)0x56000010)
9.#define GPBDAT (*(volatile unsigned long *)0x56000014)
10.#define GPBUP (*(volatile unsigned long *)0x5600001 8)
11.//GPG
12.#define GPGCON (*(volatile unsigned long *)0x560000 60)
13.#define GPGDAT (*(volatile unsigned long *)0x560000 64)
14.#define GPGUP (*(volatile unsigned long *)0x5600006 8)
15.
16.#endif
程序:
使用按键控制LED的亮灭,Key1~Key6非别表示数字1~6,每个LED代表一个二进制位,例如,当按下Key3时,LED1和LED2亮,表示二进制的0011。
该程序可下载到内部4K-ROM中运行。
[c-sharp]view plaincopy
1.@********************************************************** ********************
2.@ File:init.S
3.@ 功能:通过它转入C程序
4.@********************************************************** ********************
5.
6..text
7..global _start
8._start:
9.ldr r0, =0x53000000 @ WATCHDOG寄存器地址
10.mov r1, #0x0
11.str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
12.
13.ldr sp, =1024*4 @ 设置堆栈,注意:不能大于
4k, 因为现在可用的内存只有4K
14.@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
15.bl main @ 调用C程序中的main函数
16.halt_loop:
17. b halt_loop
[cpp]view plaincopy
1./*
2.* gpio.c
3.* 用按键控制LED
4.* 六个按键Key1~Key6,四个LED
5.*/
6.#include "s3c2440a.h"
7.
8.int main(void)
9.{
10.unsigned long key=0;
11.unsigned long led=0;
12.
13.//led
14.GPBCON &= (~(0xff<<10));
15.GPBCON |= (0x55<<10); //将GPB5~GPB8的管脚设为输出
16.GPBUP &= (~(0xf<<5));
17.GPBUP |= (0xf<<5); //禁止GPB5~GPB8的上拉电阻
18.
19.//key
20.GPGCON &= ~((3<<0)|(3<<6)|(3<<10)|(3<<12)|(3<< 14)|(3<<22)); //将GPG0、3、5、6、7、11设为输入
21.GPGUP |= ((1<<0)|(1<<3)|(1<<5)|(1<<6)|(1<<7)|(1<< 11)); //禁止上拉
22.
23.while(1)
24.{
25.key = GPGDAT; //读取按键的状态
26.if(!(key & (1<<0))) //Key1
27.{
28.GPBDAT &= (~(0xf<<5));
29.GPBDAT |= ((0xf-1)<<5);
30.}
31.if(!(key & (1<<3))) //Key2
32.{
33.GPBDAT &= (~(0xf<<5));
34.GPBDAT |= ((0xf-2)<<5);
35.}
36.if(!(key & (1<<5))) //Key3
37.{
38.GPBDAT &= (~(0xf<<5));
39.GPBDAT |= ((0xf-3)<<5);
40.}
41.if(!(key & (1<<6))) //Key4
42.{
43.GPBDAT &= (~(0xf<<5));
44.GPBDAT |= ((0xf-4)<<5);
45.}
46.if(!(key & (1<<7))) //Key5
47.{
48.GPBDAT &= (~(0xf<<5));
49.GPBDAT |= ((0xf-5)<<5);
50.}
51.if(!(key & (1<<11))) //Key6
52.{
53.GPBDAT &= (~(0xf<<5));
54.GPBDAT |= ((0xf-6)<<5);
55.}
56.}
57.
58.return 0;
59.}
Makefile:
[c-sharp]view plaincopy
1.all:init.S gpio.c
2.arm-elf-gcc -g -c -o init.o init.S
3.arm-elf-gcc -g -c -o gpio.o gpio.c
4.arm-elf-ld -Tgpio.lds -g init.o gpio.o -o gpio_elf
5.arm-elf-objcopy -O binary -S gpio_elf gpio.bin
6.arm-elf-objdump -D -m arm gpio_elf > gpio.dis
7.clean:
8.rm -f gpio_elf gpio.bin gpio.dis *.o。