1、协议栈版本:ZStack-1.4.3-1.2.1 一、串口的初始化/系统初始化byte osal_init_system( void )osalInitTasks();/系统任务初始化/任务初始化void osalInitTasks( void )#if defined( MT_TASK )/如果定义了 MT_TASK 就初始化 MT 任务,所以要使用uart 必须编译 MT_TASKMT_TaskInit( taskID+ );#endif/MT_TASK初始化void MT_TaskInit( byte task_id )MT_TaskID = task_id;/分配任务 IDSPIMgr
2、_Init();/SPI(UART)管理初始化 /* MT_TaskInit() */SPI(UART)管理初始化void SPIMgr_Init ()halUARTCfg_t uartConfig;/* Initialize APP ID */App_TaskID = 0;/应用层 TaskID 初始化为 0,在后面应用层如果想使用 uart需要注册该 TaskID/* UART Configuration */uartConfig.configured = TRUE;uartConfig.baudRate = SPI_MGR_DEFAULT_BAUDRATE;uartConfig.flow
3、Control = SPI_MGR_DEFAULT_OVERFLOW;uartConfig.flowControlThreshold = SPI_MGR_DEFAULT_THRESHOLD;uartConfig.rx.maxBufSize = SPI_MGR_DEFAULT_MAX_RX_BUFF;uartConfig.tx.maxBufSize = SPI_MGR_DEFAULT_MAX_TX_BUFF;uartConfig.idleTimeout = SPI_MGR_DEFAULT_IDLE_TIMEOUT;uartConfig.intEnable = TRUE;#if defined (
4、ZTOOL_P1) | defined (ZTOOL_P2)uartConfig.callBackFunc = SPIMgr_ProcessZToolData; /回调函数#elif defined (ZAPP_P1) | defined (ZAPP_P2)uartConfig.callBackFunc = SPIMgr_ProcessZAppData; /回调函数#elseuartConfig.callBackFunc = NULL;#endif/* Start UART */#if defined (SPI_MGR_DEFAULT_PORT)HalUARTOpen (SPI_MGR_DEF
5、AULT_PORT, /打开默认串口#else到这里串口的初始化基本就完成了,还有个打开串口,先不下去了,下面的水是越来越浑,过几天总结底层的 二、串口的事件处理/系统主循环void osal_start_system( void )Hal_ProcessPoll(); / 串口与定时器轮询函数/ 串口与定时器轮询函数void Hal_ProcessPoll () HalTimerTick();#if (defined HAL_UART) #endif/串口轮询函数void HalUARTPoll( void )/这里会根据是 DMA 还是普通串口有两种不同的轮询方式,这里说普通串口#if H
6、AL_UART_ISR#if HAL_UART_DMAif ( cfg-flag else#endifpollISR( cfg );#elif HAL_UART_DMApollDMA( cfg );#endif/普通串口轮询函数static void pollISR( uartCfg_t *cfg )轮询完事再次回到 void HalUARTPoll 函数中,看是否触发事件,如果触发了HAL_UART_RX_FULL、 HAL_UART_RX_ABOUT_FULL、HAL_UART_RX_TIMEOUT 三个中任意一个就调用回调函数处理。if ( evt /串口回调函数见 zigbee 200
7、6 串口回调函数说明三、与应用层联姻底层和应用层联姻呢?在 TI 的协议栈很多都是通过注册 Register。按键、串口通过注册可以传递任务 ID,即 TaskID。从而利用偷梁换柱、浑水摸鱼的技术将底层的任务传到应用层/注册函数void SPIMgr_RegisterTaskID( byte taskID )App_TaskID = taskID;/任务 ID 被偷梁换柱了/如果应用层调用了这个函数,则此时 App_TaskID 就变成了应用层的任务 ID 了现在我们在回去简单看一下串口的回调函数void SPIMgr_ProcessZAppData ( uint8 port, uint8 event )if (event /将 msg_ptr发送到 App_TaskID,即你注册的应用层到这里,串口的信息就有底层传送到应用层了我也该休息休息了