感知层实验编程实验二

南昌航空大学实验报告

011017

 

课程名称:  感知层编程实验  实验名称:电源管理及休眠

班级学号:        姓名:          同组人:                           

指导教师评定:                                      签名:              

实验 电源管理及休眠

实验目的:

  1. 加深和巩固学生对于CC2530平台的电源管理及休眠等概念的理解
  2. 学生通过本实验了解和掌握电源管理、休眠编程方法
  3. 高学生的上机和编程过程中处理具体问题的能力

实验要求:

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

实验内容:

  1. 在实验一的基础上加入休眠功能。
  2. 实验步骤与现象:按键S1,控制LED1LED2交替闪烁在若干秒后系统进入休眠直到再次按下S1LED1LED2交替闪烁。如此往复。

实验环境:

集成开发环境为IAR

实验过程

经分析这次代码主要是对电源管理以及休眠程序书写的考察,参照书上以及第一次实验所写的代码,在IAR上写好代码,debug调试好,再接上cc2530板子烧入,观察实验板亮灯情况。

实验代码

#include<ioCC2530.h>

typedef unsigned int uint;

typedef unsigned char uchar;

#define LED1 P1_0 //定义LED1P1_0口控制

#define LED2 P1_1 //定义LED2P1_1口控制

#define KEY1 P0_1        //定义KEY1P0_1口控制

 

void Delay(int n); //延时

void InitKEY(void);            //初始化KEY控制IO口函数

void SysPowerMode(uchar sel);//系统工作模式选择函数

 

void Delay(int n)             //1ms

{

  int i,j;

   for(i=0;i<n;i++)

   for(j=0;j<535;j++);

}

 

void InitKEY(void)

{

  IEN1 |= 0x20; //端口0的总中断使能

  P0IEN |= 0x02; //P0_1口的中断使能,即KEY1的按键中断

  //PICTL |= 0x00; //端口中断触发延,默认所有端口都是上升沿

  PICTL |= 0x01; //设置成端口0下降沿触发

  

  IEN0 |= 0x80; //总中断开启

  P0IFG = 0x00; //清除端口0的中断状态标志

}

 

void main(void)

{

  P1DIR |= 0x03; //P1_0P1_1定义为输出

  LED1 = 1; //LED0灯初始化为关

  LED2 = 1; //LED1灯初始化为关

  InitKEY();

  SysPowerMode(3);

  for(int i = 0;;i++)

    {

        if(i%2==0)

        {

        LED2 = 1;

LED1 = !LED1;

        }

        else

        {

        LED1 = 1;

        LED2 = !LED2;

        }

        Delay(1000);

        if(i==10)

        SysPowerMode(3);

    }

}

 

#pragma vector = P0INT_VECTOR //P0中断向量,系统唤醒

 __interrupt void P0_ISR(void)

{

  if(0x02 == (P0IFG & 0x02)) //判断一下是否是P0_1即按键1的中断请求

  {

    SysPowerMode(4);

  }

 

  IRCON &= ~0x20; //清除端口0的总中断状态标志

  P0IFG &= ~0x02; //清除具体端口P0_1的中断状态标志

}

 

void SysPowerMode(uchar mode){

    if(mode < 4){

      SLEEPCMD &= ~0x03;

      SLEEPCMD |= mode;

      PCON = 0x01;      //进入休眠

    }else{

      PCON = 0x00;      //系统唤醒

    }

}

 

实验结果

按下按键key1LED1LED2灯交替闪烁,时间间隔为1s。交替闪烁十次之后进入休眠状态。再次按下key1,循环上面状态。

 

实验总结

最开始写代码的时候我向上次实验一样,把控制灯亮灭的情况放在中断函数里面,但发现这次实验是要多次使用到中断向量进行系统唤醒,我便调整了代码,将灯控制的代码挪到了主函数。

通过本次实验加深和巩固了我对于CC2530平台的电源管理及休眠等概念的理解,了解和掌握电源管理、休眠编程方法,期间出现了许多问题,但好在书上有一个差不多的样例加上是基于第一次实验上的改进,所以还是很快的得到解决,另外每次的附录都对我们的实验有很大的帮助。

附录:

在上一次实验的基础上,增加休眠功能!采用PM3深度休眠。利用按键的外部中断唤醒系统。

 

PCON:

 

 

 

 

 

SLEEPCMD:

setPowerMode:

 

 

注意事项:

1、需要开启中断

2、setPowerMode的调用位置

 

posted @ 2022-03-14 23:38  安良  阅读(541)  评论(0)    收藏  举报