ZStack版本:ZStack-CC2530-2.5.1a
下载和调试器:SmartRF04EB
IDE开发软件:IAR Embedded Workbench IDE - 8051 10.20.1
开发平台:基于TI-CC2530的任意厂家的
工程模板:ZStack-CC2530-2.5.1a\Projects\zstack\Samples\GenericApp
1、建立工程
安装ZStack-CC2530-2.5.1a协议栈,双击ZStack-CC2530-2.5.1a协议栈文件,按照提示,一步步按照协议栈。
安装好协议栈后,按照前面博文ZStack-CC2530-2.5.1a开发(一)工程建立https://blog.csdn.net/fhkj5769/article/details/104990850的步骤,建立工程,并打开工程。
2、添加串口相关代码
以协调器设置模式为例,其余模式步骤相同。
2.1添加相关头文件
在Coordination.c文件中的头文件末尾处,添加如下头文件:
#include "MT_UART.H"
#include "MT.h"
2.2 添加串口初始化函数
在Coordination.c文件中的用户任务初始化函数GenericApp_Init的最后添加如下代码
MT_UartInit ();
MT_UartRegisterTaskID(GenericApp_TaskID);
2.3 添加串口事件处理分支
在Coordination.c文件中的用户事件处理函数GenericApp_ProcessEvent中,添加如下分支代码:
case CMD_SERIAL_MSG:
SerialData_Proccess(((mtOSALSerialData_t*)MSGpkt)->msg);
break;
2.4 添加串口数据处理函数
在Coordination.c文件中的函数声明处,添加串口数据处理函数的声明:
void SerialData_Proccess(uint8* msg);
在Coordination.c文件的末尾,添加串口数据处理函数的定义
void SerialData_Proccess(uint8* msg)
{
if(zgDeviceLogicalType == ZG_DEVICETYPE_COORDINATOR)
HalUARTWrite(0,msg+1,*msg);
else if(zgDeviceLogicalType == ZG_DEVICETYPE_ROUTER)
HalUARTWrite(0,msg+1,*msg);
else if(zgDeviceLogicalType == ZG_DEVICETYPE_ENDDEVICE)
HalUARTWrite(0,msg+1,*msg);
}
3、改造协议栈中关于监控串口的相关代码
3.1 更改串口基本设置
在MT_UART.h头文件中,将
#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_38400
改成
#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_115200
将
#define MT_UART_DEFAULT_OVERFLOW TRUE
改成
#define MT_UART_DEFAULT_OVERFLOW FALSE
3.2 改造串口数据回调函数
将MT_UART.c文件中的MT_UartProcessZToolData更改如下:
void MT_UartProcessZToolData ( uint8 port, uint8 event )
{
#if 1
uint8 ch;
uint8 rxBuffer[128];
uint8 len = 0;
uint8 i;
while (Hal_UART_RxBufLen(port))
{
HalUARTRead (port, &ch, 1);
rxBuffer[len+1] = ch;
len++;
}
if(len)
{ rxBuffer[0] = len;
pMsg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof ( mtOSALSerialData_t )+len+1);
if (pMsg)
{
/* Fill up what we can */
pMsg->hdr.event = CMD_SERIAL_MSG;
pMsg->msg = (uint8*)(pMsg+1);
for(i = 0; i<= len; i++)
pMsg->msg[i] = rxBuffer[i];
osal_msg_send(App_TaskID,(byte*)pMsg);
osal_msg_deallocate((uint8*)pMsg);
}
}
#else
............................................
原代码内容
............................................
#endif
}
使用#if #else #endif 语句将原来函数中语句移除编译,添加新语句编译。
4、测试
4.1 添加网络状态改变打印函数
在Coordination.c文件中的用户事件处理函数GenericApp_ProcessEvent的网络状态改变分支的if语句中添加:
HalUARTWrite(0,"device is ok!\r\n",osal_strlen("device is ok!\r\n"));
4.2 编译下载
在上位机打开串口调试软件,波特率为115200,将代码烧录到芯片并运行,串口打印出信息:
"device is ok!”。同过串口发送数据,数据可正确回传到上位机。
5、更改UART0位置,进行测试
ZStack-CC2530-2.5.1a协议栈串口0默认位于位置1:P0_2----RX P0_3----TX,
如果你的板子串口0位于位置2:P1_4----RX P1_5----TX,将串口位置由位置1更改为位置2的方法如下:
打开_hal_uart_dma.c文件,在static void HalUARTInitDMA(void)函数体中,将
PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 1 location on P0.注释掉,
添加PERCFG |= HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 2 location on P1.
将PxSEL |= HAL_UART_Px_RX_TX;注销,添加P1SEL |= 0x30; // Enable Tx and Rx on P1.两条语句。
#if (HAL_UART_DMA == 1)
//PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 1 location on P0.
PERCFG |= HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 2 location on P1
#else
........
//PxSEL |= HAL_UART_Px_RX_TX;
P1SEL |= 0x30; // Enable Tx and Rx on P1.
更改完成后,UART0的位置就被放到了P1口,编译下载测试即可。