CC2540开发板学习笔记(五)——串口通信
(一)串口发送
一、实验现象:
开发板实现功能发送
二、实验过程
1、PL2303 USB转串口电路图

2、串口发送
(1)查看用户手册有:
UART0 对应的外部设备 IO 引脚关系为: P0_2 ------ RX
P0_3 ------ TX
UART1 对应的外部设备 IO 引脚关系为: P0_5 ------ RX
P0_4 ------ TX
(2)USART功能特点:
在 CC2540中, UART0和UART1是串行通信接口,它们能够分别运于异步UART模式或者同步SPI模式两个模式。两个UART的功能是一样,可以通过设置在单独的 IO引脚上。
UART 模式的操作具有下列特点:
①8位或者 9位负载数据
②奇校验、偶校验或者无奇偶校验
③配置起始位和停止电平
④配置 LSB 或者 MSB 首先传送
⑤独立收发中断
⑥独立收发 DMA 触发
(3)CC2540配置串口的一般步骤
① 配置 IO,使用外部设备功能。 此处配置 P0_2 和 P0_3用作串口 UART0
② 配置相应串口的控制和状态寄存器。 此处配置 UART0 的工作寄存器
③ 配置串口工作的波特率。 此处配置波特率为115200
(4)寄存器的相关内容:
| U0CSR (UART0控制和状态寄存器) |
BIT7:MODE | 0:SPI模式 1:UART模式 |
| BIT6:RE | 0:接收器进制 1:接收器使能 | |
| BIT5:SLAVE | 0:SPI主模式 1:SPI从模式 | |
| BIT4:FE | 0:没有检测到出帧错误 1:收到字节停止位电平出错 |
|
| BIT3:ERR | 0:没有检测出奇偶检验出错 1:收到字节奇偶检验出错 |
|
| BIT2:RX_BYTE | 0:没有收到字节 1:收到字节就绪 |
|
| BIT1:TX_BYTE | 0:没有发送字节 1:写到数据缓冲区寄存器的最后字节已发送 |
|
| BIT0:ACTIVE | 0:UART空闲 1:UART忙碌 |
|
| U0GCR (UART0通用控制寄存器) |
BIT7:CPOL | 0:SPI负时钟极性 1:SPI正时钟极性 |
| BIT6:CPHA | 0:当来自CPOL的SCK反相之后又返回CPOL时,数据输出到 MOSI;当来自CPOL的SCK返回CPOL反相时,输入数据采样到MISO。 1:当来自CPOL的SCK反相之后又返回CPOL时,输入数据采样MOSI;当来自CPOL的SCK返回CPOL反相时,数据输出到 MOSI。 |
|
| BIT5:ORDER | 0:LSB先传送 1:MSB先传送 |
|
| BIT[4,0]:BAUD_E | 波特率指数值 BAUD_E连同BAUD_M一起决定了UART的波特率 | |
| U0BAUD UART0 波特率控制寄存器 |
BIT[7,0]:BAUD_M | 波特率尾数值 BAUD_E连同BAUD_M一起决定了UART的波特率 |
| U0DBUF | 串口发送/接受数据缓冲区 | |
| UTX0IF 发送中断标志 |
中断标志5IRCON2的BIT1 | 0:中断未挂起 1:中断挂起 |
(5)串口波特率设置
公式如下:

常用波特率设置:

(6)代码实现:
#include<ioCC2540.h>
#include <string.h> #define uint unsigned int
#define uchar unsigned char //定义LED的端口
#define LED1 P1_0
#define LED2 P1_1 //函数声明
void Delay_ms(uint);
void initUART(void);
void UartSend_String(char *Data,int len); char Txdata[19]; //存放"Hello BlueTooth4.0\n"共19个字符串 /****************************************************************
延时函数
****************************************************************/
void Delay_ms(uint n)
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<1774;j++);
} void IO_Init()
{
P1DIR = 0x01; //P1_0,P1_1 IO方向输出
LED1 = 0;
} /****************************************************************
串口初始化函数
****************************************************************/
void InitUART(void)
{
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x0c; //P0_2,P0_3用作串口(外部设备功能)
P2DIR &= ~0XC0; //P0优先作为UART0 U0CSR |= 0x80; //设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 0; //UART0 TX中断标志初始置位0
}
/****************************************************************
串口发送字符串函数
****************************************************************/
void UartSend_String(char *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为32M
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
IO_Init();
InitUART();
strcpy(Txdata,"Hello BlueTooth4.0\n"); //将发送内容copy到Txdata;
while(1)
{
UartSend_String(Txdata,sizeof("Hello BlueTooth4.0\n")); //串口发送数据
Delay_ms(500); //延时
LED1=!LED1; //标志发送状态
}
}
三、实验成果:

