源码源自原子哥
1.如下为.s汇编源码
1 .global _start @全局标号 2 3 _start: 4 /* 使能所有外设时钟*/ 5 ldr r0, =0x020c4068 @CCGR0 6 ldr r1, =0xffffffff @要向CCGR0写入的数据 7 str r1, [r0] @将0xffffffff写入到CCGR0中 8 9 ldr r0, =0x020c406c @CCGR1 10 str r1, [r0] 11 12 ldr r0, =0x020c4070 @CCGR2 13 str r1, [r0] 14 15 ldr r0, =0x020c4074 @CCGR3 16 str r1, [r0] 17 18 ldr r0, =0x020c4078 @CCGR4 19 str r1, [r0] 20 21 ldr r0, =0x020c407c @CCGR5 22 str r1, [r0] 23 24 ldr r0, =0x020c4080 @CCGR6 25 str r1, [r0] 26 /*配置GPIO1_IO03 PIN的复用为GPIO, 27 *设置IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03=5 28 *IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03地址为0X020E0068 29 */ 30 ldr r0, =0x020e0068 @IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 31 ldr r1, =0x00000005 @要写入的数据 32 str r1, [r0] @将0x5写入到IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03中 33 34 35 /*配置GPIO1_IO03的电气属性,也就是寄存器: 36 *IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 37 *这个寄存器地址为0X020E02F4 38 *bit0 0 低速率 39 *bit5:3 110 R0/6驱动能力 40 *bit7:6 10 100MHz速度 41 *bit11 0 关闭开漏输出 42 *bit12 1 使能pull/keeper 43 *bit13 0 keeper 44 *bit15:14 00 100K下拉 45 *bit16 0 关闭hys 46 */ 47 ldr r0, =0x020e02f4 48 ldr r1, =0x10b0 49 str r1, [r0] 50 /*设置GPIO 51 *设置GPIO1_GDIR寄存器,设置GPIO1_GPIO03为输出 52 *GPIO1_GDIR寄存器的地址为0x0209c004,设置GPIO1_GDIR寄存器bit3为1 53 *也就是设置GPIO1_IO03为输出 54 */ 55 ldr r0, =0x0209c004 56 ldr r1, =0x8 57 str r1, [r0] 58 /*打开LED,也就是设置GPIO_IO03为0 59 *GPIO1_DR寄存器地址为0x0209c000 60 */ 61 ldr r0, =0x0209c000 62 ldr r1, =0 63 str r1, [r0] 64 65 loop: 66 b loop
2.生成.o编译文件
终端使用 arm-linux-gnueabihf-gcc -g -c leds.s -o led.o 命令生成.o文件。
3.生成.elf链接文件
终端使用 arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf 生成.elf文件。
4.生成.bin文件
终端使用 arm-linux-gnueabihf-objcopy -O binary -g -S led.elf led.bin 生成.bin文件。
根据2,3,4命令,可以编写Makefile如下:
led.bin:leds.s arm-linux-gnueabihf-gcc -g -c leds.s -o led.o arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin clean: rm -rf *.o led.bin led.elf