新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AT91SAM3S串口UART初始化及收發數據

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

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

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

        本文引用地址:http://www.104case.com/article/201611/318274.htm


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

        SAM3S的UART結構框圖


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

        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_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)); //配置對應引腳

        /* 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());

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

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




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 墨江| 澄江县| 芜湖县| 呼伦贝尔市| 定远县| 西乌珠穆沁旗| 饶平县| 确山县| 无极县| 绥芬河市| 马鞍山市| 平武县| 仁怀市| 遵义市| 西峡县| 佛坪县| 伊宁市| 福贡县| 武陟县| 嘉峪关市| 抚顺县| 涟水县| 成安县| 武山县| 迁安市| 宜良县| 和龙市| 平罗县| 桦南县| 贵定县| 上蔡县| 拜城县| 通山县| 宜川县| 仙游县| 寻甸| 叙永县| 荥经县| 萨迦县| 新晃| 青河县|