【AT91SAM3S】串口UART初始化及收發數據


SAM3S中的UART串口是一個兩線異步收發器。這個串口能用來通信或者跟蹤。有兩個DMA通道與UART串口關聯,可通過使用DMA處理串口傳輸以節省CPU時間。

SAM3S4C中有兩個UART。與外設引腳的對應關系如下:

image

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

SAM3S的UART結構框圖

image

串口初始化,收發數據 的步驟如下:

1、配置相應IO口的引腳(設置IO時鍾及引腳工作模式)

2、打開UART時鍾

3、復位並停止UART

4、設置UART功能(奇偶校驗UART_MR、波特率UART_BRGR、DMA UART_PTCR、收發使能UART_CR 等)

5、收發數據 UART_THR  UART_RHR

串口的初始化程序如下:

//引腳宏定義,串口0收發引腳分別對因PA9 PA10

#define PINS_UART { PIO_PA9A_URXD0|PIO_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));  //配置對應引腳

    /* Configure PMC */
    PMC->PMC_PCER0 = 1 << CONSOLE_ID;  //打開UART時鍾

    /* Reset and disable receiver & transmitter */
    pUart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX
                   | UART_CR_RXDIS | UART_CR_TXDIS;  //復位並停止UART

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

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

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

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

    _ucIsConsoleInitialized=1 ;   //置位初始化狀態
}

串口發送一個字符:

extern void UART_PutChar( uint8_t c )

{

Uart *pUart=CONSOLE_USART ;

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

{

UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);

}

/* Wait for the transmitter to be ready */

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

/* Send character */

pUart->UART_THR=c ; //發送狀態為空時,即可將字符丟到發送寄存器中。

}

串口接收一個字符:

extern uint32_t UART_GetChar( void )

{

Uart *pUart=CONSOLE_USART ;

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

{

UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);

}

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

return pUart->UART_RHR ; //讀取接收到的數據並返回。同時硬件自動復位RXRDY位。

}

 

之后就可以使用了,我在主函數中只用了一句來驗證串口的狀態:

UART_PutChar(UART_GetChar());

即,將電腦端來的數據發回去。驗證下,完全正常了。

當然,這里使用的是查詢方式接收數據。至於中斷方式接收數據,在學會了使用中斷之后會補上來的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM