lesson4下 Zigbee串口通信

目录

Zigbee串口通信

理论部分

实验部分

程序实现CC2530通过串口0与上位机通信(接收中断回显)

串口收发实验:实现按键按下发送字符串+串口接收中断回显(串口接收中断+外部中断)


Zigbee串口通信

理论部分

1.CC2530具有两个串口,并且每个串口都可以配置选择控制脚,注意串口工作必须是32M系统时钟

2.串口配置步骤

以串口0为例

(1)PERCFG第0位设置为0,表示指定串口的IO位置为备用位置1;设置为1,表示指定串口的IO位置为备用位置2

(2)配置IO为偏上外设功能:P0SEL |= 0x0C; //0000 1100

(3)U0CSR |= 0xC0;//8个数据位,1个停止位,无硬件流、无校验

(4)配置波特率:U0GCR = 11;U0BAUD = 216;//看表直接用

(5)开启总中断和串口中断:URX0IE=1;EA=1;

3.串口中断函数

实验部分

程序实现CC2530通过串口0与上位机通信(接收中断回显)

#include <iocc2530.h>
void delay_us()
{
  char k=63;
  while(k--);
}
void Init32M()
{
  SLEEPCMD &= ~(0x01<<1); //1111 1110 开启两个高频时钟源
  while(SLEEPSTA & 0x40==0);//0100 0000 等待32M稳定
  delay_us();
  CLKCONCMD &= 0xF8;//低3位清零 不分频输出
  CLKCONCMD &= 0xBF; //1011 1111 设置32M为系统主时钟
  while(CLKCONSTA & 0x40); //0100 0000 等待32M成功配置为当前系统主时钟
}

void Uart_Config()
{
  //串口0的备用位置1配置为波特率9600
  PERCFG &= 0xFE;//1111 1110 选中串口0的备用位置1
  P0SEL |= 0x0C; //0000 1100 配置P0_2 P0_3为偏上外设功能
  
  U0CSR |= 0xC0;
  U0GCR = 8;
  U0BAUD = 59; //9600
  EA=1;
  URX0IE=1;//开启串口接收中断
}
void main()
{
  Init32M();
  Uart_Config();
  while(1)
  {
    
  }
}

#pragma vector=URX0_VECTOR
__interrupt void UART0_IRQ(void)
{
  char ch;
  URX0IF = 0;//串口0接收标志位,硬件会自动置1,需要软件清0
  ch = U0DBUF;//从接收寄存器取字节存入ch
  U0DBUF = ch;//把变量ch的值传给串口发送寄存器
  while(UTX0IF == 0);//等待发送标志硬件置1
  UTX0IF = 0;
}

串口收发实验:实现按键按下发送字符串+串口接收中断回显(串口接收中断+外部中断)

#include <iocc2530.h>
void delay_us()
{
  char k=63;
  while(k--);
}
void Init32M()
{
  SLEEPCMD &= ~(0x01<<1); //1111 1110 开启两个高频时钟源
  while(SLEEPSTA & 0x40==0);//0100 0000 等待32M稳定
  delay_us();
  CLKCONCMD &= 0xF8;//低3位清零 不分频输出
  CLKCONCMD &= 0xBF; //1011 1111 设置32M为系统主时钟
  while(CLKCONSTA & 0x40); //0100 0000 等待32M成功配置为当前系统主时钟
}

void delay_ms(int ms)
{
  int i,j;
  for(i=ms;i>0;i--)
     for(j=587;j>0;j--);
}
void Uart_Config()
{
  //串口0的备用位置1配置为波特率9600
  PERCFG &= 0xFE;//1111 1110 选中串口0的备用位置1
  P0SEL |= 0x0C; //0000 1100 配置P0_2 P0_3为偏上外设功能
  
  U0CSR |= 0xC0;
  U0GCR = 8;
  U0BAUD = 59; //9600
  EA=1;
  URX0IE=1;//开启串口接收中断
}

void String_Print(unsigned char *str)
{
  for(;*str!='\0';str++)
  {
    //UTX0IF = 0;
    U0DBUF=*str;
    while(UTX0IF==0);
    UTX0IF=0;
  }
}
void Exti0_Config()
{
  P0SEL &= 0xFE;
  P0DIR &= 0xFE;
  P0INP &= 0xFE;
  P2INP &= 0xDF;
  
  P0IE = 1;
  P0IEN |= 0x01;
  EA = 1;
  PICTL |= 0x01;
}
void main()
{
  Init32M();
  Uart_Config();
  Exti0_Config();
  P1DIR |= 0x01;
  P1_0=0;
  while(1)
  {  
  }
}
#pragma vector=P0INT_VECTOR
__interrupt void exti_0()
{
  if(P0IFG &= 0x01)//P0_0引发了外部中断
  {
    delay_ms(100);//按键消抖
    P1_0=~P1_0; 
    String_Print("2023-6-18\n\r");  
  }
  P0IFG=0;
  P0IF=0;
}

#pragma vector=URX0_VECTOR//接收中断函数
__interrupt void UART0_IRQ(void)
{
  char ch;
  URX0IF = 0;//串口0接收标志位,硬件会自动置1,需要软件清0
  ch = U0DBUF;//从接收寄存器取字节存入ch
  U0DBUF = ch;//把变量ch的值传给串口发送寄存器
  while(UTX0IF == 0);//等待发送标志硬件置1
  UTX0IF = 0;
}

实验现象:

可参考CC2530串口通信

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹烟淮雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值