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