嵌入式

CC2530 串口收发字符串

2022-03-08  本文已影响0人  Charles2018

1.实验目的

1) 通过实验掌握 CC2530 芯片串口配置与使用
2) 收到 PC 发送过来的数据,然后收到一整串数据之后,通过串口将改数据发送回去。
注:嵌入式开发中,当程序能跑起来后,串口是第一个要跑起来的设备,所有的工作状态, 交互信息都会从串口输出。我们用的是世界上最好的串口芯片 FT232,贵的 USB 串口线都用该芯 片。

2.实验设备

硬件:PC 机一台 ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:2000/XP/win7 系统,IAR 8.10 集成开发环境、串口助手

3.相关电路图

image.png

注:图中 0R 的电阻是空贴的哦 P0_2、P0_3 配置为外设功能时:P0_2 为 RX, P0_3 为 TX. USART0 和 USART1 是串行通 信接口,它们能够分别运行于异步 UART 模式或者同步 SPI 模式。两个 USART 具有同样的功 能,可以设置在单独的 I/O 引脚。此种串口设计是没有流控功能的。

4.相关寄存器

相关寄存器 UxCSR、UxCSR、UxGCR、UxBUF、UxBAUD、CLKCONCMD、CLKCONSTA


image.png image.png image.png

由寄存器UxBAUD.BAUD_M[7:0]和UxGCR.BAUD_E[4:0]定义波特率。该波特率用于
UART 传送,也用于SPI 传送的串行时钟速率。波特率由下式给出:

F 是系统时钟频率,等于 16 MHz RCOSC 或者 32 MHz XOSC。

32 MHz 系统时钟常用的波特率设置


image.png

CC2530 配置串口的一般步骤:
1、配置 IO,使用外部设备功能。此处配置 P0_2 和 P0_3 用作串口 UART0
2、配置相应串口的控制和状态寄存器。
3、配置串口工作的波特率。

由于此实验增加了串口接收功能,寄存器有所改变(红色部分),具体配置如下:
PERCFG = 0x00;  //位置1 P0 口 
P0SEL = 0x0c;   //P0_2,P0_3用作串口(外部设备功能)0000 1100 
P2DIR &= ~0XC0; //P0优先作为UART0 
U0CSR |= 0x80;   //设置为UART方式 1000 0000 
U0GCR |= 8;     //BAUD_E 
U0BAUD |= 59;   //波特率设为9600 根据上面表中获得的数据 
UTX0IF = 0;         //UART0 TX 中断标志初始置位0 

U0CSR |= 0x40; //允许接收 0100 0000
IEN0 |= 0x84; //开总中断允许接收中断

5.源码分析

#include <iocc2530.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char

//定义控制灯的端口
#define LED1 P1_0
#define LED2 P1_1
#define LED3 P0_4

void initUART0(void);
void InitialAD(void);
void UartTX_Send_String(uchar *Data,int len);

uchar Recdata[30]="hello zigbee!\r\n";
uchar RXTXflag = 1;
uchar temp;
uint  datanumber = 0;
uint  stringlen;

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

/****************************************************************
初始化串口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 |= 8;             
    U0BAUD |= 59;               //波特率设为9600
    UTX0IF = 1;                                 //UART0 TX中断标志初始置位1 
    
    U0CSR |= 0X40;              //允许接收
    IEN0 |= 0x84;               //开总中断,接收中断
}

/****************************************************************
主函数                         
****************************************************************/
void main(void)
{   
    P1DIR = 0x03;               //P1控制LED
    LED1 = 1;
    LED2 = 1;               //关LED
        LED3 = 1;
    initUART0();
        stringlen = strlen((char *)Recdata);
    UartTX_Send_String(Recdata,stringlen);              
    while(1)
    {
          if(RXTXflag == 1)              //接收状态
          {
            
            if( temp != 0)
            {
                LED2 = 0;                    //接收状态指示
                if((temp!='#')&&(datanumber<50))     //’#‘被定义为结束字符,最多能接收50个字符
                {          
                  Recdata[datanumber++] = temp;
                }
                else
                {
                  RXTXflag = 3;                      //进入发送状态
                }
                
                if(datanumber == 50)
                  RXTXflag = 3;
                
              temp  = 0;    
            }
          }
          if(RXTXflag == 3)         //发送状态
          {
            UartTX_Send_String("send:",5);
            
            LED1 = 0;                   //发送状态指示
            
            U0CSR &= ~0x40;         //不能收数
            UartTX_Send_String(Recdata,datanumber);
            UartTX_Send_String("\r\n",2);
            U0CSR |= 0x40;          //允许接收
            
            RXTXflag = 1;               //恢复到接收状态
            datanumber = 0;         //指针归0
            LED1 = 1;                   //关发送指示
            LED2 = 1;   
            memset(Recdata, 0, sizeof(Recdata));
          }
    }
}
/****************************************************************
串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp.
****************************************************************/
#pragma vector = URX0_VECTOR
 __interrupt void UART0_ISR(void)
 {
    URX0IF = 0;             //清中断标志
    temp = U0DBUF;                          
 }

6、实验现象

COM4 是我的 USB 转串口在电脑上生成的,查看方法“我的电脑”->“设备管理器”,
如图:


image.png

把程序下到开发板上,同时把 USB 线接到 PC 上,PC 上的串口设置下图,在串口工具的发
送区写入要发送的字符并以 # 号结束,如“abcdefg#”,点发送,开发板收到后,会发送到串 口工具上。开发板收到字符后 D2 会闪烁下,进入发送状态时 D1 灯会闪一下。

image.png
上一篇 下一篇

猜你喜欢

热点阅读