Contiki-CC2538-AD/GPIO/LED驱动程序

来源:互联网 发布:淘宝卖游戏币赚钱吗 编辑:程序博客网 时间:2024/05/19 15:43

正在学习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下载器。左边选择芯片,右边选择文件,打上那三个勾。点“播放”。这些就没啥好说的了。

刚学习,写的一个简单例程,在这儿记录一下。

0 0