前言
CUbieboard2板载两个LED,一个绿色的,一个蓝色的,其中绿色LED通过三极管与PH20管脚连接,蓝色LED通过三极管与PH21管脚连接,这里只以蓝色LED为例,电路原理图如图1和图2所示。
图1 LED所使用的管脚
图2 LED与三极管连接图
由此可知,当PH21输出高电平时,三极管处于导通状态,从而蓝色LED会被点亮;当PH21输出低电平时,三极管处于截止状态,蓝色LED熄灭。
一、目的
编写第一个裸机程序,点亮板载的蓝色LED。
二、源代码说明
程序很简单,已给出详细注释,直接看代码好了,如下所示:
1 /* 2 * (C) Copyright 2014 Conan Liang <lknlfy@163.com> 3 * 4 * a very simple source to set the blue led on for Cubieboard2. 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 */ 22 ldr r2, =(0xf << 20) 23 mvn r3, r2 24 /* clear 4 bits for PH21*/ 25 and r1, r1, r3 26 /* set PH21 for output function */ 27 orr r1, r1, #(0x1 << 20) 28 str r1, [r0] 29 30 /* set PH21 output 1(high value), so the blue led is on */ 31 ldr r0, =SUNXI_PIO_PH_DAT_BASE 32 ldr r1, [r0] 33 orr r1, r1, #(1 << 21) 34 str r1, [r0] 35 loop: 36 b loop
三、验证
使用arm-linux-gnueabihf工具编译后生成led.b文件,再使用mksunxiboot工具在led.b文件前面加上一个头部,最终生成led.bin文件,使用以下命令将led.bin文件烧写到TF中:
#sudo dd if=./led.bin of=/dev/sdb bs=1024 seek=8
将TF卡插入Cubieboard2,上电即可看到蓝色LED被点亮。效果如图3所示。
图3 效果图