前言html
電路原理在文章http://www.cnblogs.com/lknlfy/p/3583806.html中已經說明,兩個LED的原理圖是同樣的。要使兩個LED交替閃爍,只須要在點亮藍色LED,熄滅綠色LED以後延時一段時間,而後再點亮綠色LED,熄滅藍色LED,延時一段時間,如此不斷循環便可,過程如圖1所示。linux
圖1 LED交替閃爍流程圖工具
1、目的oop
經過編寫裸機程序,使板載的兩個LED交替閃爍。spa
2、源代碼說明3d
程序比較簡單,已給出詳細註釋,直接看代碼好了,以下所示:code
1 /* 2 * (C) Copyright 2014 Conan Liang <lknlfy@163.com> 3 * 4 * two leds on Cubieboard2 flashing alternately 5 * 6 */ 7 8 /* GPIO reg addr */ 9 #define SUNXI_PIO_BASE 0x01C20800 10 #define SUNXI_PIO_PH_CFG2_BASE (SUNXI_PIO_BASE + 0x104) 11 #define SUNXI_PIO_PH_DAT_BASE (SUNXI_PIO_BASE + 0x10C) 12 13 /* global entry point */ 14 .globl _start 15 _start: b reset 16 17 reset: 18 ldr r0, =SUNXI_PIO_PH_CFG2_BASE 19 /* before write, read the reg value into r1*/ 20 ldr r1, [r0] 21 /* blue led is connected to PH21, green led is connected to PH20 */ 22 ldr r2, =((0xf << 20) | (0xf << 16)) 23 mvn r3, r2 24 /* clear 4 bits for PH21 & PH20*/ 25 and r1, r1, r3 26 /* set PH21 & PH20 for output function */ 27 orr r1, r1, #((0x1 << 20) | (0x1 << 16)) 28 str r1, [r0] 29 30 ldr r0, =SUNXI_PIO_PH_DAT_BASE 31 loop: 32 /* read the PH data reg */ 33 ldr r1, [r0] 34 /* clear PH.20(green led off) */ 35 ldr r2, =(1 << 20) 36 mvn r3, r2 37 and r1, r1, r3 38 /* set PH.21(blue led on) */ 39 orr r1, r1, #(1 << 21) 40 str r1, [r0] 41 42 bl delay 43 44 /* read the PH data reg */ 45 ldr r1, [r0] 46 /* clear PH.21(blue led off) */ 47 ldr r2, =(1 << 21) 48 mvn r3, r2 49 and r1, r1, r3 50 /* set PH.20(green led on) */ 51 orr r1, r1, #(1 << 20) 52 str r1, [r0] 53 54 bl delay 55 b loop 56 /* never reach */ 57 f: 58 b f 59 60 /* inaccurate delay */ 61 delay: 62 mov r5, #0 63 ldr r4, =0x3ffff 64 d: 65 sub r4, r4, #1 66 cmp r5, r4 67 bne d 68 mov pc, lr
3、驗證htm
使用arm-linux-gnueabihf工具編譯後生成led2.b文件,再使用mksunxiboot工具在led2.b文件前面加上一個頭部,最終生成led2.bin文件,使用如下命令將led2.bin文件燒寫到TF中:blog
#sudo dd if=./led2.bin of=/dev/sdb bs=1024 seek=8圖片
將TF卡插入Cubieboard2,上電便可看到兩個LED交替閃爍。效果很差用圖片展現,所以就不上圖了。