void main(void)
{
int ch;
Uart_Init();
ch=getchar();
Uart_SentByte(ch);
//dm9000IrqInit();
dm_init();
}
void Uart_Init(void)
{
rGPACON=(rGPACON&~(0xff<<0))|(0x22<<0);//A口设置为UART
rGPAPUD=(rGPAPUD&~(0xff<<0))|(0x1<<0);//A口允许下拉
rULCON0=0x03;//设置传输帧格式
rUCON0=(0<<10)|(1<<9)|(1<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1<<0);//选择时钟源及操作模式
rUMCON0=0x00;//屏蔽Medom
rUFCON0=0x01;//启用FIFO
rUBRDIV0=35;//设置波特率为115200,ARMclk为532M、MPLLOUT为266M、HCLKx2=133M、PCLK=66.5
rUDIVSLOT0=0x80;//为什么和是否配置时钟无关 是否用程序化初始化时钟都可以串口输出。
}
//接收字符程序
char getchar(void)
{
while((rUFSTAT0&0x7f)==0);
return rURXH0;
}
//发送字符程序
void Uart_SentByte(char data)
{
while(rUFSTAT0&(1<<14))
;//等待发送缓冲器空
//Timer0_yms(1);
rUTXH0=data;//向发送缓冲器写入数据
}
void dm9000IrqInit(void)
{
//GPIO配置
rGPNCON|=(0x2<<14);//设置GPN7用于EINT7
//EINT配置
rEINT0CON0=(rEINT0CON0 & ~(0xff<<0))|(0x22<<0)|(0x0<<12);//中断子服务寄存器初始化,EINT7低电平触发
rEINT0MASK=(rEINT0MASK & ~(0xff<<0))|(0x00<<0);//禁止屏蔽
rEINT0PEND=(rEINT0PEND & ~(0xff<<0))|(0xff<<0);//清除原有中断,读0代表没有中断,读1代表有中断,写1代表清除中断(不确定,一个博客上说的)
//VIC
rVIC0INTENCLEAR=(rVIC0INTENCLEAR & ~(0xff<<0))|(0x03<<0);//终端使能清除,0没有影响;1,清除相应位置的使能,即禁止中断(不确定为什么要先关中断)
//rVIC1INTENCLEAR=(rVIC1INTENCLEAR & ~(0xff<<0))|(0x00<<0);
rVIC0INTSELECT=(rVIC0INTSELECT & ~(0xff<<0))|(0x00<<0);//选择中断模式IRQorFRQ,EINT7为IRQ中断模式
//rVIC1INTSELECT=(rVIC0INTSELECT & ~(0xff<<0))|(0x00<<0);
rVIC0ADDRESS &= ~(0x03<<0);//清除系统中断,对应位写0或者1都行
rVIC0VECTADDR2=(unsigned int)AnsEint7;//设置中断入口地址
rVIC0INTENABLE=(rVIC0INTENABLE & ~(0xff<<0))|(0x03<<0);//中断使能
}
dm9000IrqInit会导致UART不能用是为什么啊!!!
//main函数很简单,只是进行串口初始化,接收字符并发送;然后DM9000IrqInit是对外部中断7进行初始化,dm9000是对dm9000这个芯片进行初始化;
//如上,如果将dm9000IrqInit()外部中断7的初始化注释掉,串口就可以正常使用,一旦加入dm9000IrqInit()就没有任何反应了。外部中断和UART还有冲突吗,为什么外部中断的初始化会导致UART不能用呢?