📄 usart.c
字号:
#include "usart.h"
/************************************************************************
函数功能: 串口0初始化函数(非中断模式)
入口参数:
出口参数:
************************************************************************/
void uartinit(void)
{
*AT91C_PMC_PCER|=0x00000040; //PMC外设时钟使能
*AT91C_PIOA_PDR|=0x00000060; //Disable I/O,PA5=RXD0,PA6=TXD0
*AT91C_PIOA_ASR|=0x00000060; //PIO分配成UART
*AT91C_US0_CR=0XAC; //RESET UART
*AT91C_US0_MR=0X8C0; //8bit,No,1Bit Stop
*AT91C_US0_IDR=0XF3FFF; //Disable UART Interrupt
//*AT91C_US0_BRGR=26; //BARD RATE:38400(CD=30)
*AT91C_US0_BRGR=30;
*AT91C_US0_CR=0X50; //SET UART
}
/************************************************************************
函数功能: 串口1初始化函数(非中断模式)
入口参数:
出口参数:
波特率=9600
************************************************************************/
void Usart1_Init(void)
{
*AT91C_PMC_PCER=(unsigned int)1<<AT91C_ID_US1; //PMC外设时钟使能
*AT91C_PIOA_PDR=AT91C_PA21_RXD1 | AT91C_PA22_TXD1; //Disable I/O,PA5=RXD0,PA6=TXD0
*AT91C_PIOA_ASR=AT91C_PA21_RXD1 | AT91C_PA22_TXD1; //PIO分配成UART
*AT91C_US1_CR=0XAC; //RESET UART
*AT91C_US1_MR=0X8C0; //8bit,No,1Bit Stop
*AT91C_US1_IDR=0XF3FFF; //Disable UART Interrupt
//在MCK=18.432M时,波特率(MCK/16)/CD=9600
*AT91C_US1_BRGR=120;
*AT91C_US1_CR=0X50; //SET UART
}
/************************************************************************
函数功能: 串口0接收中断服务函数
入口参数:
出口参数:
************************************************************************/
void Uart0ISR(void) __irq
{
unsigned int s=0;
unsigned char ch=0;
static unsigned char bI=0;
s = AT91C_BASE_US0->US_CSR;
if(s&0x01) // RXRDY
{
ch = AT91C_BASE_US0->US_RHR;
g_bpData[bI++] = AT91C_BASE_US0->US_RHR;
if (bI==20)
{
bI = 0;
}
}
/*
if(s&0x02) // TXRDY
{
;
}*/
AT91C_BASE_AIC->AIC_EOICR = 1;//End of Interrupt
}
/************************************************************************
函数功能: 串口0初始化函数(中断模式)
入口参数:
出口参数:
************************************************************************/
void uart0init(void)
{
*AT91C_PMC_PCER|=0x00000040; //PMC外设时钟使能
*AT91C_PIOA_PDR|=0x00000060; //Disable I/O,PA5=RXD0,PA6=TXD0
*AT91C_PIOA_ASR|=0x00000060; //PIO分配成UART
*AT91C_US0_CR=0XAC; //RESET UART
*AT91C_US0_MR=0X8C0; //8bit,No,1Bit Stop
*AT91C_US0_IDR=0XF3FFF; //Disable UART Interrupt
//*AT91C_US0_BRGR=26; //BARD RATE:38400(CD=30)
*AT91C_US0_BRGR=30;
*AT91C_US0_CR=0X50; //SET UART
/************************/
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US0] = AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE | 1;
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0]=(unsigned int) Uart0ISR;//赋中断服务函数指针
AT91C_BASE_US0->US_IDR=0xF3FFF; // disable all interrupts
AT91C_BASE_US0->US_IER=0x01;//允许接收中断
AT91C_BASE_AIC->AIC_IECR = (unsigned int)1<<AT91C_ID_US0;
/************************/
}
unsigned char putcharme (unsigned char ch)
{ //Write Character to Serial Port
if (ch == '\n')
{ // Check for CR
while (!((*AT91C_US0_CSR) & AT91C_US_TXRDY)); // Wait for Empty Tx Buffer
*AT91C_US0_THR = '\r'; // Output CR
}
while (!((*AT91C_US0_CSR) & AT91C_US_TXRDY)); // Wait for Empty Tx Buffer
return (*AT91C_US0_THR = ch); // Transmit Character
}
void helloworld(void)
{
unsigned char hello[]={'h','e','l','l','o',' ','w','o','r','l','d','!','\n',};
unsigned char i;
for(i=0;i<13;i++)
{
putcharme(hello[i]);
}
}
void USART0_send_string(unsigned char *bpSendData,unsigned int length)
{
while(length--)
{
putcharme(*(bpSendData++));
}
putcharme(0x0a);
}
void Receivechar(void)
{
if ((*AT91C_US0_CSR) & AT91C_US_RXRDY)
{
bpRBuff[g_bRBuffpiont] = *AT91C_US0_RHR;
g_bRBuffpiont++;
}
}
unsigned char Usart1_putchar (unsigned char ch)
{ //Write Character to Serial Port
if (ch == '\n')
{ // Check for CR
while (!((*AT91C_US1_CSR) & AT91C_US_TXRDY)); // Wait for Empty Tx Buffer
*AT91C_US1_THR = '\r'; // Output CR
}
while (!((*AT91C_US1_CSR) & AT91C_US_TXRDY)); // Wait for Empty Tx Buffer
return (*AT91C_US1_THR = ch); // Transmit Character
}
void hello_laogao(void)
{
unsigned char hello1[]={'h','e','l','l','o',' ','L','a','o','g','a','o','\n',};
unsigned char i;
for(i=0;i<13;i++)
{
Usart1_putchar(hello1[i]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -