AVR單片機(學(xué)習ing)-ATMEGA16的USART與PC機串行通信
3)USART控制和狀態(tài)寄存器B
• Bit 7 – RXCIE: 接收結束中斷使能
置位后使能RXC 中斷。當RXCIE 為1,全局中斷標志位SREG 置位, UCSRA 寄存器
的RXC 亦為1 時(shí)可以產(chǎn)生USART 接收結束中斷。
• Bit 6 – TXCIE: 發(fā)送結束中斷使能
置位后使能TXC 中斷。當TXCIE 為1,全局中斷標志位SREG 置位,UCSRA 寄存器的
TXC 亦為1 時(shí)可以產(chǎn)生USART 發(fā)送結束中斷。
• Bit 5 – UDRIE: USART 數據寄存器空中斷使能
置位后使能UDRE 中斷。當UDRIE 為1,全局中斷標志位SREG 置位,UCSRA 寄存器
的UDRE 亦為1 時(shí)可以產(chǎn)生USART 數據寄存器空中斷。
• Bit 4 – RXEN: 接收使能
置位后將啟動(dòng)USART 接收器。RxD 引腳的通用端口功能被USART 功能所取代。禁止
接收器將刷新接收緩沖器,并使 FE、DOR 及PE 標志無(wú)效。
• Bit 3 – TXEN: 發(fā)送使能
置位后將啟動(dòng)將啟動(dòng)USART 發(fā)送器。TxD 引腳的通用端口功能被USART 功能所取代。
TXEN 清零后,只有等到所有的數據發(fā)送完成后發(fā)送器才能夠真正禁止,即發(fā)送移位寄存
器與發(fā)送緩沖寄存器中沒(méi)有要傳送的數據。發(fā)送器禁止后,TxD引腳恢復其通用I/O功能。
• Bit 2 – UCSZ2: 字符長(cháng)度
UCSZ2與UCSRC寄存器的UCSZ1:0結合在一起可以設置數據幀所包含的數據位數(字符
長(cháng)度)。
• Bit 1 – RXB8: 接收數據位 8
對9 位串行幀進(jìn)行操作時(shí),RXB8 是第9 個(gè)數據位。讀取UDR 包含的低位數據之前首先
要讀取RXB8。
• Bit 0 – TXB8: 發(fā)送數據位8
對9 位串行幀進(jìn)行操作時(shí),TXB8 是第9 個(gè)數據位。寫(xiě)UDR 之前首先要對它進(jìn)行寫(xiě)操作。
4)USART控制和轉臺寄存器C
• Bit 7 – URSEL: 寄存器選擇
通過(guò)該位選擇訪(fǎng)問(wèn)UCSRC 寄存器或UBRRH 寄存器。當讀UCSRC 時(shí),該位為1 ;當
寫(xiě)UCSRC 時(shí), URSEL 為1。
• Bit 6 – UMSEL: USART 模式選擇
通過(guò)這一位來(lái)選擇同步或異步工作模式。
• Bit 5:4 – UPM1:0: 奇偶校驗模式
這兩位設置奇偶校驗的模式并使能奇偶校驗。如果使能了奇偶校驗,那么在發(fā)送數據,發(fā)
送器都會(huì )自動(dòng)產(chǎn)生并發(fā)送奇偶校驗位。對每一個(gè)接收到的數據,接收器都會(huì )產(chǎn)生一奇偶
值,并與UPM0 所設置的值進(jìn)行比較。如果不匹配,那么就將UCSRA 中的PE 置位。
• Bit 3 – USBS: 停止位選擇
通過(guò)這一位可以設置停止位的位數。接收器忽略這一位的設置。
• Bit 2:1 – UCSZ1:0: 字符長(cháng)度
UCSZ1:0與UCSRB寄存器的 UCSZ2結合在一起可以設置數據幀包含的數據位數(字符長(cháng)
度)。
• Bit 0 – UCPOL: 時(shí)鐘極性
這一位僅用于同步工作模式。使用異步模式時(shí),將這一位清零。UCPOL 設置了輸出數據
的改變和輸入數據采樣,以及同步時(shí)鐘XCK 之間的關(guān)系。
5)USART波特率寄存器
• Bit 15 – URSEL: 寄存器選擇
通過(guò)該位選擇訪(fǎng)問(wèn)UCSRC 寄存器或UBRRH 寄存器。當讀UBRRH 時(shí),該位為0 ;當
寫(xiě)UBRRH 時(shí), URSEL 為0。
• Bit 14:12 – 保留位
這些位是為以后的使用而保留的。為了與以后的器件兼容,寫(xiě)UBRRH 時(shí)將這些位清零。
• Bit 11:0 – UBRR11:0: USART 波特率寄存器
這個(gè)12 位的寄存器包含了USART 的波特率信息。其中UBRRH 包含了USART 波特率
高4 位,UBRRL 包含了低8 位。波特率的改變將造成正在進(jìn)行的數據傳輸受到破壞。寫(xiě)
UBRRL 將立即更新波特率分頻器。
不同晶振的波特率還是去看datasheet吧~~我看了看好多啊~~~
6、USART的初始化
進(jìn)行通信之前首先要對USART 進(jìn)行初始化。初始化過(guò)程通常包括波特率的設定,幀結構
的設定,以及根據需要使能接收器或發(fā)送器。對于中斷驅動(dòng)的USART 操作,在初始化時(shí)
首先要清零全局中斷標志位( 全局中斷被屏蔽)。
重新改變USART 的設置應該在沒(méi)有數據傳輸的情況下進(jìn)行。TXC 標志位可以用來(lái)檢驗
一個(gè)數據幀的發(fā)送是否已經(jīng)完成, RXC 標志位可以用來(lái)檢驗接收緩沖器中是否還有數據
未讀出。在每次發(fā)送數據之前( 在寫(xiě)發(fā)送數據寄存器UDR 前)TXC 標志位必須清零。
以下是USART 初始化程序示例。例程采用了輪詢(xún)( 中斷被禁用) 的異步操作,而且幀結
構是固定的。波特率作為函數參數給出。在匯編程序里波特率參數保存于寄存器r17:r16。
當寫(xiě)入UCSRC 寄存器時(shí),由于UBRRH 與UCSRC 共用I/O 地址,URSEL 位(MSB) 必
須置位。
void USART_Init( unsigned int baud )
{
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
UCSRB = (1<
UCSRC = (1<
更高級的初始化程序可將幀格式作為參數、禁止中斷等等。然而許多應用程序使用固定的
波特率與控制寄存器。此時(shí)初始化代碼可以直接放在主程序中,或與其它I/O 模塊的初始
化代碼組合到一起。
評論