「嵌入式开发」 CC2530卷二 串口通信

关键字:CC2530、ZigBee
摘要: 关于CC2530的学习总结2

一 串口通信配置部分

  • 配置内容
截屏2022-03-03 上午8.59.34

根据上述的相关寄存器说明,串口0的配置步骤如下:
(1)通过外设控制寄存器PERCFG配置串口0的位置,即配置P0_2和P0_3用作外设接口而不是普通IO口,接着配置P0优先用作USART0,代码如下:

1
2
3
PERCFG = 0x00;//配置P0_2和P0_3用作串口0的TX(发送端)和RX(接收端)
P0SEL = 0x3c;//配置P0_2和P0_3用作外设功能,而不是GPIO
P2DIR &= ~0xc0;//配置端口0优先用作USART0

(2)设置USART0工作模式为UART0,代码如下:

1
U0CSR |= 0x80;

(3)把串口通信的波特率配置115200,配置代码如下:

1
2
U0GCR  |= 11;//BAUD_E  
U0BAUD |= 216;//BAUD_M

其中的常用波特率配置见表。

波特率(bps) UxBAUD.BAUD_M UxGCR_BAUD_E 误差(%)
2400 59 6 0.14
4800 59 7 0.14
9600 59 8 0.14
14400 216 8 0.03
19200 59 9 0.14
28800 216 9 0.03
38400 59 10 0.14
57600 216 10 0.03
76800 59 11 0.14
115200 216 11 0.03
230400 216 12 0.03

(4)配置中断相关寄存器,代码如下:

1
2
3
4
UTX0IF = 0;// 清零UART0发送中断标志位    
URX0IF = 0;// 清零UART0接收中断标志位
URX0IE = 1;//使能串口0接收中断
EA = 1;//打开中断总开关

(5)启用串口0的数据接收功能,代码如下:

1
U0CSR |= 0x40;//启用数据接收功能

4.4 写串口数据收发的实现

打开本实验代码中的uart0.c文件,可以找到main函数,代码如下:

1
2
3
4
5
6
7
8
//2. 51单片机入门/4. 串口通信实验/Workspace/code/uart/uart0.c
void main()
{
setSystemClk32MHZ();//设置系统时钟频率为32MHz
initUart0();//初始化串口0

while(1) { }
}

4.4.1 setSystemClk32MHZ函数
在默认情况下,如前面章节所述CC2530的时钟频率为16MHz。开发者可以使用32MHz的外部晶振作为系统的时钟源,让CC2530的时钟频率提升至32MHz,从而提升CC2530的处理速度。配置步骤如下:
(1)通过CLKCONCMD配置外部的32MHz晶振作为系统时钟源。
(2)等待时钟源稳定。
(3)通过CLKCONCMD设置系统时钟频率为32MHz。
对应的配置代码如下:

1
2
3
4
5
6
7
/** @brief    设置系统时钟为32MHz
*/
#define setSystemClk32MHZ() do {
CLKCONCMD &= ~0x40;
while(CLKCONSTA & 0x40);
CLKCONCMD &= ~0x47;
} while(0)

4.4.2 串口0的初始化
通过以上分析,串口0初始化函数initUart0的定义代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
* 初始化串口0
*/
static void initUart0(void)
{
PERCFG = 0x00;//配置P0_2和P0_3用作串口0的TX(发送端)和RX(接收端)
P0SEL = 0x3c;//配置P0_2和P0_3用作外设功能,而不是GPIO
P2DIR &= ~0xc0;//配置端口0优先用作USART0

U0CSR |= 0x80;//设置USART0工作模式为UART0

/* 设置波特率为115200 */
U0GCR |= 11;//BAUD_E
U0BAUD |= 216;//BAUD_M

UTX0IF = 0;// 清零UART0发送中断标志位
URX0IF = 0;// 清零UART0接收中断标志位
URX0IE = 1;//使能串口0接收中断
EA = 1;//打开中断总开关

U0CSR |= 0x40;//启用数据接收功能
}

4.4.3 串口0的数据接收
在初始化串口0后,CC2530从串口0中接收到数据后便会产生中断。开发者只需要在对应的中断处理函数中处理接收到的数据即可,代码如下:

1
2
3
4
5
6
7
8
9
10
#pragma vector = URX0_VECTOR 
__interrupt void URX0_ISR(void)
{
uint8_t rxChar;

URX0IF = 0;//清零中断标志位

rxChar = U0DBUF;//U0DBUF存放了从串口0接收到的数据
uart0Send(&rxChar, 1); //通过串口0发送数据,即把从串口0接收到的数据又从串口0发送回去
}

4.4.4 串口0的数据发送
可以使用串口0发送数据给上位机(例如串口助手),发送一个字节的步骤如下:
(1) 把数据存放到串口0数据缓存寄存器U0DBUF中,U0DBUF中的数据会自动通过串口0发送出去。
(2)等待发送完成,数据发送完成后中断标志位被置为1。
(3)清零这个中断标志位。

在前面的串口数据接收中断处理函数中调用了uart0Send,uart0Send是由笔者编写的一个串口0数据发送函数,其函数定义代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @fn uart0Send
*
* @brief 通过串口0发送数据
*
* @param pMsg - 待发送数据的地址
* @param msgLen - 待发送数据的长度,以字节为单位

*
* @return none
*/
static void uart0Send(uint8_t *pMsg, uint8_t msgLen)
{
uint8_t i;
for (i = 0; i < msgLen; i++) {
U0DBUF = pMsg[i];//把数据存放到串口0数据缓存寄存器U0DBUF中
while (UTX0IF == 0);//等待发送完成
UTX0IF = 0;//清零中断标志位
}
}

4.5 调试仿真

可以运行本实验代码以观察运行结果,操作步骤如下:
(1)编译链接本实验代码后,把程序烧录到ZigBee开发板中。

(2)打开友善串口调试助手,并且使用Micro USB线把开发板连接到电脑。按如图所示设置波特率、数据位、校验位、停止位和流控,以及发送/接收的字符编码方式,然后点击“启动”按钮。

(3)在图所示输入框中输入字符串并点击发送,可以看到从串口助手发送给开发板的数据又会从开发板发送回来。

四 代码

1
2
3
4
5
//********************************************************************




六 串口数据控制小灯

完成了各引脚的基本配置(PxDIR、PxSEL)和中断的基本配置(四个)后,我们通过外部中断(Key)控制了小灯点亮。

下一步将继续就串口通信的部分进行学习和练习。

七 文献及资料整理

「资料整理」

·Torch目录