CC2530的串口通信原理与应用_简述cc2530的uart串口接收数据原理(1)

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

UxUCR: USARTx UART控制寄存器
UxGCR: USARTx 通用控制寄存器
UxBUF: USARTx UART接受/发送数据缓冲区
UxBAUD: USARTx 波特率控制寄存器

1.1.CC2530的UART串口引脚的映射关系

两个USART接口具有相同的功能,通过PERCFG寄存器可以设置两个USART接口对应外部I/O引脚的映射关系
在这里插入图片描述

1.2.PERCFG外设控制寄存器

在这里插入图片描述

2.波特率的计算与设置

CC2530的波特率有BAUD_E和BAUD_M共同决定:
在这里插入图片描述
F为系统时钟频率,16MHz或32MHz

TI公司提供的数据手册中,给出了32MHz系统时钟频率下各种常用波特率的参数值
在这里插入图片描述
由计算公式可已计算出16MHz系统时钟频率下对应的参数值

  1. 16MHz下9600波特率的UxBAUD.BAUD_M:U0BAUD = 59
  2. 16MHz下9600波特率的UxGCR.BAUD_E:U0GCR = 9

3.串口0的UART初始化设置

void Init\_Uart0(){

    //端口配置
    PERCFG &= ~0x01;    //将串口0的引脚映射到位置1,即P0\_2和P0\_3
    P0SEL = 0x0C;       //将P0\_2和P0\_3端口设置为外设功能
    
    /\*======使用CC2530的内部16MHz晶振产生9600的波特率====\*/
    
    //波特率配置
    U0BAUD = 59;
    U0GCR = 9;
    
    //流控配置
    U0UCR |= 0x80;      //禁止流控,8位数据,清楚缓冲器
    
    //串口模式配置
    U0CSR |= 0xC0;      //选择UART模式,使能接收器

    //中断配置
    UTX0IF = 0;         //清除TX发送中断标志
    URX0IF = 0;         //清除RX接收中断标志
    URX0IE = 1;         //使能URAT0的接收中断
    EA = 1;             //使能总中断
}

4.案例

4.1.串口数据发送

要求:

  1. USART0选择UART模式,波特率9600,I/O引脚映射到备用位置1
  2. 利用看门狗定时器的定时功能实现1秒定时
  3. 在看门狗中断服务模式中,由串口向上机位发送“Hello World!”,回车换行
    D5等作为数据发送指示灯,在字符串发送前点亮,字符串发送结束后熄灭
    在这里插入图片描述

代码:

#include "ioCC2530.h"

#define D5 P1\_3

/\*=============系统时钟切换16MHz→32MHz(32MHz更为准确)====================\*/
void Set\_Clock\_32M(){
  CLKCONCMD &= ~0x40;        //选择系统时钟源为32MHz晶振
  while(CLKCONCMD & 0x40);   //等待晶振稳定
  CLKCONCMD &= ~0x47;        //设置系统主时钟频率为32MHz
}

/\*========================端口初始化函数====================================\*/
void Init\_Port(){
  //初始化LED灯的I/O口
  P1SEL &= ~0x1B;            //P1\_0、P1\_1、P1\_3和P1\_4作为通用I/O口
  P1DIR |= 0x1B;             //P1\_0、P1\_1、P1\_3和P1\_4端口输出
  P1 &= ~0x1B;               //关灯D3~D6
}

/\*==============================串口初始化函数==============================\*/
void Init\_Uart0(){
  //设置串口引脚功能,将P0\_2、P0\_3设置成外设功能
  PERCFG &= ~0x01;
  P0SEL |= 0x0C;             
  //设置串口波特率:32MHz——9600 中文手册P144
  U0BAUD = 59;
  U0GCR = 8;
  //设置UART控制U0UCR
  U0UCR |= 0x80;
  //设置控制与状态寄存器
  U0CSR |= 0xC0;
}

/\*===============看门狗初始化函数,设置为定时器模式=========================\*/
void Init\_WDT(){
  WDCTL = 0x0C;
  INE2 |= 0x20;
  EA = 1;
}

/\*==================看门狗定时1秒中断服务函数===============================\*/
#pragma vector = WDT\_VECTOR
__interrupt void Service\_WDT(){
  WDTIF = 0;
  DS = 1;
  UR0\_SendString("Hello World!\r\n");
  D5 = 0;
}

/\*=====================串口字节发送函数=====================================\*/
void UR0\_SendByte(unsigned char dat){
  U0DBUF = dat;
  while(UTX0IF == 0);
  UTX0IF = 0;
}

