TQ210裸机编程(2)——LED流水灯

时间:2023-03-09 14:31:20
TQ210裸机编程(2)——LED流水灯

两个文件start.S和led.c

start.S

.global _start                @声明一个全局的标号
_start:
    bl main                    @跳转到C函数去执行
halt:
    b halt                    @死循环

led.c

#define GPC0CON        *((volatile unsigned int *)0xE0200060)
#define GPC0DAT        *((volatile unsigned int *)0xE0200064)

void delay(volatile unsigned int t)
{
    volatile unsigned int t2 = 0xFFFF;
    while (t--)
        for (; t2; t2--);
}

int main()
{
    int toggle = 0;
    GPC0CON &= ~(0xFF << 12);
    GPC0CON |= 0x11 << 12;    // 配置GPC0_3和GPC0_4为输出
    
    while (1)
    {
        GPC0DAT &= ~(0x3 << 3);        // 熄灭LED1和LED2
        
        if (toggle)
            GPC0DAT |= 1 << 3;        // 点亮LED1
        else
            GPC0DAT |= 1 << 4;        // 点亮LED2
        
        toggle = !toggle;
        delay(0x50000);
    }
    
    return 0;
}

Makefile

led.bin: start.o led.o
    arm-linux-ld -Ttext 0x20000000 -o led.elf $^
    arm-linux-objcopy -O binary led.elf $@
    arm-linux-objdump -D led.elf > led.dis
    
led.o : led.c
    arm-linux-gcc -c $< -o $@
start.o : start.S
    arm-linux-gcc -c $< -o $@
    
clean:
    rm *.o *.elf *.bin *.dis