韦东山_裸板程序_GPIO实验_KEY_LED_C

张开发
2026/4/29 17:29:06 15 分钟阅读

分享文章

韦东山_裸板程序_GPIO实验_KEY_LED_C
按键原理图按键默认电平为高按下为低电平EINT0,EINT2,EINT11对应GPF0GPF2和GPG3芯片手册板子代码crt0.S****************************************************************************** Filecrt0.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_loopkey_led.c#define GPFCON (*(volatile unsigned long *)0x56000050) #define GPFDAT (*(volatile unsigned long *)0x56000054) #define GPGCON (*(volatile unsigned long *)0x56000060) #define GPGDAT (*(volatile unsigned long *)0x56000064) /* * LED1,LED2,LED4对应GPF4、GPF5、GPF6 */ #define GPF4_out (1(4*2)) #define GPF5_out (1(5*2)) #define GPF6_out (1(6*2)) #define GPF4_msk (3(4*2)) #define GPF5_msk (3(5*2)) #define GPF6_msk (3(6*2)) /* * S2,S3,S4对应GPF0、GPF2、GPG3 */ #define GPF0_in (0(0*2)) #define GPF2_in (0(2*2)) #define GPG3_in (0(3*2)) #define GPF0_msk (3(0*2)) #define GPF2_msk (3(2*2)) #define GPG3_msk (3(3*2)) int main() { unsigned long dwDat; // LED1,LED2,LED4对应的3根引脚设为输出 GPFCON ~(GPF4_msk | GPF5_msk | GPF6_msk); GPFCON | GPF4_out | GPF5_out | GPF6_out; // S2,S3对应的2根引脚设为输入 GPFCON ~(GPF0_msk | GPF2_msk); GPFCON | GPF0_in | GPF2_in; // S4对应的引脚设为输入 GPGCON ~GPG3_msk; GPGCON | GPG3_in; while(1){ //若Kn为0(表示按下)则令LEDn为0(表示点亮) dwDat GPFDAT; // 读取GPF管脚电平状态 if (dwDat (10)) // S2没有按下 GPFDAT | (14); // LED1熄灭 else GPFDAT ~(14); // LED1点亮 if (dwDat (12)) // S3没有按下 GPFDAT | (15); // LED2熄灭 else GPFDAT ~(15); // LED2点亮 dwDat GPGDAT; // 读取GPG管脚电平状态 if (dwDat (13)) // S4没有按下 GPFDAT | (16); // LED3熄灭 else GPFDAT ~(16); // LED3点亮 } return 0; }Makefilekey_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

更多文章