上次的理论知识学的有点杂乱
今天来跟着例程实践看一看
目录
一、ZigBee协议栈的安装、编译和下载
所谓安装协议栈与平常安装应用程序不一样,其实把一些文件解压到某个目录下即为安装完成
如上是开发板公司提供的工程解压后的协议栈目录
Components 存放库的文件夹
Documents 放TI的开发文档的文件夹,里面很多都是讲述协议栈的API
Projects 存放TI协议栈的例程
Tools 放TI例程的一些上位机之类的程序作为工具使用
带协议栈的工程目录的解释如上,感觉挺有用的,第一次使用协议栈看到这么多文件夹看了这个解释后脑子会比较清晰一些
二、协议栈工作流程
用户添加自己的应用任务程序在Zstack中的调用过程:
main() ---> osal_init_system() ---> osalInitTasks() ---> SampleApp_Init()
int main( void )
{
// 关闭所有中断
osal_int_disable( INTS_ALL );
//初始化系统时钟
HAL_BOARD_INIT();
// 检查芯片电压是否正常
zmain_vdd_check();
// 初始化I/O LED Timer等
InitBoard( OB_COLD );
// 初始化芯片各硬件模块
HalDriverInit();
// 初始化Flash存储器
osal_nv_init( NULL );
// 初始化MAC层
ZMacInit();
// 确定 IEEE 64位地址
zmain_ext_addr();
#if defined ZCL_KEY_ESTABLISH
// Initialize the Certicom certificate information.
zmain_cert_init();
#endif
// 初始化非易失变量
zgInit();
#ifndef NONWK
// Since the AF isn't a task, call it's initialization routine
afInit();
#endif
// 初始化操作系统
osal_init_system();
// 使能全部中断
osal_int_enable( INTS_ALL );
// 最终板载初始化
InitBoard( OB_READY );
// 显示设备信息
zmain_dev_info();
/* Display the device info on the LCD */
#ifdef LCD_SUPPORTED
zmain_lcd_init(); //初始化LCD
#endif
#ifdef WDT_IN_PM1
/* If WDT is used, this is a good place to enable it. */
WatchDogEnable( WDTIMX );
#endif
osal_start_system(); // No Return from here 执行操作系统 进去之后不会返回
return 0; // Shouldn't get here.
} // main()
三、串口通信主要代码
1.串口打印
//------------------------配置串口---------------------------------
MT_UartInit(); //串口初始化
MT_UartRegisterTaskID(task_id); //注册串口任务
HalUARTWrite(0,"UartInit OK\n", sizeof("UartInit OK\n"));
//HalUARTWrite(0,"ALD UartInit OK ", sizeof("ALD UartInit OK ")-1);
//-----------------------------------------------------------------
以上三行代码即可实现串口打印信息 着重再看一看串口初始化 这里我觉得和STM32的串口初始化还挺像的 一定要注意波特率设置
void MT_UartInit ()
{
halUARTCfg_t uartConfig;
/* Initialize APP ID */
App_TaskID = 0;
/* UART Configuration */
uartConfig.configured = TRUE;
uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;
uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW;
uartConfig.flowControlThreshold = MT_UART_DEFAULT_THRESHOLD;
uartConfig.rx.maxBufSize = MT_UART_DEFAULT_MAX_RX_BUFF;
uartConfig.tx.maxBufSize = MT_UART_DEFAULT_MAX_TX_BUFF;
uartConfig.idleTimeout = MT_UART_DEFAULT_IDLE_TIMEOUT;
uartConfig.intEnable = TRUE;
#if defined (ZTOOL_P1) || defined (ZTOOL_P2)
uartConfig.callBackFunc = MT_UartProcessZToolData;
#elif defined (ZAPP_P1) || defined (ZAPP_P2)
uartConfig.callBackFunc = MT_UartProcessZAppData;
#else
uartConfig.callBackFunc = NULL;
#endif
/* Start UART */
#if defined (MT_UART_DEFAULT_PORT)
HalUARTOpen (MT_UART_DEFAULT_PORT, &uartConfig);
#else
/* Silence IAR compiler warning */
(void)uartConfig;
#endif
/* Initialize for ZApp */
#if defined (ZAPP_P1) || defined (ZAPP_P2)
/* Default max bytes that ZAPP can take */
MT_UartMaxZAppBufLen = 1;
MT_UartZAppRxStatus = MT_UART_ZAPP_RX_READY;
#endif
}
对了还得提起一个知识点 IAR 和 KEIL 的不同有一点在宏定义
这里定义的是一些宏定义
其中ZTOOL_P1 --- 串口0 ZTOOL_P2 --- 串口1
2.串口打印收到的数据
这里需要自己写一个串口接收回调函数
void rxCB( uint8 port, uint8 event )
{
unsigned char buf[30];
unsigned char len;
len = HalUARTRead(0, buf, 30);//读取串口数据,返回数据长度
if(len)
{
HalUARTWrite(0, buf, len);//通过串口原样返回数据 也可以修改数据返回用于区分数据
len = 0;
}
}
四、实现
五、总结
之前在STM32上用串口功能用的比较多,这是第一次用协议栈实现
但其实也是直接使用官方的例程 然后实现并理解 要是自己写肯定也写不来