新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > avr單片機USART串口通訊初始化配置說明

        avr單片機USART串口通訊初始化配置說明

        作者: 時間:2016-11-19 來源:網絡 收藏
        avr atmega16單片機通用同步和異步串行接收器和轉發器 (USART)

        是一個高度靈活的串行通訊設備,其工作模式及其初始化,寄存器說明如下

        本文引用地址:http://www.104case.com/article/201611/318298.htm

        *USART控制和狀態寄存器A(UCSRA)

        USART 控制和狀態寄存器A(UCSRA)
        bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
        RXC TXC UDRE FE DOR PE U2X MPCM
        RXC: USART 接收結束
        接收緩沖器中有未讀出的數據時RXC 置位,否則清零。接收器禁止時,接收緩沖器被刷
        新,導致RXC 清零。RXC 標志可用來產生接收結束中斷
        TXC: USART 發送結束
        發送移位緩沖器中的數據被送出,且當發送緩沖器 (UDR) 為空時TXC 置位。執行發送
        結束中斷時TXC 標志自動清零,也可以通過寫0進行清除操作。TXC 標志可用來產生發
        送結束中斷( 見對TXCIE 位的描述)。
        UDRE: USART 數據寄存器空
        UDRE標志指出發送緩沖器(UDR)是否準備好接收新數據。UDRE為1說明緩沖器為空,已
        準備好進行數據接收。UDRE標志可用來產生數據寄存器空中斷
        復位后UDRE 置位,表明發送器已經就緒。
        FE: 幀錯誤
        如果接收緩沖器接收到的下一個字符有幀錯誤,即接收緩沖器中的下一個字符的第一個
        停止位為0,那么FE 置位。這一位一直有效直到接收緩沖器(UDR) 被讀取。當接收到的
        停止位為1 時, FE 標志為0。對UCSRA 進行寫入時,這一位要寫0。
        DOR: 數據溢出
        數據溢出時DOR 置位。當接收緩沖器滿( 包含了兩個數據),接收移位寄存器又有數據,
        若此時檢測到一個新的起始位,數據溢出就產生了。這一位一直有效直到接收緩沖器
        (UDR) 被讀取。對UCSRA 進行寫入時,這一位要寫0。
        PE: 奇偶校驗錯誤
        當奇偶校驗使能(UPM1 1),且接收緩沖器中所接收到的下一個字符有奇偶校驗錯誤時
        UPE 置位。這一位一直有效直到接收緩沖器 (UDR) 被讀取。對UCSRA 進行寫入時,這
        一位要寫0。
        U2X: 倍速發送
        這一位僅對異步操作有影響。使用同步操作時將此位清零。此位置1可將波特率分頻因
        子從16降到8,從而有效的將異步通信模式的傳輸速率加倍。
        MPCM: 多處理器通信模式
        設置此位將啟動多處理器通信模式。MPCM置位后,USART 接收器接收到的那些不包含
        地址信息的輸入幀都將被忽略。發送器不受MPCM設置的影響。

        *USART控制和狀態寄存器 B(UCSRB)*
        USART控制和狀態寄存器 B(UCSRB)
        bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
        RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8TXB8
        RXCIE: 接收結束中斷使能
        置位后使能RXC中斷。當RXCIE為1,全局中斷標志位SREG置位,UCSRA寄存器的RXC
        亦為1時可以產生USART接收結束中斷。
        TXCIE: 發送結束中斷使能
        置位后使能TXC中斷。當TXCIE為1,全局中斷標志位SREG置位,UCSRA寄存器的TXC
        亦為1時可以產生USART發送結束中斷。
        UDRIE: USART 數據寄存器空中斷使能
        置位后使能UDRE中斷。當UDRIE 為1,全局中斷標志位SREG置位,UCSRA寄存器的UDRE
        亦為1時可以產生USART數據寄存器空中斷。
        RXEN: 接收使能
        置位后將啟動USART接收器。RxD 引腳的通用端口功能被USART功能所取代。禁止接
        收器將刷新接收緩沖器,并使 FE、DOR及PE標志無效。
        TXEN: 發送使能
        置位后將啟動將啟動USART發送器。TxD引腳的通用端口功能被USART功能所取代。
        TXEN 清零后,只有等到所有的數據發送完成后發送器才能夠真正禁止,即發送移位
        寄存器與發送緩沖寄存器中沒有要傳送的數據。發送器禁止后,TxD引腳恢復其通用
        I/O功能。
        UCSZ2: 字符長度
        UCSZ2與UCSRC寄存器的UCSZ1:0結合在一起可以設置數據幀所包含的數據位數(字符
        長度)。
        RXB8: 接收數據位8
        對9位串行幀進行操作時,RXB8 是第9個數據位。讀取UDR包含的低位數據之前首先
        要讀取RXB8。
        TXB8: 發送數據位8
        對9位串行幀進行操作時,TXB8是第9個數據位。寫UDR之前首先要對它進行寫操作。


        狀態寄存器 C(UCSRC)*
        狀態寄存器 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: 奇偶校驗模式
        這兩位設置奇偶校驗的模式并使能奇偶校驗。如果使能了奇偶校驗,那么在發送數
        據,發送器都會自動產生并發送奇偶校驗位。對每一個接收到的數據,接收器都會
        產生一奇偶值,并與UPM0 所設置的值進行比較。如果不匹配,那么就將UCSRA 中
        的PE 置位。
        UPM 設置
        UPM1 UPM0 奇偶模式
        0 0 禁止
        0 1 保留
        1 0 偶校驗
        1 1 奇校驗
        USBS: 停止位選擇
        通過這一位可以設置停止位的位數。接收器忽略這一位的設置。
        USBS 設置
        USBS 停止位位數
        0 1
        1 2
        UCSZ1:0: 字符長度
        UCSZ1:0與UCSRB寄存器的 UCSZ2結合在一起可以設置數據幀包含的數據位數(字
        符長度)。
        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 設置了輸出
        數據的改變和輸入數據采樣,以及同步時鐘XCK 之間的關系。
        UCPOL 設置
        UCPOL 發送數據的改變(TxD引腳的輸出) 接收數據的采樣(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位。波特率的改變將造成正在進行的數據傳輸受到破壞。寫UBRRL
        將立即更新波特率分頻器

        波特率定義為每秒的位傳輸速度 (bps)

        BAUD 波特率 ( bps)
        fOSC 系統時鐘頻率
        UBRR UBRRH 與 UBRRL 的數值 (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( unsigned int baud,unsigned char digit,unsigned charmode,unsigned char checkout)//詳細初始化模式
        {

        SREG&=0x7F;
        UCSRC&=~(1< /* 設置波特率 */
        UBRRH = (unsigned char)(baud>>8);
        UBRRL = (unsigned char)baud;
        /* 接收器與發送器使能 */
        UCSRB = (1< /*UDR數據寄存器為空時中斷使能 */
        UCSRB = (1<

        switch(mode)//異同模式選擇
        {
        case 0:UCSRB&=~(1< case 1:UCSRB|=1< default :UCSRB&=~(1< }
        UCSRC|=1< /* 如果發送9位數據的數據幀(UCSZ = 7),應先將數據的第9位寫入寄存器UCSRB的TXB8,然后再將低8位數據寫入發送數據寄存器UDR, */
        switch(digit)//// 設置幀格式 : digit數據位5-9,
        {
        case 5:UCSRB&=~(1< case 6:UCSRB&=~(1< case 7:UCSRB&=~(1< case 8:UCSRB&=~(1< case 9:UCSRB|=1< default:UCSRB&=~(1< }
        switch(checkout)//checkout校驗模式
        {
        case 0:UCSRC&=~(1< case 2:UCSRC|=1< case 3:UCSRC|=(3< default:UCSRC&=~(1< }
        UCSRC|=1< //UCSRC&=~(1< UCSRC&=~(1< //*
        //UCSRA|=1< //UCSRA|=1< SREG|=0x80;//使能全局中斷
        }

        /UBRR的baud設置參數表*/
        //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%
        void USART_Init_commonage(unsigned int baud)//通用初始化
        {

        /* 設置波特率 */
        SREG&=0x7F;
        UBRRH = (unsigned char)(baud>>8);
        UBRRL = (unsigned char)baud;
        /* 接收器與發送器使能 數據寄存器空使能禁止*/
        UCSRB = (1< /* 設置幀格式 : 8個數據位 , 2個停止位 ,禁止校驗,XCK上升沿發送數據下降沿接收數據,異步模式*/
        UCSRC = (1< //UCSRA=0;單機處理模式。中斷標志清零,波特率的普通模式(非加倍,倍速模式)
        SREG|=0x80;//使能全局中斷
        }
        /*
        USART數據寄存器空標志UDRE及傳輸結束標志TXC,兩個標志位都可以產生中斷。
        */
        void UDR_empty()
        //使能要求:全局中斷使能,數據寄存器空中斷使能位 UDRIE置位。 UDRE 被置位(自動)。
        //對寄存器 UDR 執行寫操作將清零 UDRE
        {

        unsigned char data;
        UDR = data;
        //add your code here
        }
        void TXC_END()
        {

        UDR =UASART_DATA;

        //add your code here
        }
        void RXC_END()
        {
        UASART_DATA=UDR;
        //add your code here
        }
        void USART_Transmit5_8( unsigned char data )//對 UDRE標志采用輪詢方式發送數據(發送5-8位數據)
        {

        /* 等待發送緩沖器為空 */
        while ( !( UCSRA & (1< /* 將數據放入緩沖器,發送數據 */
        UDR = data;
        }
        void USART_Transmit_9( unsigned int data )//用查詢法發送9位數據的數據幀
        {

        /* 等待發送緩沖器為空 */
        while ( !( UCSRA & (1< /* 將第 9 位到 TXB8 */
        UCSRB &= ~(1< if ( data & 0x0100 )
        UCSRB |= (1< /* 將數據放入緩沖器,發送數據 */
        UDR = data;
        }
        unsigned char USART_Receive5_8( void )//用查詢RXC接受5-8位的數據
        {
        /*等待接收數據*/
        while ( !(UCSRA & (1< /* 從緩沖器獲得數據并返回數據*/
        return UDR;
        }
        unsigned int USART_Receive_9( void )//接受9位的數據幀
        {
        unsigned char status, resh, resl;
        /*等待接收數據 */
        while ( !(UCSRA & (1< /*從緩沖器獲得狀態及其第九位數據*/
        /* from buffer */
        status = UCSRA;
        resh = UCSRB;
        resl = UDR;
        /* 如果出錯返回*/
        if ( status & (1< return 255;
        /* 過濾第九位數據然后返回*/
        resh = (resh >> 1) & 0x01;
        return ((resh << 8) | resl);
        }
        /*
        禁止接收器時緩沖器 FIFO 被刷新,緩沖器被清空。導致未讀出的數據丟失。如果由于出錯而必須在正常操作下刷新緩沖器?
        則需要一直讀取 UDR 直到 RXC 標志清零。
        */
        void USART_Flush( void )
        {
        unsigned char dummy;
        while ( UCSRA & (1< }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 柳河县| 上犹县| 来安县| 盘山县| 云霄县| 石河子市| 福鼎市| 临汾市| 武夷山市| 金门县| 勐海县| 阳江市| 康定县| 保康县| 南召县| 台江县| 防城港市| 凤翔县| 定边县| 德格县| 平舆县| 万荣县| 凉山| 确山县| 五台县| 自贡市| 龙川县| 杂多县| 咸丰县| 大安市| 沁阳市| 潜山县| 文昌市| 嘉义县| 宝坻区| 遂昌县| 峡江县| 浦城县| 泗水县| 山东省| 邵阳县|