一、串口協(xié)議介紹
串口傳輸協(xié)議是嵌入式開發(fā)里比較常見的傳輸協(xié)議,開發(fā)階段用的最多的方式就是將MCU的調(diào)試信息打印到PC機(jī)串口終端顯示,方便調(diào)試錯(cuò)誤。
一般傳輸協(xié)議分為兩種: 并口和串口。
并口傳輸協(xié)議:指數(shù)據(jù)的各位同時(shí)發(fā)送或接收,每個(gè)數(shù)據(jù)位使用單獨(dú)的一條導(dǎo)線。傳輸速度快、效率高,但需要的數(shù)據(jù)線較多,成本高。
串口傳輸協(xié)議:指數(shù)據(jù)一位接一位地順 序發(fā)送或接收。需要的數(shù)據(jù)線少,成本低,但傳輸速度慢,效率低。
CC2530一共有兩個(gè)串口通信接口,分別是USART0和USART1,它們能夠配置成異步UART模式或者同步SPI模式。
兩個(gè)USART接口具有相同的功能,通過PERCFG寄存器可以設(shè)置兩個(gè)USART接口對應(yīng)外部I/O引腳的映射關(guān)系:
位置1:RX0 --- P0_2 TX0 --- P0_3 RX1 --- P0_5 TX1 --- P0_4
位置2:RX0 --- P1_4 TX0 --- P1_5 RX1 --- P1_7 TX1 --- P1_6
復(fù)制代碼
對每個(gè)USART串口通信編程,本質(zhì)是設(shè)置相關(guān)的5個(gè)寄存器:
<1> UxCSR: USARTx的控制和狀態(tài)寄存器。
<2> UxUCR: USARTx的UART控制寄存器。
<3> UxGCR: USARTx的通用控制寄存器。
<4> UxDBUF:USARTx的接收/發(fā)送數(shù)據(jù)緩沖寄存器。
<4> UxBAUD:USARTx的波特率控制寄存器。
復(fù)制代碼
在與PC機(jī)進(jìn)行串口通信的時(shí)候是,通常需要借助USB轉(zhuǎn)TTL芯片進(jìn)行電壓轉(zhuǎn)換。 所以,在學(xué)習(xí)串口編程之前,先認(rèn)識兩種電平:TTL電平和RS232電平
TTL電平: 邏輯0----小于0.8V 邏輯1----大于2.4V。
RS232電平: 邏輯0----5~15V 邏輯1---- -5~-15V。
復(fù)制代碼
串口通信過程中,速度的指標(biāo)由波特率表示。
常見的波特率設(shè)置表如下:
計(jì)算波特率的方法: CC2530的波特率由BAUD_E和BAUD_M共同決定:
二、原理圖數(shù)據(jù)手冊分析
三、串口配置代碼示例
3.1編寫串口初始化函數(shù),實(shí)現(xiàn)串口字符串發(fā)送 (CPU頻率在16MHZ下,波特率的為9600)
#include
#include
//定義LED燈的端口
#define LED1 P1_2
#define LED2 P1_3
//定義KEY按鍵的端口
#define KEY1 P1_0 //定義按鍵為P1_0口控制
#define KEY2 P1_1 //定義按鍵為P1_1口控制
/*
函數(shù)功能:LED燈IO口初始化
硬件連接:LED1-->P1_2 , LED2-->P1_3
*/
void LED_Init(void)
{
P1DIR |=0x3<<2; //配置P1_2、P1_3為輸出模式
LED1 = 1;
LED2 = 1;
}
/*
函數(shù)功能:按鍵IO口初始化
硬件連接:KEY1-->P1_0 KEY2-->P1_1
*/
void KEY_Init(void)
{
P1SEL&=~(0x3<<0); //配置P1_0,P1_1處于通用GPIO口模式
P1DIR&=~(0x3<<0); //配置P1_0,P1_1為輸入模式
P1INP|= 0x3<<0; //上拉
}
void delay10ms(void) //誤差 0us
{
unsigned char a,b,c;
for(c=193;c>0;c--)
for(b=118;b>0;b--)
for(a=2;a>0;a--);
}
/*
函數(shù)功能:按鍵掃描
返 回 值:按下的按鍵值
*/
unsigned char Key_Scan(void)
{
static unsigned char stat=1;
if((KEY1==0||KEY2==0)&&stat)
{
stat=0;
delay10ms();
if(KEY1==0)return 1;
if(KEY2==0)return 2;
}
else
{
if(KEY1&&KEY2)stat=1;
}
return 0;
}
/*
函數(shù)功能:串口0初始化
*/
void Init_Uart0(void)
{
PERCFG&=~(1<<0); //串口0的引腳映射到位置1,即P0_2和P0_3
P0SEL|=0x3<<2; //將P0_2和P0_3端口設(shè)置成外設(shè)功能
U0BAUD = 59; //16MHz的系統(tǒng)時(shí)鐘產(chǎn)生9600BPS的波特率
U0GCR&=~(0x1F<<0);//清空波特率指數(shù)
U0GCR|=9<<0; //配置波特率的指數(shù)值
U0UCR |= 0x80; //禁止流控,8位數(shù)據(jù),清除緩沖器
U0CSR |= 0x3<<6; //選擇UART模式,使能接收器
}
/*
函數(shù)功能:UART0發(fā)送字符串函數(shù)
*/
void UR0SendString(char *str,unsigned int len)
{
int j;
for(j=0;j;j++)>
3.2 編寫串口初始化函數(shù),實(shí)現(xiàn)串口字符串發(fā)送 (CPU頻率在16MHZ下,波特率為115200)
#include
#include
//定義LED燈的端口
#define LED1 P1_2
#define LED2 P1_3
//定義KEY按鍵的端口
#define KEY1 P1_0 //定義按鍵為P1_0口控制
#define KEY2 P1_1 //定義按鍵為P1_1口控制
/*
函數(shù)功能:LED燈IO口初始化
硬件連接:LED1-->P1_2 , LED2-->P1_3
*/
void LED_Init(void)
{
P1DIR |=0x3<<2; //配置P1_2、P1_3為輸出模式
LED1 = 1;
LED2 = 1;
}
/*
函數(shù)功能:按鍵IO口初始化
硬件連接:KEY1-->P1_0 KEY2-->P1_1
*/
void KEY_Init(void)
{
P1SEL&=~(0x3<<0); //配置P1_0,P1_1處于通用GPIO口模式
P1DIR&=~(0x3<<0); //配置P1_0,P1_1為輸入模式
P1INP|= 0x3<<0; //上拉
}
void delay10ms(void) //誤差 0us
{
unsigned char a,b,c;
for(c=193;c>0;c--)
for(b=118;b>0;b--)
for(a=2;a>0;a--);
}
/*
函數(shù)功能:按鍵掃描
返 回 值:按下的按鍵值
*/
unsigned char Key_Scan(void)
{
static unsigned char stat=1;
if((KEY1==0||KEY2==0)&&stat)
{
stat=0;
delay10ms();
if(KEY1==0)return 1;
if(KEY2==0)return 2;
}
else
{
if(KEY1&&KEY2)stat=1;
}
return 0;
}
/*
函數(shù)功能:串口0初始化
*/
void Init_Uart0(void)
{
PERCFG&=~(1<<0); //串口0的引腳映射到位置1,即P0_2和P0_3
P0SEL|=0x3<<2; //將P0_2和P0_3端口設(shè)置成外設(shè)功能
U0BAUD = 216; //16MHz的系統(tǒng)時(shí)鐘產(chǎn)生115200BPS的波特率
U0GCR&=~(0x1F<<0);//清空波特率指數(shù)
U0GCR|=12<<0; //16MHz的系統(tǒng)時(shí)鐘產(chǎn)生115200BPS的波特率
U0UCR |= 0x80; //禁止流控,8位數(shù)據(jù),清除緩沖器
U0CSR |= 0x3<<6; //選擇UART模式,使能接收器
}
/*
函數(shù)功能:UART0發(fā)送字符串函數(shù)
*/
void UR0SendString(char *str,unsigned int len)
{
int j;
for(j=0;j;j++)>
3.3 配置串口中斷接收數(shù)據(jù)
3.3 配置串口中斷接收數(shù)據(jù)
#include
#include
//定義LED燈的端口
#define LED1 P1_2
#define LED2 P1_3
//定義KEY按鍵的端口
#define KEY1 P1_0 //定義按鍵為P1_0口控制
#define KEY2 P1_1 //定義按鍵為P1_1口控制
unsigned char dataRecv;
unsigned char Flag = 0;
/*
函數(shù)功能:LED燈IO口初始化
硬件連接:LED1-->P1_2 , LED2-->P1_3
*/
void LED_Init(void)
{
P1DIR |=0x3<<2; //配置P1_2、P1_3為輸出模式
LED1 = 1;
LED2 = 1;
}
/*
函數(shù)功能:按鍵IO口初始化
硬件連接:KEY1-->P1_0 KEY2-->P1_1
*/
void KEY_Init(void)
{
P1SEL&=~(0x3<<0); //配置P1_0,P1_1處于通用GPIO口模式
P1DIR&=~(0x3<<0); //配置P1_0,P1_1為輸入模式
P1INP|= 0x3<<0; //上拉
}
void delay10ms(void) //誤差 0us
{
unsigned char a,b,c;
for(c=193;c>0;c--)
for(b=118;b>0;b--)
for(a=2;a>0;a--);
}
/*
函數(shù)功能:按鍵掃描
返 回 值:按下的按鍵值
*/
unsigned char Key_Scan(void)
{
static unsigned char stat=1;
if((KEY1==0||KEY2==0)&&stat)
{
stat=0;
delay10ms();
if(KEY1==0)return 1;
if(KEY2==0)return 2;
}
else
{
if(KEY1&&KEY2)stat=1;
}
return 0;
}
/*
函數(shù)功能:串口0初始化
*/
void Init_Uart0(void)
{
PERCFG&=~(1<<0); //串口0的引腳映射到位置1,即P0_2和P0_3
P0SEL|=0x3<<2; //將P0_2和P0_3端口設(shè)置成外設(shè)功能
U0BAUD = 216; //16MHz的系統(tǒng)時(shí)鐘產(chǎn)生115200BPS的波特率
U0GCR&=~(0x1F<<0);//清空波特率指數(shù)
U0GCR|=12<<0; //16MHz的系統(tǒng)時(shí)鐘產(chǎn)生115200BPS的波特率
U0UCR |= 0x80; //禁止流控,8位數(shù)據(jù),清除緩沖器
U0CSR |= 0x3<<6; //選擇UART模式,使能接收器
UTX0IF = 0; //清除TX發(fā)送中斷標(biāo)志
URX0IF = 0; //清除RX接收中斷標(biāo)志
URX0IE = 1; //使能URAT0的接收中斷
EA = 1; //使能總中斷
}
/*
函數(shù)功能:UART0發(fā)送字符串函數(shù)
*/
void UR0SendString(char *str,unsigned int len)
{
int j;
for(j=0;j;j++)>
審核編輯:湯梓紅
-
串口
+關(guān)注
關(guān)注
14文章
1540瀏覽量
76067 -
傳輸協(xié)議
+關(guān)注
關(guān)注
0文章
73瀏覽量
11423 -
CC2530
+關(guān)注
關(guān)注
19文章
221瀏覽量
57766
發(fā)布評論請先 登錄
相關(guān)推薦
評論