사물 인터넷 시뮬레이션 디버깅 및 다운로드|CC254 기본 개발(일반 I/O)|독립 버튼 개발|길고 짧은 버튼 구현 아이디어|사물 인터넷의 Bluetooth 4.0 BLE 기본-연구 노트(4)

7. 시뮬레이션 디버깅 및 다운로드

시뮬레이션 디버깅 중 플래시 드라이버 설치
프로그램 시뮬레이션 디버깅 smartRF 플래시 프로그래머 소프트웨어와 결합하여 프로그램 다운로드 및 설정
실현

여기에 이미지 설명 삽입

F:\IOT\blud_prj\테스트\디버그\Exe
여기에 이미지 설명 삽입

CC2540 블루투스 장치의 IEEE 주소 얻기
여기에 이미지 설명 삽입

8. CC254 기본 개발(일반 I/O)

引自:CC2540数据手册
7.3범용 I/O 범용 I/O
로 사용될 때 핀은 3개의 8비트 포트인 포트 0, 포트 1 및 포트 2로 구성되며 PO, P1 및 P2.P0 및 P1은 완전한 8비트 너비의 포트인 반면 P2는 사용 가능한 비트가 5개뿐입니다. 모든 포트는 SFR 레지스터 P0, P1 및 P2를 통해 비트 및 바이트 주소 지정이 가능합니다. 각 포트 핀은 개별적으로 범용 l/o 또는 주변 장치 l/O로 작동합니다.
출력 구동 강도는 각각 20mA 출력 구동 강도를 갖는 2개의 높은 구동 출력인 P1.0 및 P1.1을 제외하고 모든 출력에서 ​​4mA입니다.
레지스터 PxSEL(여기서 x는 포트 번호 O-2)은 포트의 각 핀을 범용 I/O 핀 또는 주변 I/O 신호로 구성하는 데 사용됩니다. 기본적으로 재설정 후 모든 디지털 입력/출력 핀은 범용 입력 핀으로 구성됩니다.
포트 핀의 방향을 변경하려면 언제든지 레지스터 PxDIR을 사용하여 각 포트 핀을 입력 또는 출력으로 설정합니다. 따라서 PxDIR 내의 해당 비트를 1로 설정하면 해당 핀이 출력이 됩니다.
포트 레지스터 p0, P1 및 P2를 읽을 때 핀 구성에 관계없이 입력 핀의 논리 값이 반환됩니다. 이것은 읽기-수정-쓰기 명령 실행 중에는 적용되지 않습니다. 읽기-수정-쓰기 명령은 ANL,ORL,XRL,JBC,CPL,INC, DEC,DUNZ,MOV,CLR 및 SETB입니다.
포트 레지스터에서 작동하면 다음이 참입니다. 대상이 포트 레지스터 P0, P1 또는 P2의 개별 비트인 경우 핀의 값이 아닌 레지스터의 값을 읽고 수정하고 다시 기록합니다. 포트 레지스터.
입력으로 사용될 때 범용 I/O 포트 핀은 풀업, 풀다운 또는 3가지 상태의 작동 모드를 갖도록 구성할 수 있습니다. 기본적으로 재설정 후 입력은 풀업이 있는 입력으로 구성됩니다. 풀다운 기능을 사용하려면 PxINP 내의 해당 비트를 1로 설정해야 합니다. l0 포트 핀 P1.0 및 P1.1에는 풀업/풀다운 기능이 없습니다. 다음과 같이 구성된 핀에 유의하십시오.
주변 장치 I/O 신호는 주변 장치 기능이 입력인 경우에도 풀업/풀다운 기능이 없습니다. 전원 모드 PM1, PM2 및 PM3에서 I/O 핀은 I/O 모드 및 출력 값(해당하는 경우)을 유지합니다. PM1/PM2/PM3 입력 시 설정합니다.

범용 I/O로 사용되는 경우 핀은 PO, P1 및 P2로 표시되는 포트 0, 포트 1 및 포트 2의 3개의 8비트 포트를 형성할 수 있습니다. 그 중 PO와 P1은 완전한 8비트 포트인 반면 P2는 5비트만 사용할 수 있습니다. 모든 포트는 SFR 레지스터 PO, P1 및 P2를 통해 비트 주소 지정 및 바이트 주소 지정이 가능합니다. 각 포트 핀은 범용 vO 또는 외부 장치 LO로 개별적으로 프로그래밍할 수 있습니다.
각각 20mA 출력 드라이브 기능이 있는 2개의 하이 드라이브 출력 포트 P1_0 및 P1_1 외에도 모든 출력에는 4mA 드라이브 기능이 있습니다.
여기에 이미지 설명 삽입

