SAM3S中的UART串口是一个两线异步收发器。这个串口能用来通讯或许盯梢。有两个DMA通道与UART串口相关,可通过运用DMA处理串口传输以节约CPU时刻。
SAM3S4C中有两个UART。与外设引脚的对应联系如下:
板子上运用的是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());
即,将电脑端来的数据发回去。验证下,彻底正常了。
当然,这儿运用的是查询方法接纳数据。至于中止方法接纳数据,在学会了运用中止之后会补上来的。