CC2640R2F LED控制

本文档记录CC2640R2F simple_peripheral_oad_onchip工程下抽象LED控制接口

硬件平台:官方 LAUNCHXL-CC2640R2F (http://www.ti.com/tool/cn/launchxl-cc2640r2)

SDK:  simplelink_cc2640r2_sdk_1_50_00_58  (http://www.ti.com/tool/download/SIMPLELINK-CC2640R2-SDK)

编译环境: iar for arm 8.20.2 (https://www.iar.com)

 

1、工程中增加led.c、led.h文件,增加头文件目录,修改宏定义

 

注:宏定义里面修改如下,红圆圈为修改项(关闭默认的LED_DEBUG 宏)

 

2、自定义LED引脚

CC2640R2F_LAUNCHXL.h 文件下修改

2.1、去掉默认LED定义引脚

 

 去掉有冲突引脚(红色圆圈),增加自定义引脚(红色方圈)

 

2.2、CC2640R2F_LAUNCHXL.c 文件修改

 

2.3、led.c 文件

#include <ti/sysbios/knl/Clock.h>
#include "util.h"
#include "board.h"

/*************************** 对应平台接口 *************************************/

static PIN_State led_state;

static const PIN_Config led_pins[] = {
    SDI_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
    SDI_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
    PIN_TERMINATE
};

static void gpio_init(void){

  if(!PIN_open(&led_state, led_pins)){
  
      PIN_open(&led_state, led_pins);
  }    
}

static void gpio_set_value(PIN_Id id, unsigned char val){

  PIN_setOutputValue(&led_state, id, val);
}

/*******************************************************************/
static Clock_Struct led_period_clock;
#define LED_PERIOD_TIME  (100) //100ms

static unsigned char led_cur_state = 0;

typedef struct led_ctr_{
    
    unsigned int   gpio;   //对应GPIO引脚
    unsigned char  state;  //引脚当前状态    
    unsigned char  _pd;    //
    unsigned short count;  //1~0xFFFE 闪烁次数,0xFFFF-不间断闪,0-切换当前状态, 
    unsigned short period; //闪烁周期
    unsigned short times;  //当前时间计数,100ms为单位    
}led_ctr;

#define LED_NUM_MAX  (2)
led_ctr g_led_ctr[LED_NUM_MAX] = {
    
    {SDI_RLED, 0, 0, 0},
    {SDI_GLED, 0, 0, 0}
};

static void SDI_led_process(UArg arg){
    
    unsigned char i;
    unsigned char n = 0;
    
    for(i=0; i<LED_NUM_MAX; i++){
                
        if(g_led_ctr[i].times > 1){
              g_led_ctr[i].times--;    
              
        }else if(g_led_ctr[i].times == 1){
          
              g_led_ctr[i].times = 0;    
              g_led_ctr[i].state ^= 0x01;
              gpio_set_value(g_led_ctr[i].gpio, g_led_ctr[i].state);
              
              if(g_led_ctr[i].count){
                if(g_led_ctr[i].count != 0xFFFF)
                  g_led_ctr[i].count--;
                g_led_ctr[i].times = g_led_ctr[i].period;
              }
        }else{
        
        }

        if(g_led_ctr[i].times || g_led_ctr[i].count) n++;
    }
    
    if(!n){                
        Util_stopClock(&led_period_clock);
        led_cur_state = 0;
    }
}

void SDI_led_indication(unsigned int led, unsigned char count, unsigned short times_100ms, unsigned char onoff){
    unsigned char i=0;
    static unsigned char led_api_init = 0;
    
    //引脚判断
    for(i=0; i<LED_NUM_MAX; i++){        
        if(led == g_led_ctr[i].gpio){
            break;
        }        
    }
    
    if(i == LED_NUM_MAX) return;
    
    //设置参数
    if(count != 0){
      g_led_ctr[i].count = (count == 0xFF) ? 0xFFFF: ((count - 1) << 1);
      g_led_ctr[i].period = times_100ms;
      g_led_ctr[i].times  = times_100ms;      
    }else{
      g_led_ctr[i].count  = 0;
      g_led_ctr[i].period = 0;
      g_led_ctr[i].times  = 0;      
    }
    g_led_ctr[i].state = onoff;
    
    //初始化LED
    if(!led_api_init){
        led_api_init = 1;
        
        gpio_init();
        
        Util_constructClock(&led_period_clock, SDI_led_process,
                        LED_PERIOD_TIME, LED_PERIOD_TIME, false, NULL);                        
    }

    //执行控制
    if(!led_cur_state){
        
        Util_startClock(&led_period_clock);
        led_cur_state = 1;
    }
    
    gpio_set_value(g_led_ctr[i].gpio, g_led_ctr[i].state);
}

 

2.4、增加测试接口方式(simple_peripheral_oad_onchip.c)

系统启动后 绿灯以500ms频率闪烁5次

连接APP后红灯闪烁以200ms频率闪烁3次,绿灯常亮(函数 static void SimpleBLEPeripheral_processStateChangeEvt(gaprole_States_t newState))

断开APP后红灯闪烁以200ms频率闪烁3次,绿灯常灭(函数 static void SimpleBLEPeripheral_processStateChangeEvt(gaprole_States_t newState))

 

3、编译烧录,运行

 点击视频

修改补丁:https://files.cnblogs.com/files/T0213-ZH/simplelink_cc2640r2_sdk_1_50_00_58_patch_led%E6%8E%A7%E5%88%B6.rar

posted @ 2019-03-15 15:34  不在+年华  阅读(987)  评论(0编辑  收藏  举报