完美解决CC2530 Zstack框架串口不可用的问题(HAL库)

CC2530是最为常用的ZigBee芯片之一。该芯片支持使用Zstack框架进行ZigBee的配置,用户无需了解ZigBee协议栈的内容,只需调用库函数即可进行ZigBee传输。
然而该框架有一个巨大的BUG,就是HAL库函数中的串口收发(read、write函数)无法正常使用,导致CC2530无法收发UART信息。下面是解决方案

一、CC2530的串口基本信息

CC2530串口引脚:
UART0对应的外部引脚关系,位置1:Rx - P0_2 Tx - P0_3 ;位置2:Rx - P1_4 Tx - P1_5
UART1对应的外部引脚关系,位置1:Rx – P0_5 Tx – P0_4;位置2:Rx - P1_7 Tx - P1_6
UART波特率配置表格:

完美解决CC2530 Zstack框架串口不可用的问题(HAL库)_第1张图片

二、修复代码

本人使用的是UART0的位置一,其他位置可以参考自己修改
自己写一个UART配置文件myuart.c

#include "myuart.h"

/****************************************************************
初始化串口0函数					
****************************************************************/
void initUART0(void)
{
     
    CLKCONCMD &= ~0x40;                         //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);                    //等待晶振稳定
    CLKCONCMD &= ~0x47;                         //设置系统主时钟频率为32MHZ
   
    PERCFG = 0x00;				//位置1 P0口
    P0SEL = 0x0c;				//P0用作串口
    P2DIR &= ~0XC0;                             //P0优先作为UART0    
    
    U0CSR |= 0x80;				//串口设置为UART方式
    U0GCR |= 11;				
    U0BAUD |= 216;				//波特率设为115200
    UTX0IF = 1;                                 //UART0 TX中断标志初始置位1 
    
    U0CSR |= 0X40;				//允许接收
    IEN0 |= 0x84;				//开总中断,接收中断
}

/****************************************************************
串口发送字符串函数				
****************************************************************/
void UartTX_Send_String(uchar *Data,int len)
{
     
  int j;
  for(j=0;j<len;j++)
  {
     
    U0DBUF = *Data++;
    while(UTX0IF == 0);
    UTX0IF = 0;
  }
}

其头文件为myuart.h

#include 
#ifndef _MYUART_H_
#define _MYUART_H_
#define uint unsigned int
#define uchar unsigned char
void initUART0(void);
void InitialAD(void);
void UartTX_Send_String(uchar *Data,int len);
#endif

将这两个文件加入IAR工程中,在SampleApp.c中include刚刚的头文件。

在SampleApp_Init函数中加入

initUART0();

然后就会发现,UART可以传输数据了!HAL库中的HalUARTWrite也可以用了!

三、串口接收

刚刚只做到了UART发送信息,下面使用中断的方式接收串口信息。
在SampleApp.c中加入变量定义:

uchar temp = 0xff;//UART暂存字符
uchar read[50];//UART暂存数组
int cnt=0;//计数器

中断服务函数定义:

/*************************************************
串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp
***********************************************/
#pragma vector = URX0_VECTOR
 __interrupt void UART0_ISR(void)
 {
     
 	URX0IF = 0;				//清中断标志
	temp = U0DBUF;
    read[cnt]=temp;
    cnt++;
    temp = 0xff;//这里假定0xff为无意义字符
 }

这样就可以正常接收UART信息了。收到的字符会暂存在read数组里面,可以用

HalUARTWrite(0, read, cnt);
cnt=0;

来进行测试,查看收到的字符

你可能感兴趣的:(ZigBee,国创项目,zigbee,uart,协议栈,串口通信,物联网)