微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM学习笔记--GPIO接口

ARM学习笔记--GPIO接口

时间:11-10 来源:互联网 点击:

-o crt0.o crt0.S

arm-linux-gcc -g -c -o led_on_c.o led_on_c.c

arm-linux-ld -Ttext 0x0000000 -g crt0.o led_on_c.o -o led_on_c_elf

arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin

arm-linux-objdump -D -m arm led_on_c_elf > led_on_c.dis

clean:

rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o

分别汇编crt0.S和led_on_c.c

连接目标到led_on_c_elf,代码段起始地址位0x00000000

转换ELF格式到二进制led_on_c.bin

最后转换结果为汇编码方便查看

3、测试程序

在先前搭建的编译环境中进入代码目录

#make

得到的bin文件,在win中使用dnw下载到开发板,设置串口波特率,对应端口,8N1,下载地址0x00000000

开关拨到nor flash,打开电源,出现菜单以后,选择a

然后选择USB PORT-transmit/restore,选择编译好的bin文件

然后开关拨到nand启动,效果如下:(设置LED1和LED4亮)

4、使用按键来控制LED

K1-K6如上图对应GPG,我们使用K1-K4操作LED1-LED4

@******************************************************************************

@ File:crt0.S

@ 功能:通过它转入C程序

@******************************************************************************

.text

.global _start

_start:

ldr r0, =0x56000010 @ WATCHDOG寄存器地址

mov r1, #0x0

str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启

ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K,这4k是steppingstone,后面会介绍

@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K

bl main @ 调用C程序中的main函数

halt_loop:

b halt_loop

下面是key_led.c文件

#define GPBCON (*(volatile unsigned long *)0x56000010)

#define GPBDAT (*(volatile unsigned long *)0x56000014)

#define GPGCON (*(volatile unsigned long *)0x56000060)

#define GPGDAT (*(volatile unsigned long *)0x56000064)

/*

* LED1-4对应GPB5、GPB6、GPB7、GPB8

*/

#define GPB5_out (1<(5*2))

#define GPB6_out (1<(6*2))

#define GPB7_out (1<(7*2))

#define GPB8_out (1<(8*2))

/*

* K1-K4对应GPG0、GPG3、GPG5、GPG6

*/

#define GPG7_in ~(3<(6*2))

#define GPG6_in ~(3<(5*2))

#define GPG3_in ~(3<(3*2))

#define GPG0_in ~(3<(0*2))

int main()

{

unsigned long dwDat;

// LED1-LED4对应的4根引脚设为输出

GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out ;

// K1-K4对应的2根引脚设为输入

GPGCON = GPG0_in & GPG3_in & GPG6_in & GPG7_in ;

while(1){

//若Kn为0(表示按下),则令LEDn为0(表示点亮)

dwDat = GPGDAT; // 读取GPG管脚电平状态

if (dwDat & (1<0)) // K1没有按下

GPBDAT |= (1<5); // LED1熄灭

else

GPBDAT &= ~(1<5); // LED1点亮

if (dwDat & (1<3)) // K2没有按下

GPBDAT |= (1<6); // LED2熄灭

else

GPBDAT &= ~(1<6); // LED2点亮

if (dwDat & (1<5)) // K3没有按下

GPBDAT |= (1<7); // LED3熄灭

else

GPBDAT &= ~(1<7); // LED3点亮

if (dwDat & (1<6)) // K4没有按下

GPBDAT |= (1<8); // LED4熄灭

else

GPBDAT &= ~(1<8); // LED4点亮

}

return 0;

}

最后是Makefile

key_led.bin : crt0.S key_led.c

arm-linux-gcc -g -c -o crt0.o crt0.S

arm-linux-gcc -g -c -o key_led.o key_led.c

arm-linux-ld -Ttext 0x0000000 -g crt0.o key_led.o -o key_led_elf

arm-linux-objcopy -O binary -S key_led_elf key_led.bin

arm-linux-objdump -D -m arm key_led_elf > key_led.dis

clean:

rm -f key_led.dis key_led.bin key_led_elf *.o


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top