|
目的:<br />实现一块AD苾片的全速采样——100kHz。<br /><br /><br />方法:<br />使用的单片机是LPC2142。用了定时器中断和USB中断。定时器10us定时,中断启动AD采样,为最高优先级。USB中断用来向<br /><br />上位机传数据,中断优先级较低。USB驱动用的是公司提供的EasyUSB214x固件程序包。<br /><br /><br />问题:<br />设为100kHz采样,在USB向上位机发送数据时,定时器采样的中断被打断,具体表现就是波形变密。而设为20kHz以下时,就<br /><br />不会出现这个问题。<br /><br /><br />尝试:<br />设置中断嵌套。后来才知道ARM体系跟51体系的中断区别较大,中断优先级没有中断嵌套,需要写一些代码实现。于是以照<br /><br />着《深入浅出ARM7》自己写了一下,全速运行程序时就会显示“USB设备工作不正常”。怀疑是USB中断的嵌套没设对。<br /><br /><br />请教:<br />1。我想实现的目的能用LPC2142和EasyUSB214x固件程序包实现吗?有没有瓶颈?<br />2。如果可以实现,具体应该如何操作?<br />3。以下给出USB中断嵌套的设置,我是参考书上例程写的,不确定对不对:<br /><br />谢谢大家!<br /><br />/***********************************************************************************************************<br /><br />****<br />** 函数名称 : Usb_Exception() Name : Usb_Exception()<br />** 功能描述 : USB 中断服务程序 Function : USB Interrupt Service <br /><br />Program<br />** 输 入 : 无 Input : <br /><br />NULL<br />** 输 出 : 无 Output : <br /><br />NULL<br />************************************************************************************************************<br /><br />****/<br />void __irq Usb_Exception(void) <br />//void Usb_Exception(void) //试一下中断嵌套的写<br /><br />法<br />{<br /> INT32U usb_ints,dev_ints,devstatus;<br /> <br /> uint32 bak; //中<br /><br />断嵌套需要的临时变量<br /> bak=VICIntEnable;<br /> VICIntEnClr=1<<22; //禁止当前中<br /><br />断<br /> VICVectAddr=0x00;<br /> IRQEnable(); //使能IRQ中<br /><br />断,以响应更高优先级的中断<br /> <br /> bEPPflags.bits.in_isr = 1; /* 标识程序进入中断 <br /><br /> flag the program enter interrupt */<br /><br /><br /> <br /> /****** USB status interrupt ******/ <br /> dev_ints = USBDevIntSt;<br /> if (dev_ints & DEVINT_STATUS_DEVSTAT) <br /> { <br /><br />/* USB 总线复位,或挂起,或连接中断 */<br /> devstatus = USB_GetDevStatus();<br /> if ((devstatus & 0x10) != 0)<br /> {<br /> USB_BusReset();<br /> bEPPflags.bits.bus_reset = 1; /* 标识总线复位 flag <br /><br />USB bus reset */<br /> }<br /> <br /> if ((devstatus & 0x08) != 0)<br /> bEPPflags.bits.suspend = 1; /* 标识总线挂起改变 <br /><br /> flag the bus suspend change */<br /> <br /> if ((devstatus & 0x02) != 0)<br /> bEPPflags.bits.con_change = 1; /* 标识总线连接改变 flag <br /><br />the bus connect change */<br /> <br /> USBDevIntClr = DevStatusInterrupt;<br /> goto USB_ISR_EXIT;<br /> } <br /> <br /> /****** data transmission interrupt ******/<br /> usb_ints = USBIntSt & 0x7; <br /> if (usb_ints != 0)<br /> {<br /> if (usb_ints & USBINT_STATUS_HP)<br /> Usb_HPService(); /* 高优先级<br /><br />中断处理 process High priority Interrupt */<br /> <br /> if (usb_ints & USBINT_STATUS_LP)<br /> Usb_LPService(); /* 低优先级<br /><br />中断处理 process Slow priority Interrupt */<br /><br />#if DMA_ENGINE_EN <br /> if (usb_ints & USBINT_STATUS_DMA)<br /> USB_DMAService(); /* DMA中断处<br /><br />理 process DMA Interrupt */<br />#endif<br /> }<br /><br />USB_ISR_EXIT:<br /> bEPPflags.bits.in_isr = 0; /* 标识程序退出中断 <br /><br /> flag the program exit interrupt */<br /><br /> <br /> VICIntEnable=bak;<br /><br />}<br /> |
|