AT91SAM3S串口UART初始化及收發(fā)數據
SAM3S4C中有兩個UART。與外設引腳的對應關系如下:
本文引用地址:http://www.biyoush.com/article/201611/318274.htm板子上使用的是UART0,及PA9和PA10引腳。
SAM3S的UART結構框圖
串口初始化,收發(fā)數據 的步驟如下:
1、配置相應IO口的引腳(設置IO時鐘及引腳工作模式)
2、打開UART時鐘
3、復位并停止UART
4、設置UART功能(奇偶校驗UART_MR、波特率UART_BRGR、DMA UART_PTCR、收發(fā)使能UART_CR 等)
5、收發(fā)數據 UART_THR UART_RHR
串口的初始化程序如下:
//引腳宏定義,串口0收發(fā)引腳分別對因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; //接收和發(fā)送都不使用DMA
/* Enable receiver and transmitter */
pUart->UART_CR = UART_CR_RXEN UART_CR_TXEN; //使能傳輸
_ucIsConsoleInitialized=1 ; //置位初始化狀態(tài)
}
串口發(fā)送一個字符:
extern void UART_PutChar( uint8_t c )
{
Uart *pUart=CONSOLE_USART ;
if ( !_ucIsConsoleInitialized )//每次發(fā)送數據都先判斷一下串口是否已經被初始化了
{
UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);
}
/* Wait for the transmitter to be ready */
while ( (pUart->UART_SR & UART_SR_TXEMPTY) == 0 ) ;//等待串口狀態(tài)寄存器中,發(fā)送寄存器為空的標志
/* Send character */
pUart->UART_THR=c ; //發(fā)送狀態(tài)為空時,即可將字符丟到發(fā)送寄存器中。
}
串口接收一個字符:
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 ) ; //等待串口狀態(tài)寄存器中的RXRDY置位,這個為表示串口完整地接收了一個數據
return pUart->UART_RHR ; //讀取接收到的數據并返回。同時硬件自動復位RXRDY位。
}
之后就可以使用了,我在主函數中只用了一句來驗證串口的狀態(tài):
UART_PutChar(UART_GetChar());
即,將電腦端來的數據發(fā)回去。驗證下,完全正常了。
當然,這里使用的是查詢方式接收數據。至于中斷方式接收數據,在學會了使用中斷之后會補上來的。
評論