PS:串口驱动,不行去百度下一个,然后更新驱动程序,在列表中选择,直到选到一个能用的。。真是无底坑。
(二)串口接受和发送
一、实验现象:
开发板实现收发
二、实验过程
原理部分同上,直接上源码
#include<ioCC2540.h>
#include<string.h> //宏定义
#define LED1 P1_0
#define LED2 P1_1 //函数声明
void Delay_ms(unsigned int delay); //延时函数
void IO_init(); //IO配置
void UART_init(); //初始化UART
void Send_String(char *Data,int len); //发送字符串函数 //变量声明
char temp=0; //接收到的字符
char Strdata[60]; //存放字符串 //延时函数
void Delay_ms(unsigned int delay)
{
unsigned int i,j;
for(i=delay;i>0;i--)
{
for(j=0;j<1774;j++);
}
} //IO配置
void IO_init()
{
P1SEL=0x00;
P1DIR=0X03;
P1INP=0X00; LED1=0;
LED2=0;
} //初始化UART
void UART_init()
{
PERCFG=0X00; //位置一:P0口
P0SEL=0X3c; //P0_2,P0_3,P0_4,P0_5用作第三用途
P2DIR &= ~0XC0; //方向为输入 U0CSR|=0X80; //设置UART方式
U0GCR|=11;
U0BAUD|=216; //设置波特率
UTX0IF=0; //清除中断标志位 //用来接收字符
U0CSR |= 0x40; //允许接收
IEN0 |= 0x84; //开总中断,接收中断
} //发送字符串函数
void Send_String(char *Data,int len)
{
unsigned int i;
for(i=0;i<len;i++)
{
//U0DBUF = *Data++; //两种方法都可以
U0DBUF = Data[i];
while(UTX0IF==0); //发送完一个字符后,会产生一个中断。我们通过等待中断产生,来控制传输时间间隔。
UTX0IF = 0;
}
} void main()
{
int datanumber = 0; //统计字符长度
int RXTXflag = 1; //接收状态标志变量 CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ。 IO_init(); //初始化
UART_init(); strcpy(Strdata,"Hello World~\n"); while(1)
{
if(RXTXflag == 1) //接收状态
{
LED1 = 1; //接收状态表示
if(temp!=0)
{
if((temp!='#')&&(datanumber<50)) //最多接收50个字符,和以#号结束
{
Strdata[datanumber++] = temp;
}
else
{
RXTXflag=3; //进入发送状态
LED1=0; //关指示灯
}
temp=0;
}
} if(RXTXflag == 3)
{
LED2=1; //发送状态表示
U0CSR &= ~0X40; //禁止接收
Send_String(Strdata,datanumber);
U0CSR |= 0x40; //允许接受
RXTXflag = 1; //恢复到接收状态
datanumber = 0; //指针归0
LED2 = 0; //关发送提示
}
} } //一个个拿出发送的字符,使用中断的手段
#pragma vector = URX0_VECTOR
__interrupt void fu(void)
{
URX0IF=0; //清除中断标志
temp=U0DBUF;
}
三、实验结果