PxSEL 레지스터(여기서 x는 포트의 레이블 0~2)는 포트의 각 핀을 범용 I/O 또는 외부 장치 I/O 신호로 설정하는 데 사용되며 기본적으로 사용됩니다. 리셋 후 모든 디지털 I/O 핀은 범용 입력 핀으로 설정됩니다.
언제든지 포트 핀의 방향을 변경하려면 레지스터 PxDIR을 사용하여 각 포트 핀을 입력 또는 출력으로 설정하십시오. 따라서 먼저 PxDIP의 인디케이터 비트를 1로 설정하고 해당 핀 포트를 출력으로 설정합니다.
여기에 이미지 설명 삽입

여기에 이미지 설명 삽입
포트 레지스터 P0, P1, P2의 값을 읽을 때 핀 구성에 관계없이 입력 핀의 논리 값이 반환됩니다. 이것은 읽기-수정-쓰기 명령 중에는 적용되지 않습니다. 읽기-수정-쓰기 명령은 ANL, ORL, XRL, JBC, CPL, NC, DEC, DNZ, MOV, CLR 및 SETB입니다. 포트 레지스터에서 작동할 때 다음이 참입니다. 대상이 포트 레지스터 PO, P1 또는 P2의 개별 비트인 경우 핀의 값이 아닌 레지스터의 값을 읽고 수정하고 씁니다. 포트 레지스터로 돌아갑니다.
입력으로 사용되는 경우 GPIO 포트 핀을 풀업, 풀다운 또는 3상태 작동 모드로 설정할 수 있습니다. 기본적으로 재설정 후 모든 포트는 풀업이 있는 입력으로 설정됩니다. 입력의 풀업 또는 풀다운 기능을 취소하려면 PxINP의 해당 비트를 I로 설정하고 I/O 포트 핀 P1.0 및 P1.1에는 풀업/풀다운 기능이 없습니다. 주변 I/O 신호로 구성된 핀에는 주변 기능이 입력인 경우에도 풀업/풀다운 기능이 없습니다.
여기에 이미지 설명 삽입

전원 모드 PM1, PM2 및 PM3의 I/O 핀은 PM1/PM2/PM3에 들어갈 때 설정된 I/O 모드 및 출력 값(사용 가능한 경우)을 유지합니다.

7.4 범용 I/O 인터럽트
입력으로 구성된 범용 I/O 핀을 사용하여 인터럽트를 생성할 수 있습니다. 외부 신호의 상승 또는 하강 에지에서 트리거하도록 인터럽트를 구성할 수 있습니다. 각 Po, P1 및 P2 포트에는 다음과 같이 IEN1-2 레지스터에 있는 포트 내의 모든 비트에 대해 공통적인 포트 인터럽트 활성화 비트가 있습니다.
IEN1.POIE: P0 인터럽트 활성화
IEN2.P1IE: P1 인터럽트 활성화
IEN2.P2IE: P2 인터럽트 인에이블
이러한 공통 인터럽트 인에이블 외에도 각 포트 내의 비트에는 SFR 레지스터 POIEN,,P1IEN 및 P2IEN에 위치한 개별 인터럽트 인에이블이 있습니다. 주변 장치 I/O 또는 범용 출력으로 구성된 I/O 핀도 인에이블될 때 인터럽트가 생성됩니다
.

