Cubieboard2裸機開發之(三)C語言操做LED

前言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同時閃爍。效果很差用圖片展現,所以就不上圖了。

相關文章
相關標籤/搜索