上图调试串口输出的结果表明, ISR_Vbus这个中断一直在不断地被调用,而且pinVBUS引脚上的电压也在不断地高低变化。为了搞清楚问题的原因,我尝试在函数ISR_Vbus的入口处下断点。当板子插入USB接口时,程序被断了下来,继续单步运行,程序输出VBUS conn。继续全速运行,Windows竟然提示发现新硬件了,板子工作正常。但是如果删除断点全速运行,板子工作就又会不正常,真是一件奇怪的事情。
初步解决
仔细思考一下,单步运行程序和全速运行程序到底有什么区别呢?代码完全一样,但是,单步运行程序的时候在两句代码间会有延迟。由此推测程序中可能需要加入延时。联想到按键去抖动的原理,即检测到电平变化后需要等待一段时间再检测一次以排除干扰,我尝试在PIO_Get(&pinVbus)前加一小段延时,程序变成这样:
//-------------------------------------------------------------------
// Software wait loop -- suspends all tasks!
//-------------------------------------------------------------------
void delay (int wait_time ) {
volatile unsigned int i ; for( i =0; i < wait_time *(BOARD_MCK/10000); i++) {;;;} }
//-------------------------------------------------------------------
/// Handles interrupts coming from PIO controllers.
//-------------------------------------------------------------------
static void ISR_Vbus(const Pin *pPin)
{
// Check current level on VBus delay(1); // Wait a moment if(PIO_Get(&pinVbus)){