at91sam7x256编程c语言代码,at91sam7x256的程序串口0问题

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;         //接受中断使能

}

//----------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值