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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > AT91SAM3S串口UART初始化及收發(fā)數(shù)據(jù)

          AT91SAM3S串口UART初始化及收發(fā)數(shù)據(jù)

          作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò) 收藏
          SAM3S中的UART串口是一個(gè)兩線異步收發(fā)器。這個(gè)串口能用來(lái)通信或者跟蹤。有兩個(gè)DMA通道與UART串口關(guān)聯(lián),可通過(guò)使用DMA處理串口傳輸以節(jié)省CPU時(shí)間。

          SAM3S4C中有兩個(gè)UART。與外設(shè)引腳的對(duì)應(yīng)關(guān)系如下:

          本文引用地址:http://www.ex-cimer.com/article/201611/318274.htm


          板子上使用的是UART0,及PA9和PA10引腳。

          SAM3S的UART結(jié)構(gòu)框圖


          串口初始化,收發(fā)數(shù)據(jù) 的步驟如下:

          1、配置相應(yīng)IO口的引腳(設(shè)置IO時(shí)鐘及引腳工作模式)

          2、打開(kāi)UART時(shí)鐘

          3、復(fù)位并停止UART

          4、設(shè)置UART功能(奇偶校驗(yàn)UART_MR、波特率UART_BRGR、DMA UART_PTCR、收發(fā)使能UART_CR 等)

          5、收發(fā)數(shù)據(jù) UART_THR UART_RHR

          串口的初始化程序如下:

          //引腳宏定義,串口0收發(fā)引腳分別對(duì)因PA9 PA10

          #define PINS_UART { PIO_PA9A_URXD0PIO_PA10A_UTXD0, PIOA, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT}

          #define CONSOLE_PINS {PINS_UART}

          //使用的串口的宏定義,使用UART0

          #define CONSOLE_USART UART0

          extern void UART_Configure( uint32_t baudrate, uint32_t masterClock)
          {
          const Pin pPins[] = CONSOLE_PINS;
          Uart *pUart = CONSOLE_USART;

          /* Configure PIO */
          PIO_Configure(pPins, PIO_LISTSIZE(pPins)); //配置對(duì)應(yīng)引腳

          /* Configure PMC */
          PMC->PMC_PCER0 = 1 << CONSOLE_ID; //打開(kāi)UART時(shí)鐘

          /* Reset and disable receiver & transmitter */
          pUart->UART_CR = UART_CR_RSTRX UART_CR_RSTTX
          UART_CR_RXDIS UART_CR_TXDIS; //復(fù)位并停止UART

          /* Configure mode */
          pUart->UART_MR = UART_MR_PAR_NO; //設(shè)置奇偶校驗(yàn)(不校驗(yàn))

          /* Configure baudrate */
          /* Asynchronous, no oversampling */
          pUart->UART_BRGR = (masterClock / baudrate) / 16; //設(shè)置波特率

          /* Disable PDC channel */
          pUart->UART_PTCR = UART_PTCR_RXTDIS UART_PTCR_TXTDIS; //接收和發(fā)送都不使用DMA

          /* Enable receiver and transmitter */
          pUart->UART_CR = UART_CR_RXEN UART_CR_TXEN; //使能傳輸

          _ucIsConsoleInitialized=1 ; //置位初始化狀態(tài)
          }

          串口發(fā)送一個(gè)字符:

          extern void UART_PutChar( uint8_t c )

          {

          Uart *pUart=CONSOLE_USART ;

          if ( !_ucIsConsoleInitialized )//每次發(fā)送數(shù)據(jù)都先判斷一下串口是否已經(jīng)被初始化了

          {

          UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);

          }

          /* Wait for the transmitter to be ready */

          while ( (pUart->UART_SR & UART_SR_TXEMPTY) == 0 ) ;//等待串口狀態(tài)寄存器中,發(fā)送寄存器為空的標(biāo)志

          /* Send character */

          pUart->UART_THR=c ; //發(fā)送狀態(tài)為空時(shí),即可將字符丟到發(fā)送寄存器中。

          }

          串口接收一個(gè)字符:

          extern uint32_t UART_GetChar( void )

          {

          Uart *pUart=CONSOLE_USART ;

          if ( !_ucIsConsoleInitialized ) //每次接收數(shù)據(jù)都要判斷下串口是否被初始化了

          {

          UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);

          }

          while ( (pUart->UART_SR & UART_SR_RXRDY) == 0 ) ; //等待串口狀態(tài)寄存器中的RXRDY置位,這個(gè)為表示串口完整地接收了一個(gè)數(shù)據(jù)

          return pUart->UART_RHR ; //讀取接收到的數(shù)據(jù)并返回。同時(shí)硬件自動(dòng)復(fù)位RXRDY位。

          }

          之后就可以使用了,我在主函數(shù)中只用了一句來(lái)驗(yàn)證串口的狀態(tài):

          UART_PutChar(UART_GetChar());

          即,將電腦端來(lái)的數(shù)據(jù)發(fā)回去。驗(yàn)證下,完全正常了。

          當(dāng)然,這里使用的是查詢方式接收數(shù)據(jù)。至于中斷方式接收數(shù)據(jù),在學(xué)會(huì)了使用中斷之后會(huì)補(bǔ)上來(lái)的。




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