[C] 纯文本查看 复制代码
/*********************************************************************
* 函数名称:main
* 功 能:主函数。
* 入口参数:无
* 出口参数:无
* 返 回 值:无
********************************************************************/
int main( void )
{
/* 关闭中断 */
osal_int_disable( INTS_ALL );
/* 初始化系统时钟及LED等 */
HAL_BOARD_INIT();
/* 检测供电电压 */
zmain_vdd_check();
/* 初始化堆栈 */
zmain_ram_init();
/* 初始化主板外围I/O */
InitBoard( OB_COLD );
/* 初始化硬件抽象层驱动 */
HalDriverInit();
/* 初始化系统NV非易失性存储 */
osal_nv_init( NULL );
/* 初始化基础NV项 */
zgInit();
/* 初始化MAC */
ZMacInit();
/* 确定扩展地址 */
zmain_ext_addr();
/* 初始化应用框架 */
#ifndef NONWK
afInit(); // AF应用框架不是系统的任务,因此调用它的初始化程序
#endif
/* 初始化操作系统 */
osal_init_system();
/* 允许中断 */
osal_int_enable( INTS_ALL );
/* 最终板级初始化 */
InitBoard( OB_READY );
/* 显示该设备信息 */
zmain_dev_info();
/* 如果定义了LCD,则在LCD上显示设备信息 */
#ifdef LCD_SUPPORTED
zmain_lcd_init();
#endif
#ifdef WDT_IN_PM1
/* 如果看门狗被使用,此处使能 */
WatchDogEnable( WDTIMX );
#endif
//printf("osal_start_system");
osal_start_system(); // 进入系统调度,无返回
return ( 0 );
}
[C] 纯文本查看 复制代码
/*********************************************************************
* 函数名称:SerialApp_Init
* 功 能:SerialApp的初始化函数。
* 入口参数:task_id 由OSAL分配的任务ID。该ID被用来发送消息和设定定时
* 器。
* 出口参数:无
* 返 回 值:无
********************************************************************/
void SerialApp_Init( uint8 task_id )
{
halUARTCfg_t uartConfig; // 定义串口配置结构体变量
SerialApp_MsgID = 0x00; // 初始化传输序号
SerialApp_SeqRx = 0xC3; // 初始化接收序号为十进制195
SerialApp_TaskID = task_id; // 获取应用任务ID
/* 初始化发送信息目的地址 */
SerialApp_DstAddr.endPoint = 0;
SerialApp_DstAddr.addr.shortAddr = 0;
SerialApp_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;
/* 初始化响应信息的目的地址 */
SerialApp_RspDstAddr.endPoint = 0;
SerialApp_RspDstAddr.addr.shortAddr = 0;
SerialApp_RspDstAddr.addrMode = (afAddrMode_t)AddrNotPresent;
/* 注册端点描述符 */
afRegister( (endPointDesc_t *)&SerialApp_epDesc );
/* 注册按键事件,将所有按键事件发送给本应用任务SerialApp_TaskID */
RegisterForKeys( task_id );
/* 串口初始化 */
uartConfig.configured = TRUE;
uartConfig.baudRate = SERIAL_APP_BAUD; // 波特率
uartConfig.flowControl = TRUE; // 流控使能
uartConfig.flowControlThreshold = SERIAL_APP_THRESH; // 流控阈值
uartConfig.rx.maxBufSize = SERIAL_APP_RX_MAX; // 最大接收量
uartConfig.tx.maxBufSize = SERIAL_APP_TX_MAX; // 最大发送量
uartConfig.idleTimeout = SERIAL_APP_IDLE; // 空闲时间
uartConfig.intEnable = TRUE; // 中断使能
/* 若使能了环回测试功能 */
#if SERIAL_APP_LOOPBACK
uartConfig.callBackFunc = rxCB_Loopback; // 回调函数
/* 若未使能环回测试功能 */
#else
uartConfig.callBackFunc = rxCB; // 回调函数
#endif
HalUARTOpen (SERIAL_APP_PORT, &uartConfig); // 打开串口
/* 若包含了LCD_SUPPORTED编译选项,则在LCD上进行相应的显示 */
#if defined ( LCD_SUPPORTED )
#if defined ( ZIGBEEPRO )
HalLcdWriteString( "SerialApp(ZigBeePRO)", HAL_LCD_LINE_2 );
#else
HalLcdWriteString( "SerialApp(ZigBee2007)", HAL_LCD_LINE_2 );
#endif
#endif
/* ZDO信息注册 */
/* 注册ZDO的簇End_Device_Bind_rsp,将收到的End_Device_Bind_rsp事件
发送给本应用任务SerialApp_TaskID
*/
ZDO_RegisterForZDOMsg( SerialApp_TaskID, End_Device_Bind_rsp );
/* ZDO信息注册 */
/* 注册ZDO的簇Match_Desc_rsp,将收到的Match_Desc_rsp事件发送给本应
用任务SerialApp_TaskID
*/
ZDO_RegisterForZDOMsg( SerialApp_TaskID, Match_Desc_rsp );
}
[C] 纯文本查看 复制代码
/*********************************************************************
* 函数名称:SerialApp_ProcessEvent
* 功 能:SerialApp的任务事件处理函数。
* 入口参数:task_id 由OSAL分配的任务ID。
* events 准备处理的事件。该变量是一个位图,可包含多个事件。
* 出口参数:无
* 返 回 值:尚未处理的事件。
********************************************************************/
UINT16 SerialApp_ProcessEvent( uint8 task_id, UINT16 events )
{
/* 系统消息事件 */
if ( events & SYS_EVENT_MSG )
{
afIncomingMSGPacket_t *MSGpkt;
while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(
SerialApp_TaskID )))
{
switch ( MSGpkt->hdr.event )
{
/* ZDO信息输入事件 */
case ZDO_CB_MSG:
// 调用ZDO信息输入事件处理函数
SerialApp_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );
break;
/* 按键事件 */
case KEY_CHANGE:
HalUARTWrite(0,"KEY_CHANGE",4);
// 调用按键事件处理函数
SerialApp_HandleKeys( ((keyChange_t *)MSGpkt)->state,
((keyChange_t *)MSGpkt)->keys );
break;
/* AF输入信息事件 */
case AF_INCOMING_MSG_CMD:
// 调用输入信息事件处理函数
SerialApp_ProcessMSGCmd( MSGpkt );
break;
default:
break;
}
osal_msg_deallocate( (uint8 *)MSGpkt ); // 释放存储器
}
return ( events ^ SYS_EVENT_MSG ); // 返回未处理的事件
}
/* 发送数据事件 */
if ( events & SERIALAPP_MSG_SEND_EVT )
{
SerialApp_SendData( otaBuf, otaLen ); // 调用发送数据处理函数
return ( events ^ SERIALAPP_MSG_SEND_EVT );
}
/* 发送数据重传事件 */
if ( events & SERIALAPP_MSG_RTRY_EVT )
{
/* 若重传计数不为0 */
if ( --rtryCnt )
{
/* 发送OTA信息(需要重传的发送数据) */
AF_DataRequest( &SerialApp_DstAddr,
(endPointDesc_t *)&SerialApp_epDesc,
SERIALAPP_CLUSTERID1, otaLen, otaBuf,
&SerialApp_MsgID, 0, AF_DEFAULT_RADIUS );
/* 在指定时间SERIALAPP_MSG_RTRY_TIMEOUT到时后触发发送数据重传事件 */
osal_start_timerEx( SerialApp_TaskID, SERIALAPP_MSG_RTRY_EVT,
SERIALAPP_MSG_RTRY_TIMEOUT );
}
else
{
FREE_OTABUF(); // 处理缓冲区
}
return ( events ^ SERIALAPP_MSG_RTRY_EVT );
}
/* 响应信息重传事件 */
if ( events & SERIALAPP_RSP_RTRY_EVT )
{
/* 发送OTA信息(需要重传的响应信息)*/
afStatus_t stat = AF_DataRequest( &SerialApp_RspDstAddr,
(endPointDesc_t *)&SerialApp_epDesc,
SERIALAPP_CLUSTERID2,
SERIAL_APP_RSP_CNT, rspBuf,
&SerialApp_MsgID, 0, AF_DEFAULT_RADIUS );
/* 若发送OTA信息(需要重传的响应信息)不成功*/
if ( stat != afStatus_SUCCESS )
{
/* 在指定时间SERIALAPP_RSP_RTRY_TIMEOUT到时后触发响应信息重传事件 */
osal_start_timerEx( SerialApp_TaskID, SERIALAPP_RSP_RTRY_EVT,
SERIALAPP_RSP_RTRY_TIMEOUT );
}
return ( events ^ SERIALAPP_RSP_RTRY_EVT );
}
/* 若使能了环回测试 */
#if SERIAL_APP_LOOPBACK
/* 串口重发送事件 */
if ( events & SERIALAPP_TX_RTRY_EVT )
{ /* 若接收缓冲区中有数据 */
if ( rxLen )
{ /* 若将接收缓冲区中的数据写入到串口不成功 */
if ( !HalUARTWrite( SERIAL_APP_PORT, rxBuf, rxLen ) )
{ /* 在指定时间SERIALAPP_TX_RTRY_TIMEOUT后触发串口重发送事件 */
osal_start_timerEx( SerialApp_TaskID, SERIALAPP_TX_RTRY_EVT,
SERIALAPP_TX_RTRY_TIMEOUT );
}
/* 若将接收缓冲区中的数据写入到串口成功 */
else
{
rxLen = 0; // 清零接收缓冲区中数据长度变量
}
}
return ( events ^ SERIALAPP_TX_RTRY_EVT );
}
#endif
/* 丢弃未知事件 */
return ( 0 );
}
[C] 纯文本查看 复制代码
/*********************************************************************
* 函数名称:rxCB_Loopback
* 功 能:串口接收回调函数(环回测试时使用)
* 入口参数:port 串口号
* event 串口事件
* 出口参数:无
* 返 回 值:无
********************************************************************/
static void rxCB_Loopback( uint8 port, uint8 event )
{
/* 若接收缓冲区中有数据 */
if ( rxLen )
{
/* 若将接收缓冲区中的数据写入到串口不成功 */
if ( !HalUARTWrite( SERIAL_APP_PORT, rxBuf, rxLen ) )
{
/* 在指定时间SERIALAPP_TX_RTRY_TIMEOUT后触发串口重发送事件 */
osal_start_timerEx( SerialApp_TaskID, SERIALAPP_TX_RTRY_EVT,
SERIALAPP_TX_RTRY_TIMEOUT );
return; // 返回
}
/* 若将接收缓冲区中的数据写入到串口成功 */
else
{ /* 停止串口重发送事件 */
osal_stop_timerEx( SerialApp_TaskID, SERIALAPP_TX_RTRY_EVT );
}
}
/* 若从串口读取数据不成功(读出的数据长度为0) */
if ( !(rxLen = HalUARTRead( port, rxBuf, SERIAL_APP_RX_CNT )) )
{
return; // 返回
}
/* 若将已从串口读取的数据回写到串口成功 */
if ( HalUARTWrite( SERIAL_APP_PORT, rxBuf, rxLen ) )
{
rxLen = 0; // 清零接收缓冲区中数据长度变量
}
/* 若将已从串口读取的数据回写到串口不成功 */
else
{ /* 在指定时间SERIALAPP_TX_RTRY_TIMEOUT后触发串口重发送事件 */
osal_start_timerEx( SerialApp_TaskID, SERIALAPP_TX_RTRY_EVT,
SERIALAPP_TX_RTRY_TIMEOUT );
}