TI CC2530基礎實驗(串列埠程式設計——USART0收發測試總結)
無論學習哪款MUC串列埠對於我們進行實驗除錯都是非常方便實用的,可以把程式中涉及的某些中間量或者其他程式狀態資訊打印出來顯示在電腦上進行除錯,許多MUC和PC機通訊都是通過串列埠來進行的。
CC2530有兩個USB轉串列埠,分別是USART0和USART1。USART0和USART1是序列通訊介面,它們能夠分別運行於非同步UART模式或者同步SPI模式。兩個USART具體同樣的功能,可以設定在單獨的I/O引腳。檢視CC2530 datasheet的I/O外設引腳對映——72頁
根據上面的外設I/O引腳對映可知:
UART0對應的外部設定IO引腳關係為:位置1:P0_2----RX P0_3----TX 位置2:P1_4----RX P1_5----TX
UART1對應的外部設定IO引腳關係為:位置1:P0_5----RX P0_4----TX 位置2:P1_7----RX P1_6----TX
USART模式的操作具體下列特點:
1、8位或者9位負載資料
2、奇校驗、偶校驗或者無奇偶校驗
3、配置其實位和停止位電平
4、配置LSB(最低有效位)或MSB(最高有效位)首先傳輸
5、獨立接收中斷
6、獨立收發DMA觸發
注:在本次實驗中,使用的是UART0
電路原理圖:
CC2530暫存器:
- PERCFG:外設控制暫存器
- P2DIR : 埠2方向和埠0外設優先順序控制
- IEN0 :中斷使能0暫存器
- IRCON2:中斷標誌控制暫存器
- UxCSR:USARTx 控制和狀態暫存器
- UxUCR:USARTx 串列埠控制暫存器
- UxGCR:USARTx 通用控制暫存器
- UxBUF: USARTx 接收/傳送資料緩衝暫存器
- UxBAUD:USARTx 波特率控制暫存器
CC2530配置串列埠的一般步驟:
1、配置串列埠的備用位置,是備用位置1,還是備用位置2。配置暫存器PERCFG外設控制暫存器
2、配置IO,使用外部裝置功能。此處配置P0_2和P0_3用作串列埠UART0
3、配置埠的外設優先順序。此處配置P0外設優先作為UART0
4、配置相應串列埠的控制和狀態暫存器。此處配置UART0的工作暫存器
5、配置串列埠工作的波特率。此處配置為波特率115200
6、將對應的串列埠接收/傳送中斷標誌位清0,接收/傳送一個位元組都將產生一箇中斷,在接收時需要開總中斷和使能接收中斷,以及執行接收
程式:
/******************************************
* 基礎實驗只需要新增以下標頭檔案
******************************************/
#include <ioCC2530.h>
#define uint8 unsigned char //或typedef unsigned char uint;
#define uint16 unsigned int
char Rxdata[50];
uint8 RXTXflag = 1;
char temp;
uint8 datanumber = 0;
/******************************************
* 函式描述:串列埠0初始化
* 115200,8位資料位,無校驗,1位停止位
******************************************/
/******************************************
* CC253O 32M系統時鐘波特率引數表 *
*----------------------------------------*
* 波特率 UxBAUD.BAUD_M UxBAUD.BAUD_M *
* 240 59 6 *
* 4800 59 7 *
* 9600 59 8 *
* 14400 216 8 *
* 19200 59 9 *
* 28800 216 9 *
* 38400 59 10 *
* 57600 216 10 *
* 76800 59 11 *
* 115200 216 11 *
* 23040 216 12 *
*****************************************/
void UartInit(void)
{
PERCFG = 0x00; //設定UART0的備用位置為P0口,即UART0的RX-P0_2,TX-P0_3
P0SEL = 0x3c; //設定P0_2,P0_3為外設功能
P2DIR &= ~0xc0; //配置P0埠優先作為UART0
/*設定USART0的方式*/
U0CSR |= 0x80; //SPI同步模式
/*設定USART0的波特率,115200*/
U0GCR |= 11;
U0BAUD |= 216;
/*將UART0中斷標誌位清0*/
UTX0IF = 0; //清除UART0傳送中斷標誌位
URX0IF = 0; //清除UART0接收中斷標誌位
/*開總中斷,以及使能串列埠0接收中斷*/
IEN0 |= 0x80; //開總中斷
IEN0 |= 0x04; //使能串列埠0接收中斷
/*執行串列埠0接收*/
U0CSR |= 0x40;
}
/******************************************
* 函式描述:串列埠0傳送字串函式
******************************************/
void UartSendString(char *Data, uint16 len)
{
uint16 j;
for (j = 0; j < len; j++)
{
U0DBUF = *Data++;
for (; 0 == UTX0IF ;);
UTX0IF = 0;
}
}
/******************************************
* 函式描述:32M系統時鐘下的毫秒延時函式
******************************************/
void Delay_ms(uint16 ms)
{
uint16 i,j;
for(i = 0; i < ms; i++)
{
for(j = 0;j < 1774; j++);
}
}
/******************************************
* 函式描述:串列埠0接收中斷服務程式
******************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; //清中斷標誌
temp = U0DBUF; //將串列埠接收緩衝的資料存放到temp中,temp是char型別,即8位資料位
}
void main()
{
CLKCONCMD &= ~0x40; //設定系統時鐘源為32MHz晶振
for(; CLKCONSTA & 0x40;); //等待晶振穩定
CLKCONCMD &= ~0X47; //設定系統主時鐘頻率為32MHz
UartInit();
UartSendString("send test.",sizeof("send test."));
for (;;)
{
if (1 == RXTXflag) //串列埠接收狀態
{
if (temp != 0)
{
if ((temp != '#')&&(datanumber<50)) //'#'被定義為結束字元,最多能接收50個字元
Rxdata[datanumber++] = temp; //接收一個位元組,產生一次中斷,只有接收到'#'或長度大於50
else
{
RXTXflag = 2; //進入傳送狀態
}
temp = 0;
}
}
if (2 == RXTXflag)
{
U0CSR &= ~0x40; //禁止接收
UartSendString(Rxdata,datanumber);
U0CSR |= 0x40; //允許接收
RXTXflag = 1; //恢復到接收狀態
datanumber = 0;
}
}
}