/\*=============================串口字符发送函数=============================\*/
void UR0\_SendString(unsigned char \*str){
  while(\*str != '\0'){
    UR0\_SendByte(\*str++);
  }
}

/\*=====================================main函数=============================\*/
void main(){
  Set\_Clock\_32M();
  Init\_Port();
  Init\_Uart0();
  Init\_WDT();
  while(1){}
}

4.2.串口数据收发

要求:

  1. USART0选择UART模式,波特率9600,I/O引脚映射到备用位置1
  2. 串口接受到上位机的一个数据后,在原值上加1,发回上位机
  3. D3灯作为数据接受指示灯,在收到一个数据后,D3灯亮
  4. D5灯作为数据发送指示灯,在数据发送之前亮,在数据发送完成后,D3灯与D5灯同时熄灭
    在这里插入图片描述

代码:

#include "ioCC2530.h"

#define D3 P1\_0
#define D5 P1\_3

/\*=============系统时钟切换16MHz→32MHz(32MHz更为准确)====================\*/
void Set\_Clock\_32M(){
  CLKCONCMD &= ~0x40;        //中文手册P60
  while(CLKCONCMD & 0x40);   //中文手册P61
  CLKCONCMD &= ~0x47;        //中文手册P60
}

/\*========================端口初始化函数====================================\*/
void Init\_Port(){
  P1SEL &= ~0x1B;            //中文手册77
  P1DIR |= 0x1B;
  P1 &= ~0x1B;               //关灯D3~D6
}

/\*==============================串口初始化函数==============================\*/
void Init\_Uart0(){
  //设置串口引脚功能,将P0\_2、P0\_3设置成外设功能,中文手册P72、P77
  PERCFG &= ~0x01;
  P0SEL |= 0x0C;             
  //设置串口波特率:32MHz——9600 中文手册P144
  U0BAUD = 59;
  U0GCR = 8;
  //设置UART控制U0UCR,中文手册P146
  U0UCR |= 0x80;
  //设置控制与状态寄存器U0CSR,中文手册P145
  U0CSR |= 0xC0;              //UART模式
  //清除中断标志
  UTX0IF = 0;
  URX0IF = 0;
}

/\*================================串口字节发送函数==========================\*/
void UR0\_SendByte(unsigned char dat){
  U0DBUF = dat;
  while(UTX0IF == 0);
  UTX0IF = 0;
}

/\*=========================串口数据接受完成的中断服务函数===================\*/
#pragma vector = URX0\_VECTOR
__interrupt void Service\_UR0Recv(){
  D3 = 1;
  unsigned char tmp;
  tmp = U0DBUF;
  tmp++;
  D5 = 1;
  UR0\_SendByte(temp);
  D3 = 0;
  D5 = 0;
}

/\*=====================================main函数=============================\*/
void main(){
  Set\_Clock\_32M();
  Init\_Port();
  Init\_Uart0();
  while(1){}
}

4.3.串口命令控制LED灯开关

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

也很简单,就是希望能够帮助到想自学提升的朋友。**
[外链图片转存中…(img-DJYXE3ti-1715707652846)]
[外链图片转存中…(img-PNnhorRF-1715707652847)]

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

SPI、UART和I2C是常见的串行通信接口,它们之间的通信原理有以下区别: 1. SPI(Serial Peripheral Interface)是一种同步串行接口,使用四根线进行通信:一根时钟线、一根主设备输出从设备输入的数据线、一根从设备输出主设备输入的数据线、一根片选线。SPI通信时,主设备通过时钟线控制数据的传输,并通过片选线选择与之通信的从设备,从设备则在时钟的控制下向主设备传输数据。 2. UART(Universal Asynchronous Receiver Transmitter)是一种异步串行接口,使用两根线进行通信:一根传输数据的线、一根控制数据传输的线(如:数据位、波特率、校验位等)。UART通信时,数据以固定的帧格式进行传输,每个帧由起始位、数据位、可选的校验位和停止位组成。传输数据时,发送端和接收端都需要使用相同的帧格式进行数据交换。 3. I2C(Inter-Integrated Circuit)是一种同步串行接口,使用两根线进行通信:一根时钟线、一根数据线。I2C通信时,主设备通过时钟线控制数据的传输,并通过地址线选择与之通信的从设备,从设备则在时钟的控制下向主设备传输数据。I2C协议还支持多主设备共享同一条总线的通信,从而实现多个设备之间的互联。 总的来说,SPI通信速度快,可支持多从设备;UART通信简单,可支持长距离传输;I2C通信线路简单,可支持多主设备共享总线。不同的串行通信接口适用于不同的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值