(三)UART0控制LED
一、实验现象:
开发板实现UARTO控制LED
二、实验过程
原理部分同上,直接上源码
#include<ioCC2540.h>
#include<string.h> //宏定义
#define LED1 P1_0
#define LED2 P1_1 //函数声明
void Delay_ms(unsigned int delay); //延时函数
void IO_init(); //IO配置
void UART_init(); //初始化UART
void Send_String(char *Data,int len); //发送字符串函数 //变量声明
char temp=0; //接收到的字符
char Strdata[60]; //存放字符串 //延时函数
void Delay_ms(unsigned int delay)
{
unsigned int i,j;
for(i=delay;i>0;i--)
{
for(j=0;j<1774;j++);
}
} //IO配置
void IO_init()
{
P1SEL=0x00;
P1DIR=0X03;
P1INP=0X00; LED1=0;
LED2=0;
} //初始化UART
void UART_init()
{
PERCFG=0X00; //位置一:P0口
P0SEL=0X3c; //P0_2,P0_3,P0_4,P0_5用作第三用途
P2DIR &= ~0XC0; //方向为输入 U0CSR|=0X80; //设置UART方式
U0GCR|=11;
U0BAUD|=216; //设置波特率
UTX0IF=0; //清除中断标志位 //用来接收字符
U0CSR |= 0x40; //允许接收
IEN0 |= 0x84; //开总中断,接收中断
} //发送字符串函数
void Send_String(char *Data,int len)
{
unsigned int i;
for(i=0;i<len;i++)
{
//U0DBUF = *Data++; //两种方法都可以
U0DBUF = Data[i];
while(UTX0IF==0); //发送完一个字符后,会产生一个中断。我们通过等待中断产生,来控制传输时间间隔。
UTX0IF = 0;
}
} void main()
{
int datanumber = 0; //统计字符长度
int RXTXflag = 1; //接收状态标志变量 CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ。 IO_init(); //初始化
UART_init(); while(1)
{
if(RXTXflag == 1) //接收状态
{ if(temp!=0)
{
if((temp!='#')&&(datanumber<50)) //最多接收50个字符,和以#号结束
{
Strdata[datanumber++] = temp;
}
else
{
RXTXflag=3; //进入发送状态
}
temp=0;
}
} if(RXTXflag == 3)
{
if( Strdata[0]=='L')
{
switch( Strdata[1]-'0')
{
case 1: LED1=~LED1;break; //低电平点亮
case 2: LED2=~LED2;break;
}
} RXTXflag = 1; //恢复到接收状态
datanumber = 0; //指针归0 }
} } #pragma vector = URX0_VECTOR
__interrupt void fu(void)
{
URX0IF=0; //清除中断标志
temp=U0DBUF;
}
三、实验结果

CC2540开发板学习笔记(五)——串口通信的更多相关文章
- CC2540开发板学习笔记(三)——外部中断
一.实验内容 通过外部中断方式依次按下按键S1控制LED1的亮灭 二.实验过程 1.电路原理图同上 2.中断的概念 比如说我们在执行main函数时,突然来了个指令.优先级比现在执行的main还高,那我 ...
- CC2540开发板学习笔记(二)——按键
一.实验内容 用按键S1控制LED1的亮和灭 二.实验过程 1.电路原理: 可以看出,当S按下P0.0和P0.1接地,反之则接高电压. 2.寄存器使用: 依旧应该首先进行3个基本寄存器的设定,对LED ...
- CC2540开发板学习笔记(九)—— BLE协议简介
一.BLE协议简介 1.协议是什么? 协议是一系列的通信标准,双方需要共同按照这进行正常数据 协议是一系列的通信标准,双方需要共同按照这进行正常数据发射和 接收.协议栈是的具体实现形式,通俗点来理解就 ...
- CC2540开发板学习笔记(七)—— 睡眠唤醒
(一)中断唤醒 一.实验内容 通过中断唤醒在睡眠模式下的CC2540 二.实验原理 1.系统电源管理(工作方式) (1)全功能模式: 高频晶振(16M或者32M)和低频晶振(32.768K RCOSC ...
- CC2540开发板学习笔记(六)——AD控制(自带温度计)
一.实验目的 将采集的内部温度传感器信息通过串口发送到上位机 二.实验过程 1.寄存器配置 ADCCON1(0XB4)ADC控制寄存器1 BIT7:EOC ADC结束标志位0:AD转换进行中 ...
- CC2540开发板学习笔记(一)——LED点亮
一.实验内容: 点亮LDE1.2 二.实验原理: 1.电路原理图: 就一个发光二极管串联一个电阻.电阻是为了防止电流过大.利用发光二极管的单向导电性,在P1为高电平是点亮LED,在低电平是熄灭LED. ...
- CC2540开发板学习笔记(八)—— 看门狗
一.功能: 防止程序跑飞,使得系统重新进入工作状态,即一种复位操作吧. 但需要不停地喂狗= =(就是不断的执行某种操作),假如说你的程序跑到了不知道哪里去的错误时,即不会实现喂狗,就会发生复位,程序就 ...
- CC2540开发板学习笔记(四)——定时器
一.实验内容 分别使用定时器T1和T3使得LED周期性闪烁 二.实验过程 1.定时器T1(查询IRCON来控制) (1)需要调配的寄存器 T1CTL(0XE4) Timer1控制寄存器 BIT3, ...
- 【转帖】4412ARM开发板学习笔记(一)
本文转自迅为论坛:http://www.topeetboard.com 新手在进行开发学习前,建议先看01-迅为电子开发板入门视频.对开发板和开发环境有一定的了解后,不要盲目接线开机.以下是个人的一点 ...
随机推荐
- try catch finally执行顺序
1.不管有木有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return表达式运算后前执行的,所以函数返回值 ...
- Java finally语句到底是在return之前还是之后执行?
网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下fina ...
- android-解决 Android N 上 报错:android.os.FileUriExposedException
解决 Android N 上 安装Apk时报错:android.os.FileUriExposedException: file:///storage/emulated/0/Download/appN ...
- linux 下安装开发组件包
最初安装redhat 时, 系统自己装的,只安装了base 包,在开发过程中,需要不停的安装某个需求包, 图省事,安装光盘下的开发组件包: 在安装光盘下,,,用命令: yum grouplist ...
- Java面试宝典2015版(绝对值得收藏超长版)
31.String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有? 没有.因为Str ...
- 基础知识系列☞GET和POST→及相关知识
参考资料: [1].<IT企业必读的200个.Net面试题> [2].http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.htm ...
- tyvj1213 嵌套矩形
描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如 ...
- function foo(){}、(function(){})、(function(){}())等函数区别分析
前面一段时间,看到(function(){}),(function(){}())这些函数就犯晕,不知道它到底是什么意思,为什么函数外要加小括号,函数后要加小括号,加和不加到底有什么区别……一直犯迷糊, ...
- iOS 中的frame,bounds,center,transform关联
这里有一篇好文章 http://www.winddisk.com/2012/06/07/transform/ 先看几个知识点,UIView 的frame,bounds,center,transform ...
- 将文件放到Android模拟器的SD卡
1.打开DDMS页面2.打开File Explorer页,如果没有,在Window –> Show View –>File Explorer3.一般就在mnt –> sdcard中4 ...