l/0 핀 중 하나에서 인터럽트 조건이 발생하면 PO-P2 인터럽트 플래그 레지스터, PoIFG, P1IFG 또는 P2IFG 의 해당 인터럽트 상태 플래그가 1로 설정됩니다. 인터럽트 활성화 세트. 인터럽트가 서비스되면 해당 플래그에 0을 기록하여 인터럽트 상태 플래그가 지워집니다. 이 플래그는 CPU 포트 인터럽트 플래그(PxlF)를 지우기 전에 지워야 합니다.
인터럽트에 사용되는 SFR 레지스터는 이 섹션의 뒷부분에서 설명합니다. 레지스터는 다음과 같이 요약됩니다.
P0IEN: P0 인터럽트 활성화
P1IEN:P1 인터럽트 활성화·
P2IEN: P2 인터럽트 활성화
PICTL: PO, P1 및 P2 에지 구성
P0IFG: P0 인터럽트 플래그
P1IFG: P1 인터럽트 플래그
P2IFG: P2 인터럽트 플래그
7.4 범용 I/O 인터럽트
범용 I/O 핀이 입력으로 설정된 후 인터럽트를 생성하는 데 사용할 수 있습니다. 외부 신호의 상승 또는 하강 에지에서 트리거하도록 인터럽트를 설정할 수 있습니다. PO, P1 또는 P2 포트 에는 인터럽트
활성화 비트가 있으며 모든 비트는 다음과 같이 IEN1-2 레지스터에 있는 포트에 공통 입니다
. 이러한 공통 인터럽트 활성화 외에도 각 포트 비트에는 SFR 레지스터 P0IEN, P1IEN 및 P2IEN에 있는 개별 인터럽트 활성화가 있습니다. 주변 IO 또는 범용 출력으로 구성된 IO 핀이 활성화된 경우에도 인터럽트가 생성됩니다.

예: LED 물 램프

개략도
여기에 이미지 설명 삽입

여기에 이미지 설명 삽입
main.c

#include <ioCC2540.h>

//typedef unsigned char uchar;
//typedef unsigned int uint;

#define uint  unsigned int
#define uchar unsigned char

//定义控制灯的端口
#define LED1 P1_0	//定义LED1为P1.0口控制
#define LED2 P1_1	//定义LED2为P1.1口控制
#define LED3 P1_4	//定义LED3为P1.4口控制
#define LED4 P0_1	//定义LED4为P0.1口控制

//函数声明
void LedOnOrOff(uchar);         //点亮或熄灭所有灯
void Delay(uint);		//延时函数
void DelayMS(uint);		//延时MS函数
void InitLed(void);		//初始化LED控制IO口函数

/**********************
名 称:LedOnOrOff()
功能:点亮或绝灭所有LED灯
入口参数:mode为1时LED灯亮 mode为0时LED灯灭,共阴极
出口多数:无
*********************/

void LedOnOrOff(uchar mode)
{
	LED1 = mode;
        LED2 = mode;
        LED3 = mode;
        LED4 = mode;
}
/****************************
//普通延时
*****************************/
void Delay(uint n)
{
	uint i;
	for(i = 0;i<n;i++);
        for(i = 0;i<n;i++);
        for(i = 0;i<n;i++);
        for(i = 0;i<n;i++);
        for(i = 0;i<n;i++);
}
/****************************
//MS延时
*****************************/
void DelayMS(uint msec)
{
	uint i,j;

        for (i=0;i<msec;i++)
          for (j=0;j<535;j++);
}
/****************************
//初始化IO口程序
*****************************/
void InitLed(void)
{
    P1DIR |= 0x13;  //P10、P11、P14定义为输出 1101
    P0DIR |= 0x02;  //P0.1定义为输出 0010
    LedOnOrOff(0); //使所有LED灯默认为熄灭状态
}
/***************************
//主函数
***************************/
void main(void)
{
        uchar i;
	InitLed();		//初始化LED灯控制IO口
	while(1)                //死循环
	{
          LED1 = !LED1;         //流水灯,初始化时LED1为熄灭,执行后点亮
          DelayMS(200);
          LED2 = !LED2;         //流水灯,初始化时LED2为熄灭,执行后点亮
          DelayMS(200);
          LED3 = !LED3;         //流水灯,初始化时LED3为熄灭,执行后点亮
          DelayMS(200);
          LED4 = !LED4;         //流水灯,初始化时LED4为熄灭,执行后点亮
          DelayMS(200);

          for (i = 0; i<2; i++) //所有灯闪烁2次
          {
              LedOnOrOff(0); //关闭所有灯
              DelayMS(200);
              LedOnOrOff(1); //打开所有灯
              DelayMS(200);
	  }

          LedOnOrOff(0); //关闭所有灯
          DelayMS(200);
        }
}

9. 독자적인 버튼 개발

버튼은 P0_1 핀에 연결됩니다:
POSEL:포트 0 기능 선택 레지스터
옵션: 0:범용 I/O,1:주변 기능
P0SEL &= ~0X02; //P0.1을 일반 IO 포트 02로 설정합니다. 이진수 0010, 음수는 1101, 즉 P0.1이 일반 I/O로 설정됨
P0.7에서 PO.0으로 I/O 방향 0:입력;1:출력이
입력 모드로 설정됨, 이진수 1이 출력으로 사용됨 , 0은 입력
P0DIR &= ~0X02;
풀업 모드를 켭니다.

