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、要实现的功能
a、开机后,自动从串口发送一行“hello world!”字符串给上位机。
b、从上位机给CC2530串口发送信息,CC2530收到信息 后,回传给上位机。
2、CC2530 串口简介
CC2530有两个USB转串口,分别是USART0和USART1。它们可以分别运行在异步UART模式或者同步SPI模式。两个USART具体同样的功能,可以设置在单独的I/O引脚:
根据上面的外设I/O引脚映射可知:
UART0对应的外部设置IO引脚关系为:位置1:P0_2----RX P0_3----TX 位置2:P1_4----RX P1_5----TX
UART1对应的外部设置IO引脚关系为:位置1:P0_5----RX P0_4----TX 位置2:P1_7----RX P1_6----TX
UART0的位置1和2使用PERCFG的第0位决定,UART1的位置1和2使用PERCFG的第1位决定。
3、串口收发实验
此工程在ZStack-CC2530-2.5.1a开发(一)工程建立的基础上进行,并将工程配置为协调器模式。其他模式下方法相同。
3.1、串口初始化
在Coordination文件的用户任务初始函数中添加串口初始化相关语句,代码如下:
void GenericApp_Init( uint8 task_id )
{
halUARTCfg_t uartConfig;
................................
uartConfig.configured = TRUE;
uartConfig.baudRate = HAL_UART_BR_115200;
uartConfig.flowControl = FALSE;
uartConfig.callBackFunc = rxCB;
HalUARTOpen(0,&uartConfig);
HalUARTWrite(0,"hello world!\n\r",strlen("hello world!\n\r"));
}
省略号为原来的代码,其余为添加的串口代码。
3.2 串口回调函数的实现。
串口回调函数是在串口接收到数据时使用,用来获取串口接收的数据,代码如下:
static void rxCB(uint8 port,uint8 event)
{
uint8 ch;
uint8 rxBuffer[128];
uint8 len = 0;
while (Hal_UART_RxBufLen(port))
{
HalUARTRead (port, &ch, 1);
rxBuffer[len] = ch;
len++;
}
if(len)
{
HalUARTWrite(0,rxBuffer,len);
len = 0;
}
}
添加串口回调函数的声明。
在Coordination.c文件的本地函数声明处,声明串口回调函数,代码如下:
/*********************************************************************
* LOCAL FUNCTIONS
*/
static void GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg );
static void GenericApp_HandleKeys( byte shift, byte keys );
static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
static void GenericApp_SendTheMessage( void );
static void rxCB(uint8 port,uint8 event);//by add
3.3 添加字符串头文件
由于串口中使用了字符串函数,所以在Coordination.c的头文件声明中,添加相关的字符串头文件
#include "string.h"
4、编译下载测试
测试成功。
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口,编译下载测试即可。