目录

  • 1.CC2530的串口资源
    • 1.1.CC2530的UART串口引脚的映射关系
    • 1.2.PERCFG外设控制寄存器
  • 2.波特率的计算与设置
  • 3.串口0的UART初始化设置
  • 4.案例
    • 4.1.串口数据发送
    • 4.2.串口数据收发
    • 4.3.串口命令控制LED灯开关

1.CC2530的串口资源

CC2530有两个串行通信接口:异步UART模式: USART0和同步SPI模式: USART1

对于每个USART外设,有5个相关的寄存器(x时USART的编号,0或1)

UxCSR: USARTx 控制状态寄存器
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_3P0SEL = 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  中文手册P144U0BAUD = 59;U0GCR = 8;//设置UART控制U0UCRU0UCR |= 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;        //中文手册P60while(CLKCONCMD & 0x40);   //中文手册P61CLKCONCMD &= ~0x47;        //中文手册P60
}/*========================端口初始化函数====================================*/
void Init_Port(){P1SEL &= ~0x1B;            //中文手册77P1DIR |= 0x1B;P1 &= ~0x1B;               //关灯D3~D6
}/*==============================串口初始化函数==============================*/
void Init_Uart0(){//设置串口引脚功能,将P0_2、P0_3设置成外设功能,中文手册P72、P77PERCFG &= ~0x01;P0SEL |= 0x0C;             //设置串口波特率:32MHz——9600  中文手册P144U0BAUD = 59;U0GCR = 8;//设置UART控制U0UCR,中文手册P146U0UCR |= 0x80;//设置控制与状态寄存器U0CSR,中文手册P145U0CSR |= 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灯开关

要求:

  1. USART0选择UART模式,波特率9600,I/O引脚映射到备用位置1
  2. 命令字"0xA1",点亮D4,操作完成后,返回"D4 is open!"
  3. 命令字"0xA2",关闭D4,操作完成后,返回"D4 is closed!"
  4. 命令字"0xA1",点亮D6,操作完成后,返回"D6 is open!"
  5. 命令字"0xA1",关闭D6,操作完成后,返回"D6 is closed!"

代码:

#include "ioCC2530.h"#define D3 P1_0
#define D4 P1_1
#define D5 P1_3
#define D6 P1_4unsigned char cmd = 0;        //存放上机位PC发送过来的数据/*=============系统时钟切换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;               //关闭所有LED灯
}/*==============================串口初始化函数==============================*/
void Init_Uart0(){//端口相关的配置——设置TXD和RXD引脚的外设功能PERCFG &= ~0x01;           //串口0的引脚映射到位置1,即P0_2和P0_3P0SEL |= 0x0C;             //将P0_2和P0_3端口设置成外设功能//波特率相关配置U0BAUD = 59;               //32MHz的系统时钟产生9600BPS的波特率U0GCR = 8;                 //16MHz——9,32MHz——8//串口属性相关配置——UART控制寄存器U0UCR |= 0x80;             //禁止流控,8位数据,清除缓冲器//串口属性相关配置——设置串口的工作模式:UART、使能接受U0CSR |= 0xC0;             //UART模式,使能接收器//串口中断相关配置——清除中断标志UTX0IF = 0;                //清除TX发送中断标志URX0IF = 0;                //清除RX接收中断标志//串口中断香瓜配置——使能串口中断接受URX0IF = 1;                //使能UART0的接收中断EA = 1;                    //使能总中断
}/*================================串口字节发送函数==========================*/
void UR0_Send_Byte(unsigned char dat){U0DBUF = dat;              //将要发送的1字节数据写入U0DBUFwhile(UTX0IF == 0);        //等待TX中断标志,即数据发送完成UTX0IF = 0;                //清除TX中断标志,准备下一次发送
}/*=============================串口字符发送函数=============================*/
void UR0_Send_String(unsigned char *str){while(*str != '\0'){       //发送一个字符串UR0_SendByte(*str++);    //逐个发送字符串字节}
}/*=========================串口数据接受完成的中断服务函数===================*/
#pragma vector = URX0_VECTOR
__interrupt void Service_UR0Recv(){cmd = U0DBUF;              //将控制命令字节从缓冲区取出F_UR0_Recv = 1;            //标志成功接收上位机的单字节命令
}/*=============================命令控制LED灯开关============================*/
void Control_LED(){switch(cmd){case 0xA1D4 = 1;UR0_Send_String("D4 is open!\r\n");break;case 0xA2D4 = 0;UR0_Send_String("D4 is closed!\r\n");break;case 0xB1D6 = 1;UR0_Send_String("D6 is open!\r\n");break;
case 0xB2D6 = 0;UR0_Send_String("D6 is closed!\r\n");break;}
}/*=====================================main函数=============================*/
void main(){Init_Clock_32M();Init_Port();Init_Uart0();while (1){if (cmd != 0){control_LED();}}
}

CC2530的串口通信原理与应用相关推荐

  1. NXP(I.MX6uLL) UART串口通信原理————这个未复习

    参考:Linux NXP (I.MX6uLL) UART串口通信原理 作者:一只青木呀 发布时间: 2020-09-20 16:48:33 网址:https://blog.csdn.net/weixi ...

  2. 两个串口通信助手之间通信_串口通信原理

    LC串口通信原理 PLC各型主机均内建2个通信接口的标准配置,即一个RS232和一个RS485通信接口,其RS232接口主要用于上下载程序或用来与上位机.触摸屏通信,而RS485接口主要用于组建使用R ...

  3. 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

    目录 1. 串口通信原理 2. 51单片机串口通信 2.1 串口简要模式图 2.2 相关寄存器 (1)PCON.SCON.SBUF (2)IE.IPH.IP (3)配置T1定时器 2.3 波特率和系统 ...

  4. C/C++串口通信原理及读写与操作

    http://wangbaiyuan.cn/c-serial-communication-write-reading.html [展开]文章目录 在工业控制中,工控机(一般都基于Windows平台)经 ...

  5. 51单片机串口通信原理

    计算机串行通信基础 通信有串行通信和并行通信两种方式 串行通信: 将数据字节分为一位一位的形式在一条数据线上逐个传送.如下图所示         串行通信特点:传输线少,长距离传送时成本低,且可以利用 ...

  6. 51单片机的串口通信原理

    一.并行和串行通信方式 通信有并行和串行两种通信方式.在单片机系统以及现代单片机测控系统中信息交换多采用串行通信方式. 1.并行通信方式 并行通信通常是将数据字节的各位用多条数据线同时进行传送,每一位 ...

  7. 单片机学习笔记 —— 串口通信原理

    一.串口通信电路 电路图: 说明:当RXD TXD为低电平时,对应的led灯会亮起 二.串口通信控制寄存器 下图为80C51串行口的结构: SCON(serial Control Register): ...

  8. STM32串口通信原理及实验讲解

    串口通信基本原理 串口 串口,顾名思义,即为串行接口,是处理器与外部设备进行串行通信的接口.串行通信是指数据按位进行顺序传输,这种方法占用引脚资源少,但速度相对较慢.串行通信按数据传输方向可分为三种: ...

  9. ZYNQFPGA 串口通信原理

    串行通信基础知识 u处理器与外部设备通信的两种方式: 并行通信与串行通信 并行通信是指数据的各个位用多条数据线同时进行传输 : 优点:传输速度快 缺点:占用引脚资源多 串行通信是将数据分成一位一位的形 ...

最新文章

  1. CKeditor 配置使用
  2. 进程注入后门工具Cymothoa
  3. Java数组常见操作
  4. java程序员学习路线以及我的学习经验
  5. android图标错误的是什么意思啊,Android错误:找不到与给定名称匹配的资源(在icon处,值为@drawable/icon) - Android - srcmini...
  6. sql 语句按字段指定值排序及分页
  7. ORACLE中CONSTRAINT的四对属性
  8. sql初学者指南_初学者SQL示例:SQL SELECT语句的用法
  9. hdu_2476_String painter(区间DP)
  10. None of the configured nodes are available
  11. POI - 读取Excel2003、Excel2007的兼容性问题
  12. 《买土豆的故事》——经典职场故事
  13. Bzoj 2563: 阿狸和桃子的游戏 题解
  14. 关于用户表空间配额的问题
  15. 地理遥感专业属于计算机行业吗,遥感科学与技术专业怎么样?
  16. 山地自行车轮市场前景分析及行业研究报告
  17. Tableau Prep使用
  18. 【win10邮件客户端 设置QQ和163邮箱】
  19. 低成本 低功耗2.4G无线SOC芯片 nRF51802 低功耗 高性价比芯片
  20. 数字音乐大变局:不再有免费午餐

热门文章

  1. 如何统一设置Word 的图片属性
  2. 爱普生Epson TM-U120P 打印机驱动
  3. 服务器(vps)如何修改3389(rdp)端口
  4. laravel详细安装教程
  5. android maxlength 代码设置,如何在代码中获取EditText maxLength设置
  6. 彻底理解unity里的Time.deltatime
  7. 提取abaqus中节点集合的应力应变
  8. The Git repository at the following path is in the detached HEAD state
  9. java time sleep_TimeUnit类中的sleep() 和Thread.sleep()
  10. matlab凸透镜防仿真,西安邮电大学matlab仿真解剖.doc