Contiki-CC2538-AD/GPIO/LED驅動程序

正在學習contiki操作系統,用了一塊CC2538的片子來實驗,環境是直接使用的Contiki提供的虛擬機,這個程序不講述關於contiki,直接闡述如何編寫一個使LED閃爍,將一個管腳電平置位,並且讀取一路ADC通道的值

1.準備工作

我使用的是6lbr,這裏和使用Contiki-3.0 沒影響。
首先找到我們的例子程序

/home/user/6lbr/examples/cc2538dk

路徑你們就將6lbr變成Contiki-3.0就好。
首先我們新建一個test.c文件,用來寫我們的例程。然後進入到Makefile裏面,做如下修改,就是在後面加上了test。

CONTIKI_PROJECT = cc2538-demo test   

好了,準備工作就這麼點,由於是使用了CC2538的例程,平臺也不用指定,當然如果你使用其他平臺,就是在make後面加上TARGET=XXX就好,也可以在這個 Makefile.target 文件裏做修改。

2 頭文件

#include "contiki.h"
#include "dev/leds.h"
#include "dev/adc.h"
#include "dev/gpio.h"

#include <stdio.h>

adc和gpio的文件放在了cpu/cc2538/dev裏面,而leds.h則放在了core/dev裏面,需要啥功能就去你們找就好了。 - -|
這裏寫圖片描述

這裏寫圖片描述

3 全局量、聲明、自啓動

就是定義了一些全局變量,然後聲明瞭3個線程,讓他們開機自動啓動運行。

static struct etimer timera;//線程定時器
static struct etimer timerb;
static struct etimer timer_adc;
static int adcval= 0;//保存ADC讀取的原始值

//申明
PROCESS(hello,"Hello");
PROCESS(blink,"Blink");
PROCESS(getadc,"Getadc");


//自啓動
AUTOSTART_PROCESSES(&hello,&blink,&getadc);

4 串口輸出線程

//線程1:用於串口輸出
PROCESS_THREAD(hello,ev,data)
{
    PROCESS_BEGIN();
    //延時2S,兩秒後會發送一個超時事件
    etimer_set(&timera,CLOCK_SECOND*2);

    //使用該線程測試管腳
    //這裏是用來測試gpio封裝的函數是不是能用
    //這裏的0X04表示PA3管腳,就是第三位爲1(0000 0100)
    //GPIO_SET_PIN(GPIO_A_BASE,0x04);//拉高PA3管腳
    GPIO_SET_OUTPUT(GPIO_A_BASE,0x08);
    GPIO_CLR_PIN(GPIO_A_BASE,0X08);

    while(1)
    {
        //等待超時時間發生
        PROCESS_WAIT_EVENT();
        if(ev == PROCESS_EVENT_TIMER)
        {
            printf("ADC : %d",adcval);
            //重新開始計數
            etimer_reset(&timera);

        }
    }
    PROCESS_END();
}

管腳控制的那些函數在gpio.c裏面可以看到
例如下圖:
這裏寫圖片描述

5 LED閃爍線程

同樣,這裏也是使用了leds.c裏面封裝好了的函數

//線程2:用於LED閃爍
PROCESS_THREAD(blink,ev,data)
{
    PROCESS_BEGIN();
    while(1)
    {
        etimer_set(&timerb,CLOCK_SECOND);
        PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_TIMER);
        leds_toggle(LEDS_ALL);//翻轉電平
        etimer_reset(&timerb);
    }
    PROCESS_END();
}

函數也可以在core/dev/leds.c中看到,隨機截圖如下:
這裏寫圖片描述

6 ADC讀取線程

使用了cpu/cc2538/dev/adc.c中封裝的函數。

//線程3:用於AD讀取
PROCESS_THREAD(getadc,ev,data)
{
    PROCESS_BEGIN();
    adc_init(); //ad初始化
    while(1)
    {
        etimer_set(&timer_adc,CLOCK_SECOND);
        PROCESS_WAIT_EVENT_UNTIL(ev ==PROCESS_EVENT_TIMER);
       //讀取ad值 使用了PA2通道
       adcval = adc_get(SOC_ADC_ADCCON_CH_AIN2,SOC_ADC_ADCCON_REF_INT,SOC_ADC_ADCCON_DIV_512); 
       etimer_reset(&timer_adc);
    }
    PROCESS_END();
}

SOC_ADC_ADCCON_CH_AIN2這些定義可以在同文件夾下的soc-adc.h中看到定義。
這裏寫圖片描述

7 下載運行

將目前返回到

~/6lbr/examples/cc2538dk$ 

就是我們建立test.c的那個文件夾下。
然後執行

make test

他就會自動編譯,沒有錯誤的話就會在當前文件夾下生成一個test.hex
將他複製到windows下,打開Flash Programmer 2,插上你的JTAG下載器。左邊選擇芯片,右邊選擇文件,打上那三個勾。點“播放”。這些就沒啥好說的了。

剛學習,寫的一個簡單例程,在這兒記錄一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章