本帖最后由 Simon21ic 于 2012-7-19 15:25 编辑
今天又为了USB困扰了半天了,诶,还是因为自己对于自己的方案太过于执着。
另外,对于绝大部分用户,应该是碰不到这个问题的。对于一些了解特殊优化手段的用户,可能是需要注意一下的。
下面进入正题,这次发现的问题是USB的CNTR寄存器。
CNTR寄存器的FRES置位后,USB复位,然后清除FRES位,但这时需要清掉RESET标志(由于之前置位FRES引起的),那很简单,ISTR寄存器直接清零,代码如下:
SetCNTR(CNTR_FRES);
SetCNTR(0);
SetISTR(0);
ST的Library中的代码类似:
/*** CNTR_PWDN = 0 ***/
wRegVal = CNTR_FRES;
_SetCNTR(wRegVal);
/*** CNTR_FRES = 0 ***/
wInterrupt_Mask = 0;
_SetCNTR(wInterrupt_Mask);
/*** Clear pending interrupts ***/
_SetISTR(0);
时序貌似没有问题,但是,在超高代码优化的情况下,RESET标志是无法清零的,汇编如下:
测试发现,单步调试正常,连续运行不正常,RESET标志没有清零。
第一想到的就是延时,继续测试发现,增加7个nop后解决,少于7个都会出问题,汇编如下:
请问,是否有明确的参数,清FRES后,要过多少个clock才能清RESET标志?貌似是8个? |