at91sam7x256的程序
发送0x55,串口调试助手收到0xaa
发送0xbb,串口调试助手受到0xdd
#include
#include "UART0.H"
#define Fosc 18432000
#define AT91B_MAIN_OSC 18432000 // Main Oscillator MAINCK
#define AT91B_MCK ((18432000*73/14)/2) // Output PLL Clock
AT91PS_PIO GPIO_A=AT91C_BASE_PIOA;
AT91PS_USART UART0 =AT91C_BASE_US0;
//----------------------------------------
AT91S_AIC * pAIC=AT91C_BASE_AIC;
unsigned char DacContralBuff[16];
//----------------------------------------
void SendChar(unsigned char CH)
{
while(!(UART0->US_CSR&0X02));
UART0->US_THR=CH;
}
//----------------------------------------
unsigned char GetChar()
{
unsigned char ch;
return ch;
}
//-----------------------------------------
__irq void Usart0ISR(void)
{
*AT91C_AIC_ICCR|=(1 << AT91C_ID_US0);
if(UART0->US_CSR&0X01)
{
DacContralBuff[0]=UART0->US_RHR&0xff;
SendChar(DacContralBuff[0]);
}
*AT91C_AIC_EOICR = 0X00;
}
//=================
__inline unsigned int AT91F_US_Baudrate (
const unsigned int main_clock, // \arg peripheral clock
const unsigned int baud_rate) // \arg UART baudrate
{
unsigned int baud_value = ((main_clock*10)/(baud_rate * 16));
if ((baud_value % 10) >= 5)
baud_value = (baud_value / 10) + 1;
else
baud_value /= 10;
return baud_value;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US_SetBaudrate
//* \brief Set the baudrate according to the CPU clock
//*----------------------------------------------------------------------------
__inline void AT91F_US_SetBaudrate (
AT91PS_USART pUSART, // \arg pointer to a USART controller
unsigned int mainClock, // \arg peripheral clock
unsigned int speed) // \arg UART baudrate
{
//* Define the baud rate divisor register
pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_US_SetTimeguard
//* \brief Set USART timeguard
//*----------------------------------------------------------------------------
__inline void AT91F_US_SetTimeguard (
AT91PS_USART pUSART, // \arg pointer to a USART controller
unsigned int timeguard) // \arg timeguard value
{
//* Write the Timeguard Register
pUSART->US_TTGR = timeguard ;
}
//=================
void Init_UART0()
{
unsigned int temp=0;
GPIO_A->PIO_PER =0XfFFFFFFF;
GPIO_A->PIO_OER=0X03;//PA0,PA1设置为输出
GPIO_A->PIO_SODR =0X03; //设置为高
*AT91C_PMC_PCER = (unsigned int)1<
GPIO_A->PIO_PDR =0x03; //设为外设
GPIO_A->PIO_ASR =0X03; //设为外设A
UART0->US_CR|= AT91C_US_RSTRX | /* Reset Receiver */
AT91C_US_RSTTX | /* Reset Transmitter */
AT91C_US_RXDIS | /* Receiver Disable */
AT91C_US_TXDIS; /* Transmitter Disable */
// UART0->US_MR=0X108C0; //主时钟,8位数据,一位停止位,无校验 ,高位在前,异步模式
UART0->US_MR=AT91C_US_USMODE_NORMAL | /* Normal Mode */
AT91C_US_CLKS_CLOCK | /* Clock = MCK */
AT91C_US_CHRL_8_BITS | /* 8-bit Data */
AT91C_US_PAR_NONE | /* No Parity *///OVER=1 溢出错误
AT91C_US_NBSTOP_1_BIT |
AT91C_US_MSBF; /* 1 Stop Bit */ //SYNC=0异步 SYNC=1同步
//异步模式 波特率=MCK/16/BRD或MCK/8/BRD;同步为波特率=MCK/BRD
UART0->US_BRGR=AT91F_US_Baudrate(AT91B_MCK,9600);// (Fosc/(9600*16)); //AT91B_MCK
// UART0->US_BRGR|=Fosc/(9600*16)<<8;
UART0->US_CR=0X50;
UART0->US_CR |= AT91C_US_RXEN | /* Receiver Enable */
AT91C_US_TXEN; /* Transmitter Enable */
//UART0->US_IDR=0;
//UART0->US_CSR//通道状态寄存器 2-发送状态,1-接收状态
/* Setup Usart Interrupt Mode and Vector with Priority 7 and Enable it */
// pAIC->AIC_SMR[AT91C_ID_US1] = 5;//设置触发模式和优先级7等级最高
pAIC->AIC_SMR[AT91C_ID_US0] = 6; //双串口中断方式接收数据需设优先级
UART0->US_IER =AT91C_US_RXRDY; //接收中断使能
// pUSART1->US_IER =AT91C_US_RXRDY;
pAIC->AIC_SVR[AT91C_ID_US0] = (unsigned long) Usart0ISR;//串口0中断地址放入向量表
// pAIC->AIC_SVR[AT91C_ID_US1] = (unsigned long) Usart1ISR;//串口1中断地址放入向量表
pAIC->AIC_IECR |=(1 << AT91C_ID_US0)|(1 << AT91C_ID_US1);//串口中断使能
UART0->US_IER=0X01; //接受中断使能
}
//----------------------------------------