zoukankan      html  css  js  c++  java
  • 【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());

    即,将电脑端来的数据发回去。验证下,完全正常了。

    当然,这里使用的是查询方式接收数据。至于中断方式接收数据,在学会了使用中断之后会补上来的。

  • 相关阅读:
    Tomcat启动报Error listenerStart错误
    The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly
    (转)Android之Adapter用法总结
    利用脚本启动java程序
    Android中的基类—抽取出来公共的方法
    关于 Android 中未公开的类(用@hide隐藏的类)
    Android java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    gen already exists but is not a source folder
    如何注册java程序为windows服务
    Android Socket编程
  • 原文地址:https://www.cnblogs.com/zyqgold/p/3273304.html
Copyright © 2011-2022 走看看