前言linux
前面經過彙編語言點亮LED,代碼雖然簡單,但並非很直觀。此次使用熟悉的C語言來控制LED,可是須要注意的地方有兩點,第一,要想使用C語言,首先須要在調用C語言代碼以前設置好堆棧;第二,調用C語言函數時,是須要相對跳轉仍是絕對地址跳轉,仍是二者均可以,這就須要知道代碼是否運行在連接地址處,是位置無關的仍是位置有關的。從前面分析能夠知道,咱們的代碼是運行在連接地址處的,所以能夠用直接進行函數的調用。函數
1、目的工具
使用C語言的方式操做板載LED。oop
2、源代碼說明spa
start.S文件。首先禁止CPU的IRQ和FIQ,設置爲管理模式,而後設置堆棧指針,最後調用C語言的main函數。指針
1 /* 2 * (C) Copyright 2014 conan liang <lknlfy@163.com> 3 * 4 */ 5 6 /* global entry point */ 7 .globl _start 8 _start: b reset 9 10 reset: 11 /* disable IRQ & FIQ, set the cpu to SVC32 mode */ 12 mrs r0, cpsr 13 and r1, r0, #0x1f 14 teq r1, #0x1a 15 bicne r0, r0, #0x1f 16 orrne r0, r0, #0x13 17 orr r0, r0, #0xc0 18 msr cpsr, r0 19 /* setup stack, so we can call C code */ 20 ldr sp, =(1024 * 10) 21 /* call main function */ 22 bl main 23 loop: 24 b loop
main.c文件。首先初始化LED所在IO管腳,設置爲輸出功能,而且輸出低電平,即一開始兩個LED是熄滅的。code
1 #include "led.h" 2 3 /* just for test */ 4 static void delay(void) 5 { 6 unsigned int i; 7 8 for (i = 0; i < 50000; i++); 9 } 10 11 /* C code entry point */ 12 int main(void) 13 { 14 /* init PIO */ 15 led_init(); 16 17 while (1) { 18 /* two LEDs on */ 19 set_led_on(); 20 delay(); 21 /* two LEDs off */ 22 set_led_off(); 23 delay(); 24 } 25 26 return 0; 27 }
led.c文件。LED驅動程序,一個初始化函數,一個使兩個LED同時點亮函數,一個同時使兩個LED同時熄滅函數。blog
1 #include "led.h" 2 #include "io.h" 3 4 /* set two LEDs on */ 5 void set_led_on(void) 6 { 7 unsigned int tmp; 8 9 /* PH20 and PH21 output 1 */ 10 tmp = readl(PH_DAT); 11 tmp |= (0x1 << 20); 12 tmp |= (0x1 << 21); 13 writel(tmp, PH_DAT); 14 } 15 16 /* set two LEDs off */ 17 void set_led_off(void) 18 { 19 unsigned int tmp; 20 21 /* PH20 and PH21 output 0 */ 22 tmp = readl(PH_DAT); 23 tmp &= ~(0x1 << 20); 24 tmp &= ~(0x1 << 21); 25 writel(tmp, PH_DAT); 26 } 27 28 /* init PIO */ 29 void led_init(void) 30 { 31 unsigned int tmp; 32 33 /* set PH20 and PH21 output */ 34 tmp = readl(PH_CFG2); 35 tmp &= ~(0x7 << 16); 36 tmp &= ~(0x7 << 20); 37 tmp |= (0x1 << 16); 38 tmp |= (0x1 << 20); 39 writel(tmp, PH_CFG2); 40 /* set PH20 and PH21 output 0 */ 41 tmp = readl(PH_DAT); 42 tmp &= ~(0x1 << 20); 43 tmp &= ~(0x1 << 21); 44 writel(tmp, PH_DAT); 45 }
3、驗證圖片
使用arm-linux-gnueabihf工具編譯後生成led_c.b文件,再使用mksunxiboot工具在led_c.b文件前面加上一個頭部,最終生成led_c.bin文件,使用如下命令將led_c.bin文件燒寫到TF中:it
#sudo dd if=./led_c.bin of=/dev/sdb bs=1024 seek=8
將TF卡插入Cubieboard2,上電便可看到兩個LED同時閃爍。效果很差用圖片展現,所以就不上圖了。