事关USB CustomHID终止了FreeRTOS任务调度...
本帖最后由 tovax 于 2016-5-10 10:42 编辑PC: win7 32bit
开发板: STM3210E
IDE: keil4.7 mdk
事情的经过是这样的:
这两天把FreeRTOS移植到STM3210E的开发板上,就跑了一个LED任务,1HZ的频率闪烁。
然后找到stm32 usb库,把里边的Custom_HID移植到FreeRTOS系统中,USB任务也运行正常。
在两个任务交替执行的过程中,拔掉USB线,不好的事情发生了,LED停止闪烁了。。。
这么看来,应该是USB的挂起导致了FreeRTOS任务调度的停止,请问是哪个地方出问题了呢?
重新把USB插入后,两个任务都运行正常。。。
请来来往往的大神们指点迷津,Best Regards!
怎么感觉是你把USB供电线拔掉了 本帖最后由 tovax 于 2016-5-10 11:29 编辑
moyanming2013 发表于 2016-5-10 10:57
怎么感觉是你把USB供电线拔掉了
有单独供电的,USB拔掉后不影响STM32的供电。
不过在您的启发下,我拔了jlink,貌似正常了,好像不稳定,同样的操作有时候可以,有时候不行。。。
jlink仿真是不是需要设置频率什么的,一仿真就死机一样了,LED完全没反应。。。
十分感谢! 好像是这样的,我以为是FreeRTOS的任务调度被终止了,多等了一段时间发现是这样的:
本来LED是1秒钟交替闪烁的,拔掉USB线后,变成8秒多交替闪烁,因此,一不小心看上去像是死机了。
插上USB后,立刻变成1秒交替闪烁。拔掉就变成8秒。
这...真费解... USB线一直处于拔掉状态,LED闪烁频率是不稳定的,一会儿很慢(8秒左右),一会儿正常(1秒) 找到USB的suspend中断,看下是不是拔掉USB后进入了休眠。 creep 发表于 2016-5-10 13:39
找到USB的suspend中断,看下是不是拔掉USB后进入了休眠。
/*******************************************************************************
* Function Name: Suspend
* Description : sets suspend mode operating conditions
* Input : None.
* Output : None.
* Return : USB_SUCCESS.
*******************************************************************************/
void Suspend(void)
{
uint32_t i =0;
uint16_t wCNTR;
uint32_t tmpreg = 0;
__IO uint32_t savePWR_CR=0;
/* suspend preparation */
/* ... */
/*Store CNTR value */
wCNTR = _GetCNTR();
/* This a sequence to apply a force RESET to handle a robustness case */
/*Store endpoints registers status */
for (i=0;i<8;i++) EP = _GetENDPOINT(i);
/* unmask RESET flag */
wCNTR|=CNTR_RESETM;
_SetCNTR(wCNTR);
/*apply FRES */
wCNTR|=CNTR_FRES;
_SetCNTR(wCNTR);
/*clear FRES*/
wCNTR&=~CNTR_FRES;
_SetCNTR(wCNTR);
/*poll for RESET flag in ISTR*/
while((_GetISTR()&ISTR_RESET) == 0);
/* clear RESET flag in ISTR */
_SetISTR((uint16_t)CLR_RESET);
/*restore Enpoints*/
for (i=0;i<8;i++)
_SetENDPOINT(i, EP);
/* Now it is safe to enter macrocell in suspend mode */
wCNTR |= CNTR_FSUSP;
_SetCNTR(wCNTR);
/* force low-power mode in the macrocell */
wCNTR = _GetCNTR();
wCNTR |= CNTR_LPMODE;
_SetCNTR(wCNTR);
/*prepare entry in low power mode (STOP mode)*/
/* Select the regulator state in STOP mode*/
savePWR_CR = PWR->CR;
tmpreg = PWR->CR;
/* Clear PDDS and LPDS bits */
tmpreg &= ((uint32_t)0xFFFFFFFC);
/* Set LPDS bit according to PWR_Regulator value */
tmpreg |= PWR_Regulator_LowPower;
/* Store the new value */
PWR->CR = tmpreg;
/* Set SLEEPDEEP bit of Cortex System Control Register */
#if defined (STM32F30X) || defined (STM32F37X)
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
#else
SCB->SCR |= SCB_SCR_SLEEPDEEP;
#endif
/* enter system in STOP mode, only when wakeup flag in not set */
if((_GetISTR()&ISTR_WKUP)==0)
{
__WFI();
/* Reset SLEEPDEEP bit of Cortex System Control Register */
#if defined (STM32F30X) || defined (STM32F37X)
SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);
#else
SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP);
#endif
}
else
{
/* Clear Wakeup flag */
_SetISTR(CLR_WKUP);
/* clear FSUSP to abort entry in suspend mode*/
wCNTR = _GetCNTR();
wCNTR&=~CNTR_FSUSP;
_SetCNTR(wCNTR);
/*restore sleep mode configuration */
/* restore Power regulator config in sleep mode*/
PWR->CR = savePWR_CR;
/* Reset SLEEPDEEP bit of Cortex System Control Register */
#if defined (STM32F30X) || defined (STM32F37X)
SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);
#else
SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP);
#endif
}
}
这是suspend的代码,我是这么想的,即便是suspend死循环了,只要不影响systick中断,freertos总要按套路执行的,咋个就把LED任务弄异常了。。。 本帖最后由 tovax 于 2016-5-10 18:55 编辑
还有个现象,插拔USB之后,再把USB插入,HID控制灯的部分功能正常,电位器采样的部分没反应了
USB控制LED1,LED2,LED3,LED4,以开关形式点击触发
LED任务控制的也是LED1,LED2,LED3,LED4,周期性的亮灭
会不会是控制同一组灯造成的干扰呢
怀疑没玩没了进了挂起中断了。 tovax 发表于 2016-5-10 18:31
这是suspend的代码,我是这么想的,即便是suspend死循环了,只要不影响systick中断,freertos总要按套 ...
进入了suspend中断就进入休眠了。
页:
[1]
2