在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            ARM7串口編程要點(diǎn)

            作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò) 收藏


            U0LCR = 0x80; // DLAB位置1
            bak = (Fpclk>>4)/baud;
            U0DLM = bak>>8;
            U0DLL = bak&0xff;


            bak = set.datab-5; // 設(shè)置字長(zhǎng)度
            if(2==set.stopb)
            {
            bak |= 0x04; // 判斷是否為2位停止位
            }
            if(0!=set.parity)
            {
            set.parity = set.parity-1;
            bak |= 0x08;
            }
            bak |= set.parity<<4; // 設(shè)置奇偶校驗(yàn)
            U0LCR = bak;

            return(1);
            }
            2. 串口接收數(shù)據(jù)
            用輪循方式接收數(shù)據(jù)
            1>CPU通過(guò)串口接收數(shù)據(jù)時(shí)各個(gè)寄存器之間的關(guān)系


            2>串口接受數(shù)據(jù)的流程:
            l 循環(huán)檢測(cè)U0RBR是否有未讀取的數(shù)據(jù)。
            l 如果有數(shù)據(jù)到來(lái),則接收數(shù)據(jù)。
            3>相關(guān)寄存器配置
            (1) U0LSR(線狀態(tài)寄存器)
            l 作用:只讀寄存器,它提供UART0發(fā)送和接收模塊的狀態(tài)信息。
            l 長(zhǎng)度:8位寄存器。
            l 各位寄存器的含義:
            A.0位:表示接收數(shù)據(jù)就緒
            置0表示U0RBR為空
            置1表示U0RBR包含有效數(shù)據(jù)
            注:當(dāng)U0RBR包含未讀的字符時(shí),第0位被置位;當(dāng)UART0的U0RBR或FIFO為空時(shí),第0位置零。
            B.第1位:溢出錯(cuò)誤。
            置0:溢出錯(cuò)誤狀態(tài)未激活
            置1:溢出錯(cuò)誤狀態(tài)激活
            注:溢出錯(cuò)誤條件在錯(cuò)誤發(fā)生后立即設(shè)置。對(duì)U0LSR讀操作將清零第1位。當(dāng)UART0的RSR已經(jīng)有新的字符就緒,而UART0 RBR或FIFO已滿(mǎn)時(shí),第一位置1.此時(shí)的UART0 RBR或FIFO不會(huì)被覆蓋,UART0 的RSR中的字符將丟失。
            C.第2位:奇偶錯(cuò)誤。
            置0:奇偶錯(cuò)誤狀態(tài)未激活
            置1:奇偶錯(cuò)誤狀態(tài)激活
            注:
            ² 當(dāng)接收字符的奇偶位處于錯(cuò)誤狀態(tài)時(shí)產(chǎn)生一個(gè)奇偶錯(cuò)誤。對(duì)U0LSR讀操作清零該位。
            ² 奇偶錯(cuò)誤檢測(cè)時(shí)間取決于U0FCR的bit0。奇偶錯(cuò)誤與UART0 的RBR,F(xiàn)IFO中讀出的字符相關(guān)。
            D.第3位:幀錯(cuò)誤
            置0:幀錯(cuò)誤狀態(tài)未激活。
            置1:幀錯(cuò)誤狀態(tài)激活
            注:
            ² 當(dāng)接收字符的停止位為0時(shí),產(chǎn)生幀錯(cuò)誤。對(duì)讀操作U0LSR清零該位。
            ² 幀錯(cuò)誤檢測(cè)時(shí)間取決于U0FCR的bit0.
            ² 幀錯(cuò)誤與UART0的RBR,F(xiàn)IFO中讀出的字符相關(guān)。當(dāng)檢測(cè)到一個(gè)幀錯(cuò)誤時(shí),Rx將嘗試與數(shù)據(jù)重新同步并假設(shè)錯(cuò)誤的停止位實(shí)際是一個(gè)超前的起始位。但即使沒(méi)有出現(xiàn)幀錯(cuò)誤,它也不能假設(shè)下一個(gè)接收到的字節(jié)是正確的。
            E.第四位:間隔中斷
            置0:間隔中斷狀態(tài)未激活
            置1:間隔中斷狀態(tài)狀態(tài)激活
            注:
            ² 在發(fā)送整個(gè)字符(起始位,數(shù)據(jù),奇偶位和停止位)過(guò)程中RXD0如果都保持邏輯0,則產(chǎn)生間隔中斷。
            ² 當(dāng)檢測(cè)到中斷條件時(shí),接收器立即進(jìn)入空閑狀態(tài)直到RXD0變?yōu)槿?狀態(tài)。
            ² 讀操作U0LSR清零該狀態(tài)位。
            ² 間隔檢測(cè)的時(shí)間取決于U0FCR的bit0.
            ² 間隔中斷與UART0的RBR或FIFO中讀出的字符相關(guān)。
            F.第五位:發(fā)送保持寄存器空
            置0:表示U0THR包含有效數(shù)據(jù)
            置1:表示U0THR空
            注:
            ² 當(dāng)檢測(cè)到UART0 的THR空時(shí),THRE置位。
            ² 對(duì)U0THR寫(xiě)操作清零該位。
            G.第6位:表示發(fā)送器空
            置0:U0THR和或U0TSR包含有效數(shù)據(jù)。
            置1:U0THR和U0TSR空
            注:
            ² 當(dāng)U0THR和U0TSR都為空時(shí),該位置1
            ² 當(dāng)U0TSR或U0THR包含有效數(shù)據(jù)時(shí),該位清零。
            H第7位:表示Rx FIFO 錯(cuò)誤。
            置0:U0RBR中沒(méi)有UART0 Rx錯(cuò)誤,或U0FCR的bit為0.
            置1:U0RBR包含至少一個(gè)UART0 Rx錯(cuò)誤。
            注:
            ² 當(dāng)一個(gè)帶有Rx錯(cuò)誤(例如幀錯(cuò)誤,奇偶錯(cuò)誤或間隔中斷)的字符裝入U(xiǎn)0RBR時(shí),該位置1.
            ² 當(dāng)讀取U0LSR寄存器并且UART0的FIFO中不再有錯(cuò)誤時(shí),該位置零。
            (2) U0RBR(接收器緩沖寄存器)
            l 作用:只讀寄存器,是UART0 Rx FIFO的最高字節(jié)。它包含了最早接收到的字符,可通過(guò)總線接口讀出。串口接收數(shù)據(jù)時(shí)低位在先,即U0RBR的bit0為最早接收到的數(shù)據(jù)位。如果接收到的數(shù)據(jù)小于8位,未使用的MSB填充為0.
            l 長(zhǎng)度:8位寄存器。
            4>串口接收數(shù)據(jù)程序

            uint8 UART0_RcvByte(void)
            {
            uint8 rcv_data ;
            while((U0LSR&0X01)==0); //等待數(shù)據(jù)到達(dá)
            rcv_data = U0RBR; //從U0RBR中讀出接收到的數(shù)據(jù)
            return rcv_data; //返回接收到的數(shù)據(jù)
            }

            3. 串口發(fā)送數(shù)據(jù)
            1> 用CPU通過(guò)串口發(fā)送數(shù)據(jù)時(shí),各寄存器之間的關(guān)系

            2> 串口發(fā)送數(shù)據(jù)時(shí)的流程
            l 將要發(fā)送的一字節(jié)數(shù)據(jù)寫(xiě)入U(xiǎn)0THR
            l 等待數(shù)據(jù)發(fā)送完畢
            3> 相關(guān)寄存器配置
            (1)U0THR(發(fā)送保持寄存器)
            l 最用:只寫(xiě)寄存器。U0THR是UART0 Tx FIFO的最高字節(jié)。它包含了Tx FIFO 中最新的字符,可通過(guò)總線接口寫(xiě)入。串口發(fā)送數(shù)據(jù)時(shí),低位在先,bit0代表最先發(fā)送的位。
            l 長(zhǎng)度:8位寄存器
            (2)U0LSR(線狀態(tài)寄存器)
            在上面已經(jīng)介紹,在此步再涉及。
            4> 串口發(fā)送數(shù)據(jù)程序

            void UART0_SendByte(uint8 data)
            {
            U0THR = data;
            while(0 == (U0LSR & 0x40));


            4. 完整的程序事例:
            用輪訓(xùn)方式實(shí)現(xiàn)接收上位機(jī)數(shù)據(jù),并把數(shù)據(jù)再發(fā)送給上位機(jī)。

            [c-sharp] view plaincopyprint?
            1. #include "config.h"
            2. void DelayNS(uint32 dly)
            3. {
            4. uint32 i;
            5. for(; dly>0; dly--)
            6. {
            7. for(i=0; i<5000; i++);
            8. }
            9. }
            10. void UART0_Init(uint32 bps)
            11. {
            12. uint16 Fdiv;
            13. PINSEL0 = 0x00000005; //設(shè)置串口引腳
            14. U0LCR = 0x83; //置為除數(shù)鎖存位,進(jìn)行配置
            15. Fdiv = (Fpclk >> 4) / bps; // 設(shè)置波特率
            16. U0DLM = Fdiv >> 8;
            17. U0DLL = Fdiv & 0xff;
            18. U0LCR = 0x03; //清除除數(shù)鎖存位,并設(shè)置工作模式
            19. }
            20. uint8 UART0_RcvByte(void)
            21. {
            22. uint8 rcv_data ;
            23. while((U0LSR&0X01)==0); //等待數(shù)據(jù)到達(dá)
            24. rcv_data = U0RBR; //從U0RBR中讀出接收到的數(shù)據(jù)
            25. return rcv_data; //返回接收到的數(shù)據(jù)
            26. }
            27. void UART0_SendByte(uint8 data)
            28. {
            29. U0THR = data;
            30. while(0 == (U0LSR & 0x40));
            31. }
            32. void UART0_RecBuf (uint8 *buffer)
            33. {
            34. uint8 *pbuffer;
            35. uint8 i;
            36. for(pbuffer = buffer, i = 0;i < 8; i++)
            37. {
            38. *(pbuffer++) = UART0_RcvByte();
            39. }
            40. }
            41. void UART0_SendBuf(uint8 *buffer)
            42. {
            43. uint8 *pbuffer;
            44. uint8 i;
            45. for(pbuffer = buffer,i=0;i < 8; i++)
            46. UART0_SendByte(*(pbuffer++));
            47. }
            48. int main (void)
            49. {
            50. uint8 recver_buffer[8]; //定義接收幀緩沖區(qū)
            51. uint8 send_buffer[8] ={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27}; //定義發(fā)送幀緩沖區(qū)
            52. UART0_Init(115200);
            53. while(1)
            54. {
            55. UART0_RecBuf(recver_buffer);
            56. DelayNS(10);
            57. if(0x10 ==recver_buffer[0] && 0x11 == recver_buffer[1])
            58. UART0_SendBuf(recver_buffer);
            59. else
            60. UART0_SendBuf(send_buffer);
            61. }
            62. return 0;
            63. }


            上一頁(yè) 1 2 下一頁(yè)

            關(guān)鍵詞: ARM7串口編

            評(píng)論


            技術(shù)專(zhuān)區(qū)

            關(guān)閉