avr單片機USART串口通訊初始化配置及說明
//*****************************USART 控制和狀態(tài)寄存器A(UCSRA)********************************
/*USART 控制和狀態(tài)寄存器A(UCSRA)
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
RXC TXC UDRE FE DOR PE U2X MPCM
RXC: USART 接收結(jié)束
接收緩沖器中有未讀出的數(shù)據(jù)時RXC 置位,否則清零。接收器禁止時,接收緩沖器被刷
新,導致RXC 清零。RXC 標志可用來產(chǎn)生接收結(jié)束中斷
TXC: USART 發(fā)送結(jié)束
發(fā)送移位緩沖器中的數(shù)據(jù)被送出,且當發(fā)送緩沖器 (UDR) 為空時TXC 置位。執(zhí)行發(fā)送
結(jié)束中斷時TXC 標志自動清零,也可以通過寫0進行清除操作。TXC 標志可用來產(chǎn)生發(fā)
送結(jié)束中斷( 見對TXCIE 位的描述)。
UDRE: USART 數(shù)據(jù)寄存器空
UDRE標志指出發(fā)送緩沖器(UDR)是否準備好接收新數(shù)據(jù)。UDRE為1說明緩沖器為空,已
準備好進行數(shù)據(jù)接收。UDRE標志可用來產(chǎn)生數(shù)據(jù)寄存器空中斷
復位后UDRE 置位,表明發(fā)送器已經(jīng)就緒。
FE: 幀錯誤
如果接收緩沖器接收到的下一個字符有幀錯誤,即接收緩沖器中的下一個字符的第一個
停止位為0,那么FE 置位。這一位一直有效直到接收緩沖器(UDR) 被讀取。當接收到的
停止位為1 時, FE 標志為0。對UCSRA 進行寫入時,這一位要寫0。
DOR: 數(shù)據(jù)溢出
數(shù)據(jù)溢出時DOR 置位。當接收緩沖器滿( 包含了兩個數(shù)據(jù)),接收移位寄存器又有數(shù)據(jù),
若此時檢測到一個新的起始位,數(shù)據(jù)溢出就產(chǎn)生了。這一位一直有效直到接收緩沖器
(UDR) 被讀取。對UCSRA 進行寫入時,這一位要寫0。
PE: 奇偶校驗錯誤
當奇偶校驗使能(UPM1 1),且接收緩沖器中所接收到的下一個字符有奇偶校驗錯誤時
UPE 置位。這一位一直有效直到接收緩沖器 (UDR) 被讀取。對UCSRA 進行寫入時,這
一位要寫0。
U2X: 倍速發(fā)送
這一位僅對異步操作有影響。使用同步操作時將此位清零。此位置1可將波特率分頻因
子從16降到8,從而有效的將異步通信模式的傳輸速率加倍。
MPCM: 多處理器通信模式
設置此位將啟動多處理器通信模式。MPCM置位后,USART 接收器接收到的那些不包含
地址信息的輸入幀都將被忽略。發(fā)送器不受MPCM設置的影響。
*/
//***************************USART控制和狀態(tài)寄存器 B(UCSRB)*******************
/* USART控制和狀態(tài)寄存器 B(UCSRB)
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8
RXCIE: 接收結(jié)束中斷使能
置位后使能RXC中斷。當RXCIE為1,全局中斷標志位SREG置位,UCSRA寄存器的RXC
亦為1時可以產(chǎn)生USART接收結(jié)束中斷。
TXCIE: 發(fā)送結(jié)束中斷使能
置位后使能TXC中斷。當TXCIE為1,全局中斷標志位SREG置位,UCSRA寄存器的TXC
亦為1時可以產(chǎn)生USART發(fā)送結(jié)束中斷。
UDRIE: USART 數(shù)據(jù)寄存器空中斷使能
置位后使能UDRE中斷。當UDRIE 為1,全局中斷標志位SREG置位,UCSRA寄存器的UDRE
亦為1時可以產(chǎn)生USART數(shù)據(jù)寄存器空中斷。
RXEN: 接收使能
置位后將啟動USART接收器。RxD 引腳的通用端口功能被USART功能所取代。禁止接
收器將刷新接收緩沖器,并使 FE、DOR及PE標志無效。
TXEN: 發(fā)送使能
置位后將啟動將啟動USART發(fā)送器。TxD引腳的通用端口功能被USART功能所取代。
TXEN 清零后,只有等到所有的數(shù)據(jù)發(fā)送完成后發(fā)送器才能夠真正禁止,即發(fā)送移位
寄存器與發(fā)送緩沖寄存器中沒有要傳送的數(shù)據(jù)。發(fā)送器禁止后,TxD引腳恢復其通用
I/O功能。
UCSZ2: 字符長度
UCSZ2與UCSRC寄存器的UCSZ1:0結(jié)合在一起可以設置數(shù)據(jù)幀所包含的數(shù)據(jù)位數(shù)(字符
長度)。
RXB8: 接收數(shù)據(jù)位8
對9位串行幀進行操作時,RXB8 是第9個數(shù)據(jù)位。讀取UDR包含的低位數(shù)據(jù)之前首先
要讀取RXB8。
TXB8: 發(fā)送數(shù)據(jù)位8
對9位串行幀進行操作時,TXB8是第9個數(shù)據(jù)位。寫UDR之前首先要對它進行寫操作。
*/
//****************************狀態(tài)寄存器 C(UCSRC)*****************************
/* 狀態(tài)寄存器 C(UCSRC)
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL
UCSRC寄存器與UBRRH寄存器共用相同的I/O地址。對該寄存器的訪問。
URSEL: 寄存器選擇
通過該位選擇訪問UCSRC寄存器或UBRRH寄存器。 當讀UCSRC時,該位為1 ;當寫UCSRC
時,URSEL為1。 URSEL 為 0 ,對UBRRH 值更新; 若 URSEL 為 1 ,對UCSRC 設置更新
UMSEL: USART 模式選擇
通過這一位來選擇同步或異步工作模式。
UMSEL設置
UMSEL 模式
0 異步操作
1 同步操作
UPM1:0: 奇偶校驗模式
這兩位設置奇偶校驗的模式并使能奇偶校驗。如果使能了奇偶校驗,那么在發(fā)送數(shù)
據(jù),發(fā)送器都會自動產(chǎn)生并發(fā)送奇偶校驗位。對每一個接收到的數(shù)據(jù),接收器都會
產(chǎn)生一奇偶值,并與UPM0 所設置的值進行比較。如果不匹配,那么就將UCSRA 中
的PE 置位。
UPM 設置
UPM1 UPM0 奇偶模式
0 0 禁止
0 1 保留
1 0 偶校驗
1 1 奇校驗
USBS: 停止位選擇
通過這一位可以設置停止位的位數(shù)。接收器忽略這一位的設置。
USBS 設置
USBS 停止位位數(shù)
0 1
1 2
UCSZ1:0: 字符長度
UCSZ1:0與UCSRB寄存器的 UCSZ2結(jié)合在一起可以設置數(shù)據(jù)幀包含的數(shù)據(jù)位數(shù)(字
符長度)。
UCSZ 設置
UCSZ2 UCSZ1 UCSZ0 字符長度
0 0 0 5
0 0 1 6
0 1 0 7
0 1 1 8
1 0 0 保留
1 0 1 保留
1 1 0 保留
1 1 1 9
UCPOL: 時鐘極性
這一位僅用于同步工作模式。使用異步模式時,將這一位清零。UCPOL 設置了輸出
數(shù)據(jù)的改變和輸入數(shù)據(jù)采樣,以及同步時鐘XCK 之間的關系。
UCPOL 設置
UCPOL 發(fā)送數(shù)據(jù)的改變(TxD引腳的輸出) 接收數(shù)據(jù)的采樣(RxD 引腳的輸入)
0 XCK上升沿XCK 下降沿
1 XCK 下降沿XCK 上升沿
*///*********************************USART波特率寄存器(UBRRL和UBRRH)*************************
/* USART波特率寄存器(UBRRL和UBRRH)
bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8
URSEL – – – UBRR[11:8]
UBRR[7:0]
UCSRC寄存器與UBRRH寄存器共用相同的I/O地址。對該寄存器的訪問。
URSEL: 寄存器選擇
通過該位選擇訪問UCSRC 寄存器或UBRRH 寄存器。當讀UBRRH時,該位為0;當寫
UBRRH時, URSEL為0。
Bit 14:12 – 保留位
這些位是為以后的使用而保留的。為了與以后的器件兼容,寫UBRRH時將這些位清零。
UBRR11:0: USART 波特率寄存器
這個12位的寄存器包含了USART的波特率信息。其中UBRRH包含了USART波特率高4
位,UBRRL包含了低8位。波特率的改變將造成正在進行的數(shù)據(jù)傳輸受到破壞。寫UBRRL
將立即更新波特率分頻器。
*/
/*
波特率定義為每秒的位傳輸速度 (bps)
BAUD 波特率 ( bps)
fOSC 系統(tǒng)時鐘頻率
UBRR UBRRH 與 UBRRL 的數(shù)值 (0-4095)
異步正常模式 (U2X = 0)
FOSC FOSC
BAUD = -------------- UBRR = ------------ -1
16( UBRR+ 1) 16BAUD
異步倍速模式 (U2X = 1)
fOSC fOSC
BAUD = -------------- UBRR = ------------ -1
8(UBRR+ 1) 8BAUD
同步主機模式
fOSC fOSC
BAUD = --------------- UBRR = ------------ -1
2(UBRR+ 1) 2BAUD
*/
#include
#include
#pragma interrupt_handler UDR_empty:iv_USART_UDRE
#pragma interrupt_handler RXC_END:iv_USART_DRE
#pragma interrupt_handler TXC_END:iv_USART_TX
unsigned char UASART_DATA=0; void USART_Init_commonage(unsigned int baud)//通用初始化 {/* 設置波特率 */ SREG&=0x7F; } /* UASART_DATA=UDR; //add your code here void USART_Transmit5_8( unsigned char data )//對 UDRE 標志采用輪詢方式發(fā)送數(shù)據(jù)(發(fā)送5-8位數(shù)據(jù)) unsigned char USART_Receive5_8( void )//用查詢RXC接受5-8位的數(shù)據(jù) /* {
void USART_Init( unsigned int baud,unsigned char digit,unsigned char mode,unsigned char checkout)//詳細初始化模式
{ SREG&=0x7F;
UCSRC&=~(1<
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* 接收器與發(fā)送器使能 */
UCSRB = (1<
UCSRB = (1<
switch(mode)//異同模式選擇
{
case 0:UCSRB&=~(1<
UCSRC|=1<
應先將數(shù)據(jù)的第9位寫入寄存器UCSRB的TXB8,
然后再將低8位數(shù)據(jù)寫入發(fā)送數(shù)據(jù)寄存器UDR, */
switch(digit)//// 設置幀格式 : digit數(shù)據(jù)位5-9,
{
case 5:UCSRB&=~(1<
switch(checkout)//checkout校驗模式
{
case 0:UCSRC&=~(1<
UCSRC|=1<
//UCSRA|=1<
}
/************UBRR的baud設置參數(shù)表*****************************/
//U2X=0;8mhz晶振9600:UBRR=51;誤差:0.2%。4800:UBRR=103;誤差:0.2%.2400:UBRR=207;誤差:0.2%
//U2X=1;8mhz晶振9600:UBRR=103;誤差:0.2%。4800:UBRR=207;誤差:0.2%.2400:UBRR=416;誤差:-0.1%
//U2X=0;11.0592mhz晶振9600:UBRR=71;誤差:0.0%。4800:UBRR=143;誤差:0.0%.2400:UBRR=287;誤差:0.0%
//U2X=1;11.0592mhz晶振9600:UBRR=143;誤差:0.0%。4800:UBRR=287;誤差:0.0%.2400:UBRR=575;誤差:0.0%
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* 接收器與發(fā)送器使能 數(shù)據(jù)寄存器空使能禁止*/
UCSRB = (1<
UCSRC = (1<
SREG|=0x80;//使能全局中斷
}
USART數(shù)據(jù)寄存器空標志UDRE及傳輸結(jié)束標志TXC,兩個標志位都可以產(chǎn)生中斷。
*/
void UDR_empty()
//使能要求:全局中斷使能,數(shù)據(jù)寄存器空中斷使能位 UDRIE置位。 UDRE 被置位(自動)。
//對寄存器 UDR 執(zhí)行寫操作將清零 UDRE
{unsigned char data;
UDR = data;
//add your code here
}
void TXC_END()
{UDR =UASART_DATA;
//add your code here
}
void RXC_END()
{
}
{ /* 等待發(fā)送緩沖器為空 */
while ( !( UCSRA & (1<
UDR = data;
}
void USART_Transmit_9( unsigned int data )//用查詢法發(fā)送9位數(shù)據(jù)的數(shù)據(jù)幀
{ /* 等待發(fā)送緩沖器為空 */
while ( !( UCSRA & (1<
UCSRB &= ~(1<
UCSRB |= (1<
UDR = data;
}
{
/*等待接收數(shù)據(jù)*/
while ( !(UCSRA & (1<
return UDR;
}
unsigned int USART_Receive_9( void )//接受9位的數(shù)據(jù)幀
{
unsigned char status, resh, resl;
/*等待接收數(shù)據(jù) */
while ( !(UCSRA & (1<
/* from buffer */
status = UCSRA;
resh = UCSRB;
resl = UDR;
/* 如果出錯返回*/
if ( status & (1<
/* 過濾第九位數(shù)據(jù)然后返回*/
resh = (resh >> 1) & 0x01;
return ((resh << 8) | resl);
}
禁止接收器時緩沖器 FIFO 被刷新,緩沖器被清空。導致未讀出的數(shù)據(jù)丟失。如果由于出錯而必須在正常操作下刷新緩沖器?
則需要一直讀取 UDR 直到 RXC 標志清零。
*/
void USART_Flush( void )
unsigned char dummy;
while ( UCSRA & (1<
評論