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

          新聞中心

          ARM入門筆記(6)

          作者: 時(shí)間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
          RS232串口通信

          ——串口USART0通訊實(shí)驗(yàn)

          一.實(shí)驗(yàn)?zāi)康?br />
          利用串口調(diào)試軟件能夠正確接收到AT91SAM7S64發(fā)出的數(shù)據(jù),AT91SAM7S64也能正確接收到調(diào)試軟件發(fā)出的數(shù)據(jù)。

          二.實(shí)驗(yàn)程序和參數(shù)設(shè)置

          1>連接器選項(xiàng)設(shè)置和啟動(dòng)代碼都與上個(gè)實(shí)驗(yàn)相同
          2>C語言的代碼

          #i nclude "AT91SAM7S64.h"
          #i nclude "Board.h"
          unsigned char RBuff[256]; //定義接收緩沖區(qū)
          unsigned char index;
          int main(void)
          {
          unsigned int i, delay;
          *AT91C_CKGR_MOR = 0x701; //使能主振蕩器和設(shè)置起振時(shí)間
          *AT91C_PMC_MCKR = 0x01; //選擇Mster Clock is main clock, divided by 0
          *AT91C_PMC_SCER = AT91C_CKGR_MOSCEN;//使能系統(tǒng)時(shí)鐘寄存器的處理器時(shí)鐘
          *AT91C_PMC_PCER = AT91C_ID_US0; //使能USART0時(shí)鐘
          *AT91C_PIOA_PDR = US_RXD_PIN | US_TXD_PIN;//禁止該兩個(gè)管腳的I/O口功能
          *AT91C_PIOA_ASR= US_RXD_PIN | US_TXD_PIN;//將該兩個(gè)I/O口分配給外圍A
          *AT91C_US1_MR =0x8c0;//正常模式,時(shí)鐘為MCK,8位長(zhǎng)度,無校驗(yàn),1位停止位,
          *AT91C_US0_IDR= 0xf3fff; //禁止所有UART相關(guān)的中斷
          *AT91C_US0_BRGR = 30;//設(shè)置波特率為38400Hz,AT91C_US0_BRGR為CD值
          //Baudrate=SelectedClock/(8(2-Over)CD) = MCK/16CD = 18432000/(16*30) = 38400
          *AT91C_US0_CR = 0x15c; //復(fù)位接收器、發(fā)送器和狀態(tài)位;使能接收與發(fā)送
          index = 0;
          while (1)
          {
          for (i = 0; i
          { //發(fā)送程序
          if ((*AT91C_US0_CSR) & AT91C_US_TXEMPTY) //判斷發(fā)送器是否為空
          {
          *AT91C_US0_THR = i; //空,則發(fā)送數(shù)據(jù)
          }
          for (delay = 0; delay
          }
          if ((*AT91C_US0_CSR) & AT91C_US_RXRDY)
          {//接收程序,在調(diào)試該部分時(shí),要將發(fā)送部分程序注示掉
          RBuff[index++] = *AT91C_US0_RHR;
          }
          }
          }

          三.出現(xiàn)的問題與解決方法

          1> 狀態(tài)寄存器中的發(fā)送準(zhǔn)備位(TXRDY)和發(fā)送空標(biāo)志位(TXEMPTY)一直為0,表示發(fā)送器未準(zhǔn)備好和緩沖區(qū)不空。

          原因是發(fā)送器復(fù)位后還未使能。不能同時(shí)進(jìn)行發(fā)送器(或接收器)復(fù)位與使能操作(*AT91C_US0_CR= 0x15c),這樣使能操作會(huì)無效,必須將它們分開,即先進(jìn)行復(fù)位(*AT91C_US0_CR= 0x10c),再進(jìn)行使能(*AT91C_US0_CR = 0x50)。

          2> 串口接收、發(fā)送的數(shù)據(jù)不對(duì)

          原因是系統(tǒng)主時(shí)鐘和分頻后的時(shí)鐘計(jì)算錯(cuò)誤,引起波特率也計(jì)算錯(cuò)誤。很有必要深入研究關(guān)于時(shí)鐘的產(chǎn)生、分頻及波特率計(jì)算等內(nèi)容。

          3> 每次從串口調(diào)試軟件收到的數(shù)據(jù)中,低四位正確,高四位錯(cuò)誤。

          原因是將“*AT91C_US0_MR =0x8c0;”寫成了“*AT91C_US1_MR =0x8c0;”,而引起通訊模式根本不對(duì)??梢哉f這是一個(gè)非常低級(jí)的錯(cuò)誤,但它卻花費(fèi)了我很久的時(shí)間才找到癥結(jié)所在。在找原因的過程中,使我對(duì)串口相關(guān)的(如各種時(shí)鐘的產(chǎn)生、波特率的計(jì)算等)內(nèi)容有了更深刻的理解。

          四.總結(jié)

          在本實(shí)驗(yàn)中串口為異步模式,波特率的計(jì)算如下式所示:

          Baudrate = SelectedClock/(8(2-Over)CD)

          其中在USART模式寄存器(AT91C_US0_MR)中設(shè)置SelectedClock為MCK;Over為1則上式變成如下所示:

          Baudrate = SelectedClock/(8(2-Over)CD) = MCK/16CD

          在Master Clock Register(AT91C_PMC_MCKR)中將MCK設(shè)置為Main Clock且不分頻,即為外部振蕩時(shí)鐘(接在XIN和XOUT管腳間的晶振)的頻率,因?yàn)橥獠烤д袷?8.432MHz,所以MCK就為 18432000,則上式變成如下所示:

          Baudrate=SelectedClock/(8(2-Over)CD) = MCK/16CD = 18432000/(16*30) = 38400


          關(guān)鍵詞: ARM入門筆記RS232串口通

          評(píng)論


          技術(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); })();