전체 코드:

#include <ioCC2540.h>

typedef unsigned char uchar;
typedef unsigned int uint;

//定义控制灯的端口
#define LED1 P1_0	//定义LED1为P1.0口控制
#define LED2 P1_1	//定义LED2为P1.1口控制
#define LED3 P1_4	//定义LED3为P1.4口控制
#define KEY1 P0_1	//定义P0.1口为S1控制端
#define ON 1
#define OFF 0

//函数声明
void LedOnOrOff(uchar);         //点亮或熄灭所有灯
void DelayMS(uint);		//延时MS函数
void InitLed(void);		//初始化LED控制IO口函数

/****************************
//MS延时
*****************************/
void DelayMS(uint msec)
{
	uint i,j;

        for (i=0;i<msec;i++)
          for (j=0;j<535;j++);
}
/**********************
名 称:LedOnOrOff()
功能:点亮或绝灭所有LED灯
入口参数:mode为1时LED灯亮 mode为0时LED灯灭,共阴极
出口多数:无
*********************/

void LedOnOrOff(uchar mode)
{
	LED1 = mode;
        LED2 = mode;
        LED3 = mode;
}
/****************************
//初始化IO口程序
*****************************/
void InitLed(void)
{
    P1DIR |= 0x13;  //P10、P11、P14定义为输出 1101
    LedOnOrOff(0); //使所有LED灯默认为熄灭状态
}
/****************************
//初始化KEY程序
*****************************/
void InitKey(void)
{
    P0SEL &= ~0X02;   //设置P0.1为普通IO口 02为二进制0010,取反为1101,即P0.1设置为普通I/O
    P0DIR &= ~0X02;   //按键接在P0.1上,设P0.1为输入模式为普通IO口
    P0INP &= ~0X02;   //打开P0.1的上拉电阻
}

/**********************
名 称:KeyScan()
功能:读取按键状态
入口参数:无
出口多数:0为抬起, 1为按键按下
*********************/

uchar KeyScan(void)
{
   if(KEY1 == 0)    //高电平有效
  {
    DelayMS(10);     //检测到按键,延时10MS防抖
    if(KEY1 == 0)
    {
      while(!KEY1);   //直到松开按键  松手检测
      return(1);    //有按键按下
    }
  }
  return(0);        //无按键按下
}

/***************************
//程序入口函数
***************************/
void main(void)
{
	InitLed();		//初始化LED灯控制IO口
        InitKey();             //初始化按键控制IO口
        while(1)
        {
          DelayMS(2);
          if(KeyScan())         //扫描按键当前状态,按下按时执行流水灯闪烁效果
               {
                  LED1 = ON;         //流水灯,初始化时LED1为熄灭,执行后点亮
                  DelayMS(500);
                  LED1 = OFF;       //熄灭LED1
                  LED2 = ON;         //流水灯,初始化时LED2为熄灭,执行后点亮
                  DelayMS(500);
                  LED2 = OFF;
                  LED3 = ON;         //流水灯,初始化时LED3为熄灭,执行后点亮
                  DelayMS(500);
                  LED3 = OFF;
               }


       }
}

길고 짧게 누르는 처리 아이디어 (의사 코드)

u8 Keypresstime;
#define keypresslong 0x56;
#define keypressshort 0x20;
keyflag;
#define keypresslongflag 0x11
#define keypresshortflag 0x22
cold_imstask()
{
  keyscan();
}


void keyscan(void)
{
  if(!key1)
  {
    Keypresstime++;
    if(Keypresstime  == keypresslong)
    {
        keyflag = keyresslongflag;
    }
    else if(Keypresstime > keypresslong)
    {
      Keypresstime = keypresslong+1;
    }
  }
  else if(Keypresstime > keypresslong)
  {
   Keypresstime = 0;
  }
  else if(Keypresstime < keypressshort)
  {
   Keypresstime = 0;
  }
   else if(Keypresstime < keypresslong)
  {
   keyflag = keypresshortflag;
  }
}

void keytask(void)
{
  switch(keyflag)
  {
    case keypressshotflag;

    break;

    case keypresslongflag;


    break;
    default:break;
  }
  keyflag = 0;
}

おすすめ

転載: blog.csdn.net/Medlar_CN/article/details/130603464