ZigBee CC2530 Z-Stack 定时器的使用
程序员文章站
2022-06-09 20:16:35
...
ZigBee CC2530 Z-Stack 定时器的使用
Z-Stack协议栈里面无法使用定时器中断。
例如下面的一个定时器1的中断,就算你正确的开启了定时器1,也无法进入中断。
#pragma vector = T1_VECTOR
__interrupt void T1_ISR(void)
{
LED1 = !LED1;
}
原因是中断vector已经被协议栈抢先定义
在hal_timer.c文件里面
/**************************************************************************************************
* @fn halTimer1Isr
*
* @brief Timer 1 ISR
*
* @param
*
* @return
**************************************************************************************************/
HAL_ISR_FUNCTION( halTimer1Isr, T1_VECTOR )
{
halProcessTimer1 ();
}
/**************************************************************************************************
* @fn halTimer3Isr
*
* @brief Timer 3 ISR
*
* @param
*
* @return
**************************************************************************************************/
HAL_ISR_FUNCTION( halTimer3Isr, T3_VECTOR )
{
halProcessTimer3 ();
}
/**************************************************************************************************
* @fn halTimer4Isr
*
* @brief Timer 4 ISR
*
* @param
*
* @return
**************************************************************************************************/
HAL_ISR_FUNCTION( halTimer4Isr, T4_VECTOR )
{
halProcessTimer4 ();
}
如果想使用定时器,协议栈也封装好了函数,调用非常简单。
1. 开启定时器
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT 定义定时时间。
osal_start_timerEx( SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
2. SampleApp_ProcessEvent函数里面处理
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
{
afIncomingMSGPacket_t *MSGpkt;
(void)task_id;
if ( events & SYS_EVENT_MSG )
{
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
while ( MSGpkt )
{
switch ( MSGpkt->hdr.event )
{
case KEY_CHANGE:
SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
break;
case AF_INCOMING_MSG_CMD:
SampleApp_MessageMSGCB( MSGpkt );
break;
case ZDO_STATE_CHANGE:
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
printf("NwkState:%d\n", SampleApp_NwkState);
break;
default:
break;
}
osal_msg_deallocate( (uint8 *)MSGpkt );
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
}
return (events ^ SYS_EVENT_MSG);
}
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
{
//处理,类似定时中断函数
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
}
return 0;
}
上一篇: textview 实现文字拼接 样式
下一篇: 二分图匹配