|
我用下面这个程序想实现DSP与PC机串口通信
但是不行,串口配置应该没问题,因为同样的配置,我改成查询的方式,就收发正常了
可是用中断就是不行,刚开始学,有很多地方不懂,请教高手
#include "LF2407regs.h"
initial()
{
asm(" setc SXM"); //抑制符号扩展位
asm(" clrc OVM"); //累加器结果正常溢出
asm(" clrc CNF"); //B0被配置为数据存储空间
//asm(" setc INTM"); //禁止所有中断
*SCSR1=0x81DD; //系统时钟频率=4*fin,并使能ADC,SCI,SPI,can,EVB,EVA外设
*WDCR=0x0E8; //不使能看门狗,因为SCSR2中的的WDOVERRIDE
//即WD保护位复位后的缺省值为1,故可以用软件禁止看门狗
*IMR=0x0000; //禁止所有中断
*IFR=0x0FFFF; //清除全部中断标志,"写1清0"
}
void inline disable()
{
asm(" setc INTM"); //禁止所有中断
}
void inline enable()
{
asm(" clrc INTM");
}
main()
{
disable(); //禁止所有中断
initial();
*SCICCR=0x07;
*SCICTL1=0x3;
*SCICTL2=0x13;
*SCIHBAUD=0x2;
*SCILBAUD=0x70;
*SCICTL1=0x33;
*SCIPRI=0x60;
*MCRA=0x3;
*PADATDIR=0x100;
*IMR=0x10;
enable();
*SCITXBUF='';
while(1);
}
void UartSent()
{
const char* var="f2407 UART is fine!"; //定义一段需要发送的字符串
static int i=0;
if(i>strlen(var)) return; //若已经发送完毕,则中断就直接返回
*SCITXBUF=var[i++]; //依次发送定义的字符串中的各个字符
*IFR=0x0010; //清除IFR中相应的中断标志位
enable(); //开总中断,因为一进入中断服务程序总中断就自动关闭了
}
void UartRec()
{
static int recieve[10],j=0;
recieve[j++]=*SCIRXBUF; //依次接收各个字符
if(j>9) j=0;
*IFR=0x0010; //清除IFR中相应的中断标志位
enable(); //开总中断,因为一进入中断服务程序总中断就自动关闭了
}
void interrupt uarttr()
{
switch(*PVIR)
{
case 6: UartRec();
case 7: UartSent();
}
}
void interrupt nothing()
{
return;
} |
|