|
各位大虾,自己写了一个这样的串口程序,但是就是不进中断,AT91接受不到串口调试助手发的数据. 调试助手用的是SSCOM32. 程序如下:
有3个LED灯 在PA0 PA1 PA2 口 是灌电流的接法 调试助手发大于7的数字时,LED全亮 ,小于等于7时,根据数据值点亮LED
#define Fmck 48054857L /*主时钟为48054857MHz*/
#define BitRate 9600UL /*波特率定义为9600bps*/
unsigned char key;用来存储接受的数据
int main(void)
{
//int i;
Uart1Init(); //串口0初始化
SystemClockInit(); //系统时钟初始化
LedInit(); //LED对应的管脚初始化
DelayXms(2000);
key=0;
while(1)
{
if(key>=7)
{
*AT91C_PIOA_CODR=0x07;
}else{
*AT91C_PIOA_SODR=0x07;
*AT91C_PIOA_CODR=key;
}
}
}
void LedInit(void)
{
*AT91C_PIOA_PER=0x07; //Enable PA0~2
*AT91C_PIOA_OER=0x07; //Output Enable PA0~2
*AT91C_PIOA_CODR=0x07; //ON all leds
}
void SystemClockInit(void)
{
*AT91C_PMC_IDR = 0xFFFFFFFF; //disable all PMC interrupt
*AT91C_PMC_SCER = 1<<0 ; //Processor Clock Enable
*AT91C_CKGR_MOR = (1<<0) //Main Oscillator Enable
|(0<<1) //Oscillator is NOT Bypassed
|(0xFF<<8); //Main Oscillator Start-up Time(255)
while(!((*AT91C_PMC_SR)&0x01)); //wait for MOSCS to be set
*AT91C_CKGR_PLLR = (0x0E<<0) //DIV
|(0x3F<<8) //PLL COUNT
|(0x00<<14) //OUT
|(0x48<<16) //MUL
|(0x01<<28); //USB DIV
while(!((*AT91C_PMC_SR)&(0x01<<2))); //wait for LOCK to be set
while(!((*AT91C_PMC_SR)&(0x01<<3))); //wait for MCKRDY to be set
*AT91C_PMC_MCKR = (0<<0) //Slow Clock is selected
|(1<<2); //Selected clock divided by 2
while(!((*AT91C_PMC_SR)&(0x01<<3))); //wait for MCKRDY to be set
*AT91C_PMC_MCKR |= (0x03<<0); //PLL Clock is selected.
while(!((*AT91C_PMC_SR)&(0x01<<3))); //wait for MCKRDY to be set
*AT91C_PMC_PCER =0xFFFFFFFF; //enable all Peripheral Clock
}
void Uart1Init(void)
{
//PIO模块
*AT91C_PIOA_PDR=(1<<21)|(1<<22); //PA5,PA6 作为外设使用
*AT91C_PIOA_IDR=(1<<21)|(1<<22); //禁止PA5、PA6 IO中断
*AT91C_PIOA_PPUER=(1<<21)|(1<<22); //使能PA5、PA6上拉电阻
*AT91C_PIOA_ASR=(1<<21)|(1<<22); //连接到A外设(即串口)
//UART模块
*AT91C_US1_CR = (1<<2) //Reset Receiver
|(1<<3) //Reset Transmitter
|(1<<8); //Reset Status Bits
*AT91C_US1_CR = (1<<4) //Receiver Enable
|(1<<6); //Transmitter Enable
*AT91C_US1_MR = (0<<0) //Normal
|(0<<4) //MCK
|(3<<6) //8 bits
|(0<<8) //USART operates in Asynchronous Mode.
|(4<<9) //No parity
|(0<<13) //1 stop bit
|(0<<14) //Normal Mode
|(0<<16) //Least Significant Bit is sent/received first.
|(0<<17) //CHRL defines character length.
|(0<<18) //The USART does not drive the SCK pin.
|(0<<19) //16x Oversampling.
|(1<<20); //The NACK is not generated.
*AT91C_US1_IER = (1<<0); //RXRDY Interrupt Enable
*AT91C_US1_BRGR = (Fmck/16/BitRate); //产生指定的波特率
*AT91C_US1_RTOR = 0; //The Receiver Time-out is disabled.
*AT91C_US1_TTGR = 0; //The Transmitter Timeguard is disabled.
//中断控制模块
//初始化中断源6(串口0中断)
AT91C_AIC_SMR[7] = (7<<0) //The priority level = 0(lowest)
|(3<<5); //Positive edge triggered
AT91C_AIC_SVR[7]=(int)Uart1Isr; //set ISR entrance address
*AT91C_AIC_IECR=(1<<7); //Enable source ID 6 interrupt
}
void Uart1Isr(void) __irq
{
//unsigned char dat;
if(*AT91C_AIC_ISR!=7)return; //不是该中断源,直接返回
//*AT91C_AIC_ICCR=1<<6; //使用了向量中断,会自动清除中断,这里不用
//清除串口0状态标志
if(!((*AT91C_US1_CSR)&(1<<0)))return; //不是接收完毕中断,返回
key=(unsigned char)(*AT91C_US1_RHR); //读取数据
*AT91C_US1_CR|=1<<8;
*AT91C_AIC_EOICR=0; //中断处理完毕
}
请大虾帮忙分析下什么原因,是调试助手用的不对,还是程序有问题. 我搞了好久都没找到原因.
|
|