This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

cc2541 performPeriodicTask周期性函数中写如下代码,通过控制继电器控制灯开关,周期为1s,但是灯的开关总是到不到理想的效果,经常会闪。有没有大佬讲解一下

static void
performPeriodicTask(void)
{
t_cnt++;

if (t_cnt == 5) {
load_state_ON;
}

if (t_cnt == 10) {
load_state_OFF;
t_cnt=0;
}

if (load_state == ON) {
RelayONOff(1);
} else if (load_state == OFF) {
RelayONOff(0);
}

}

  • 你的程序不用這個複雜吧,直接用osal_start_timerEx 開個週期性(周期为1s)事件去控制继电器控制灯开关就好了不是
  • osal_start_timerEx 我也用过,但是发现没反应啊,后来用的osal_start_reload_timer开的定时器
  • if (events & SBP_START_DEVICE_EVT) {
    // Start the Device
    VOID GAPRole_StartDevice(&simpleBLEPeripheral_PeripheralCBs);

    // Start Bond Manager
    VOID GAPBondMgr_Register(&simpleBLEPeripheral_BondMgrCBs);

    // Set timer for first periodic event
    osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT,
    SBP_PERIODIC_EVT_PERIOD );

    //osal_start_reload_timer(
    //simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD);
    return (events ^ SBP_START_DEVICE_EVT);
    }

    if (events & SBP_PERIODIC_EVT) {

    osal_start_reload_timer(
    simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD);
    performPeriodicTask();

    return (events ^ SBP_PERIODIC_EVT);
    }
  • osal_start_timerEx 我也用过,但是发现没反应啊

    把你的程序貼上來看看

  • 先查一下你的performPeriodicTask是不是每秒被觸發一次
  • 我用io口取反的方式试了 ,并不是一秒一次, 正常几次之后机会来几下不正常的
  • if (events & SBP_PERIODIC_EVT) {

    osal_start_timerEx(simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD);
    performPeriodicTask();

    return (events ^ SBP_PERIODIC_EVT);
    }

    static void
    performPeriodicTask(void)
    {
    t_cnt++;

    if (t_cnt == 5) {
    load_state_ON;
    }

    if (t_cnt == 10) {
    load_state_OFF;
    t_cnt=0;
    }

    if (load_state == ON) {
    RelayONOff(1);
    } else if (load_state == OFF) {
    RelayONOff(0);
    }

    }
  • if (events & SBP_PERIODIC_EVT) {

    osal_start_timerEx(simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD);
    performPeriodicTask();

    return (events ^ SBP_PERIODIC_EVT);
    }

    static void
    performPeriodicTask(void)
    {
    t_cnt++;

    if (t_cnt == 5) {
    load_state_ON;
    }

    if (t_cnt == 10) {
    load_state_OFF;
    t_cnt=0;
    }

    if (load_state == ON) {
    RelayONOff(1);
    } else if (load_state == OFF) {
    RelayONOff(0);
    }

    }