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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值