收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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系统时钟频率下对应的参数值
- 16MHz下9600波特率的UxBAUD.BAUD_M:U0BAUD = 59
- 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.串口数据发送
要求:
- USART0选择UART模式,波特率9600,I/O引脚映射到备用位置1
- 利用看门狗定时器的定时功能实现1秒定时
- 在看门狗中断服务模式中,由串口向上机位发送“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.串口数据收发
要求:
- USART0选择UART模式,波特率9600,I/O引脚映射到备用位置1
- 串口接受到上位机的一个数据后,在原值上加1,发回上位机
- D3灯作为数据接受指示灯,在收到一个数据后,D3灯亮
- 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年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
也很简单,就是希望能够帮助到想自学提升的朋友。**
[外链图片转存中…(img-DJYXE3ti-1715707652846)]
[外链图片转存中…(img-PNnhorRF-1715707652847)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!