<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          ARM7串口編程要點

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


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


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

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


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

          2> 串口發(fā)送數(shù)據(jù)時的流程
          l 將要發(fā)送的一字節(jié)數(shù)據(jù)寫入U0THR
          l 等待數(shù)據(jù)發(fā)送完畢
          3> 相關(guān)寄存器配置
          (1)U0THR(發(fā)送保持寄存器)
          l 最用:只寫寄存器。U0THR是UART0 Tx FIFO的最高字節(jié)。它包含了Tx FIFO 中最新的字符,可通過總線接口寫入。串口發(fā)送數(shù)據(jù)時,低位在先,bit0代表最先發(fā)送的位。
          l 長度: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)方式實現(xiàn)接收上位機數(shù)據(jù),并把數(shù)據(jù)再發(fā)送給上位機。

          [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. }


          上一頁 1 2 下一頁

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

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();