📄 uart.c
字号:
{
//* Disable interrupts
pUSART->US_IDR = (unsigned int) -1;
//* Reset receiver and transmitter
pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS;
//* Write the Timeguard Register
AT91F_US_SetTimeguard(pUSART, timeguard);
//* Define the USART mode
pUSART->US_MR = mode;
//* Define the baud rate divisor register
AT91F_US_SetBaudrate(pUSART, main_Clock, baudRate);
//* Clear Transmit and Receive Counters
//AT91F_PDC_Open((AT91PS_PDC) &(pUSART->US_RPR));
pUSART->US_RHR=0x0;
pUSART->US_THR=0x0;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US_EnableRx
//* \brief Enable receiving characters
//*----------------------------------------------------------------------------
void AT91F_US_EnableRx (
AT91PS_USART pUSART) // \arg pointer to a USART controller
{
//* Enable receiver
pUSART->US_CR = AT91C_US_RXEN;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US_EnableTx
//* \brief Enable sending characters
//*----------------------------------------------------------------------------
void AT91F_US_EnableTx (
AT91PS_USART pUSART) // \arg pointer to a USART controller
{
//* Enable transmitter
pUSART->US_CR = AT91C_US_TXEN;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US_ResetRx
//* \brief Reset Receiver and re-enable it
//*----------------------------------------------------------------------------
void AT91F_US_ResetRx (
AT91PS_USART pUSART) // \arg pointer to a USART controller
{
//* Reset receiver
pUSART->US_CR = AT91C_US_RSTRX;
//* Re-Enable receiver
pUSART->US_CR = AT91C_US_RXEN;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US_ResetTx
//* \brief Reset Transmitter and re-enable it
//*----------------------------------------------------------------------------
void AT91F_US_ResetTx (
AT91PS_USART pUSART) // \arg pointer to a USART controller
{
//* Reset transmitter
pUSART->US_CR = AT91C_US_RSTTX;
//* Enable transmitter
pUSART->US_CR = AT91C_US_TXEN;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US_DisableRx
//* \brief Disable Receiver
//*----------------------------------------------------------------------------
void AT91F_US_DisableRx (
AT91PS_USART pUSART) // \arg pointer to a USART controller
{
//* Disable receiver
pUSART->US_CR = AT91C_US_RXDIS;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US_DisableTx
//* \brief Disable Transmitter
//*----------------------------------------------------------------------------
void AT91F_US_DisableTx (
AT91PS_USART pUSART) // \arg pointer to a USART controller
{
//* Disable transmitter
pUSART->US_CR = AT91C_US_TXDIS;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US_TxReady
//* \brief Return 1 if a character can be written in US_THR
//*----------------------------------------------------------------------------
unsigned int AT91F_US_TxReady (
AT91PS_USART pUSART ) // \arg pointer to a USART controller
{
return (pUSART->US_CSR & AT91C_US_TXRDY);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US_RxReady
//* \brief Return 1 if a character can be read in US_RHR
//*----------------------------------------------------------------------------
unsigned int AT91F_US_RxReady (
AT91PS_USART pUSART ) // \arg pointer to a USART controller
{
return (pUSART->US_CSR & AT91C_US_RXRDY);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US_Error
//* \brief Return the error flag
//*----------------------------------------------------------------------------
unsigned int AT91F_US_Error (
AT91PS_USART pUSART ) // \arg pointer to a USART controller
{
return (pUSART->US_CSR &
(AT91C_US_OVRE | // Overrun error
AT91C_US_FRAME | // Framing error
AT91C_US_PARE)); // Parity error
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US_PutChar
//* \brief Send a character,does not check if ready to send
//*----------------------------------------------------------------------------
void AT91F_US_PutChar (
AT91PS_USART pUSART,
int character )
{
pUSART->US_THR = (character&0x1ff);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US_GetChar
//* \brief Receive a character,does not check if a character is available
//*----------------------------------------------------------------------------
int AT91F_US_GetChar (
const AT91PS_USART pUSART)
{ while(!AT91F_US_RxReady(pUSART));
return((pUSART->US_RHR) & 0x1FF);
}
//*----------------------------------------------------------------------------
//*\fn AT91F_US_GetChar_Timeout
//*\brief Receive a character with Timeout
//*----------------------------------------------------------------------------
volatile int AT91F_US_GetChr_Timeout(const unsigned timeout,AT91PS_USART pUSART)
{
unsigned long counter=timeout*400;
while((!(pUSART->US_CSR & AT91C_US_RXRDY))&&(counter>0))
counter--;
if(!(pUSART->US_CSR & AT91C_US_RXRDY))
return -1;
else
return((volatile int)pUSART->US_RHR&0x1ff);
}
//*----------------------------------------------------------------------------
//*\fn AT91F_US_Flush
//*\Receive a character
//*----------------------------------------------------------------------------
unsigned int AT91F_US_Flush(AT91PS_USART pUSART)
{
int temp;
if(pUSART->US_CSR & AT91C_US_RXRDY)
{
temp=pUSART->US_RHR&0x1ff;
return 1;
}
else
return 0;
}
//-------------------------------------------------------------------------------
//*\AT91F_US_Sputs
//Send a character,check if the Character is available
//-------------------------------------------------------------------------------
unsigned int AT91F_US_Sputs(AT91PS_USART pUSART,int ch)
{
while(!((pUSART->US_CSR) &AT91C_US_TXRDY));
AT91F_US_PutChar(pUSART,ch);
return 1;
}
//-----------------------------------------------------------------------------
//* \fn AT91F_US_PutStr
//*\brief Send str,does not check if the str is available
//*----------------------------------------------------------------------------
void AT91F_US_PutStr(AT91PS_USART pUSART, char str[256])
{
unsigned int i;
unsigned int sz=0;
sz=strlen(str);
for(i=0;i<sz;i++)
{
while(!(AT91F_US_Sputs(pUSART,str[i])));
}
}
//-----------------------------------------------------------------------------
//*\fn AT91F_US_Printf
//*\brief Formatted Output String
//*----------------------------------------------------------------------------
void AT91F_US_Printf(char *fmt,...)
{
va_list argptr;
char temp_buf[256];
va_start(argptr, fmt);
vsprintf(temp_buf, fmt, argptr);
AT91F_US_PutStr((AT91PS_USART)AT91C_BASE_US0,temp_buf);
va_end(argptr);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_SDRC_CfgPIO
//* \brief Configure PIO controllers to drive SDRC signals
//*----------------------------------------------------------------------------
void AT91F_SDRC_CfgPIO (void)
{
// Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph(
AT91C_BASE_PIOC, // PIO controller base address
((unsigned int) AT91C_PC20_D20 ) |
((unsigned int) AT91C_PC21_D21 ) |
((unsigned int) AT91C_PC30_D30 ) |
((unsigned int) AT91C_PC22_D22 ) |
((unsigned int) AT91C_PC31_D31 ) |
((unsigned int) AT91C_PC23_D23 ) |
((unsigned int) AT91C_PC16_D16 ) |
((unsigned int) AT91C_PC24_D24 ) |
((unsigned int) AT91C_PC17_D17 ) |
((unsigned int) AT91C_PC25_D25 ) |
((unsigned int) AT91C_PC18_D18 ) |
((unsigned int) AT91C_PC26_D26 ) |
((unsigned int) AT91C_PC19_D19 ) |
((unsigned int) AT91C_PC27_D27 ) |
((unsigned int) AT91C_PC28_D28 ) |
((unsigned int) AT91C_PC29_D29 ), // Peripheral A
0); // Peripheral B
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US0_CfgPMC
//* \brief Enable Peripheral clock in PMC for US0
//*----------------------------------------------------------------------------
void AT91F_US0_CfgPMC (void)
{
AT91F_PMC_EnablePeriphClock1(
(AT91PS_PMC)AT91C_BASE_PMC, // PMC controller base address
(AT91PS_CKGR)AT91C_BASE_CKGR, //CKGR
((unsigned int) 1 << AT91C_ID_US0));
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US0_CfgPIO
//* \brief Configure PIO controllers to drive US0 signals
//*----------------------------------------------------------------------------
void AT91F_US0_CfgPIO (void)
{
// Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph(
(AT91PS_PIO)AT91C_BASE_PIOA, // PIO controller base address
((unsigned int) AT91C_PA17_TXD0 ) |
((unsigned int) AT91C_PA18_RXD0 ) , // Peripheral A
0); // Peripheral B
}
#endif // lib_AT91RM9200_H
//*---------------------------------------------------------------------------------
//*Init usart0
//*---------------------------------------------------------------------------------
void AT91F_US0_Init(void)
{
//*step1 Drive US0 signals
AT91F_US0_CfgPIO ();
//*step2 Enable Peripheral clock in PMC for US0
AT91F_US0_CfgPMC();
//*step3 configure US0
AT91F_US_Configure((AT91PS_USART)AT91C_BASE_US0,MCK,AT91C_US_ASYNC_MODE,BAUD_RATE,TIME_GUARD);
//*step4 Enable Tx and Rx
AT91F_US_EnableTx((AT91PS_USART)AT91C_BASE_US0);
AT91F_US_EnableRx((AT91PS_USART)AT91C_BASE_US0);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_DBGU_CfgPIO
//* \brief Configure PIO controllers to drive DBGU signals
//*----------------------------------------------------------------------------
__inline void AT91F_DBGU_CfgPIO (void)
{
// Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph(
AT91C_BASE_PIOA, // PIO controller base address
((unsigned int) AT91C_PA31_DTXD ) |
((unsigned int) AT91C_PA30_DRXD ), // Peripheral A
0); // Peripheral B
}
//*---------------------------------------------------------------------------------
//*Init DBUG
//*---------------------------------------------------------------------------------
void AT91F_DBUG_Init(void)
{
// Open PIO for DBGU
AT91F_DBGU_CfgPIO();
// Configure DBGU
AT91F_US_Configure (
(AT91PS_USART) AT91C_BASE_DBGU, // DBGU base address
60000000, // 60 MHz
AT91C_US_ASYNC_MODE, // mode Register to be programmed
115200 , // baudrate to be programmed
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -