请问:
1.CC2640 的示例工程pinShutdown中debounce period的意义是什么?
2.可不可以直接在btn回调函数中直接发shutdown信号量shutdownSem?
/*!*****************************************************************************
* @brief Button clock callback
*
* Called when the debounce periode is over. Stopping the clock, toggling
* the device mode based on activeButtonPinId:
*
* KEY_DOWN will put the device in shutdown mode.
*
* Reenabling the interrupts and resetting the activeButtonPinId.
*
* @param arg argument (PIN_Handle) connected to the callback
*
******************************************************************************/
static void buttonClockCb(UArg arg) {
PIN_Handle buttonHandle = (PIN_State *) arg;
/* Stop the button clock */
Clock_stop(hButtonClock);
/* Check that there is active button for debounce logic*/
if (activeButtonPinId != PIN_TERMINATE) {
/* Debounce logic, only toggle if the button is still pushed (low) */
if (!PIN_getInputValue(activeButtonPinId)) {
/* Toggle LED based on the button pressed */
switch (activeButtonPinId) {
case Board_BUTTON1:
Semaphore_post(Semaphore_handle(&shutdownSem));
break;
default:
/* Do nothing */
break;
}
}
}
/* Re-enable interrupts to detect button release. */
PIN_setConfig(buttonHandle, PIN_BM_IRQ, activeButtonPinId | PIN_IRQ_NEGEDGE);
/* Set activeButtonPinId to none... */
activeButtonPinId = PIN_TERMINATE;
}
/*!*****************************************************************************
* @brief Button callback
*
* Initiates the debounce period by disabling interrupts, setting a timeout
* for the button clock callback and starting the button clock.
* Sets the activeButtonPinId.
*
* @param handle PIN_Handle connected to the callback
*
* @param pinId PIN_Id of the DIO triggering the callback
*
* @return none
******************************************************************************/
static void buttonCb(PIN_Handle handle, PIN_Id pinId) {
// 可否在这里直接根据pinId(=1,发送信号量shutdownSem)
/* Set current pinId to active */
activeButtonPinId = pinId;
/* Disable interrupts during debounce */
PIN_setConfig(handle, PIN_BM_IRQ, activeButtonPinId | PIN_IRQ_DIS);
/* Set timeout 50 ms from now and re-start clock */
Clock_setTimeout(hButtonClock, (50 * (1000 / Clock_tickPeriod)));
Clock_start(hButtonClock);
}