实验 CC2530平台上GPIO组件的TinyOS编程

实验目的:

  1. 加深和巩固学生对于TinyOS编程方法的理解和掌握
  2. 让学生理解和掌握CC2530GPIO及外部中断,及其TinyOS编程方法
  3. 学生通过本实验能够初步的了解和掌握TinyOS编程的整个过程
  4. 高学生的上机和编程过程中处理具体问题的能力

实验要求:

  1. 实验要求自己独立的完成
  2. 编写和调试过程中出现的问题记录,并事后总结到报告中
  3. 实验程序调试完成后, 用给定的平台进行测试,由老师检查测试结果,并给予相应的成绩
  4. 实验完成后,要上交实验报告

实验内容:

  1. 开发一个新的应用,实现用一个按键对两个LED的控制。要求当按键按下时,LED1闪烁,按键松开时,LED1停止闪烁且关闭,LED2状态切换。以下述顺序完成这个新应用的开发。
    1. 首先采用轮询的方法实现上述功能;
    2. 然后采用外部中断的方法实现上述功能。
  2. 在实验报告中分别给出上述两个阶段的源码

实验代码:

(1)配置文件Test GPIOC.nc

 

configuration TestGPIOC

{ }

implementation

{

components MainC;

components TestGPIOM as App;

 

App.Boot->MainC.Boot;

//CC2530 GPIO组件

components HplCC2530GeneralIOC as GPIO;

App.OkKey->GPIO.P0_Port[1];

 

 

App.Led0->GPIO.P1_Port[1];

 

 

App.Led1->GPIO.P1_Port[0];

//定时器组件

components new TimerMilliC() as Timer0;

App.Timer0->Timer0;

}

(2)模块文件TestGPIOM.nc

 

module TestGPIOM

{

uses interface Boot;

uses interface Timer<TMilli> as Timer0; //定时器

uses interface GeneralIO as OkKey; //GPIO接口

uses interface GeneralIO as Led0;

uses interface GeneralIO as Led1;

}

 

implementation

{

uint8_t OkValue;            //键值变量

enum {NoKey,KeyDown,KeyUp};//按键状态

uint8_t OkState;           //按键状态变量

 

 

task void proKey() {}

 

event void Boot.booted()

{

call OkKey.makeInput(); //设置为输入

call Led0.makeOutput(); //设置为输出

call Led1.makeOutput(); //设置为输出

call Led0.clr(); //熄灭LED

call Led1.clr();

OkState=NoKey;

OkValue=1;

call Timer0.startPeriodic(100); //定时100ms

}

 

 

event void Timer0.fired()

{

OkValue=call OkKey.get();//获取键值

switch(OkState)

{

case NoKey:

if(OkValue==0)

OkState=KeyDown;

break;

case KeyDown:

if(OkValue==1)

OkState=KeyUp;

else

call Led0.toggle();//切换LED状态

break;

case KeyUp:

if(OkValue==1)

{

OkState=NoKey;

call Led1.toggle();

}

else

OkState=KeyDown;

break;

}

}

}

(3)makefile 编译文件

COMPONENT=TestGPIOC

include $(MAKERULES)

实验环境:

  1. 上位机操作系统为WindowsXP,在Cygwin环境下编译

2. 集成开发环境为Notepad++ 

 

实验报告人:木舟 报告时间2018.11.16