STM32_USB-FS-Device_Lib_V4.1.0官方库里的一个问题
Custom_HID demo 项目里的一个文件:文件:usb_pwr.c
函数:
RESULT PowerOn(void)
{
uint16_t wRegVal;
#if !defined (USE_NUCLEO)
/*** cable plugged-in ? ***/
USB_Cable_Config(ENABLE);
#endif
/*** CNTR_PWDN = 0 ***/
wRegVal = CNTR_FRES;
_SetCNTR(wRegVal);
/* The following sequence is recommended:
1- FRES = 0
2- Wait until RESET flag = 1 (polling)
3- clear ISTR register */
/*** CNTR_FRES = 0 ***/
wInterrupt_Mask = 0;
_SetCNTR(wInterrupt_Mask);
/* Wait until RESET flag = 1 (polling) */
while((_GetISTR()&ISTR_RESET) == 1);
/*** Clear pending interrupts ***/
SetISTR(0);
/*** Set interrupt mask ***/
wInterrupt_Mask = CNTR_RESETM | CNTR_SUSPM | CNTR_WKUPM;
_SetCNTR(wInterrupt_Mask);
return USB_SUCCESS;
}
函数的大概意思是:
1. 设置控制寄存器的FRES位,强制USB复位:
/*** CNTR_PWDN = 0 ***/这个注释是啥意思??
wRegVal = CNTR_FRES;
_SetCNTR(wRegVal);
2. 然后清除FRES位:
/*** CNTR_FRES = 0 ***/
wInterrupt_Mask = 0;
_SetCNTR(wInterrupt_Mask);//为啥这里用wInterrupt_Mask变量,上面却用wRegVal?
3. 然后根据代码的意思应该是等待状态寄存器的RESET标志位置位,说明上面的强制复位已经有效:
/* Wait until RESET flag = 1 (polling) */
while((_GetISTR()&ISTR_RESET) == 1);
4. 接着手动将RESET标志位清零,手册里有说明必须软件清零
/*** Clear pending interrupts ***/
SetISTR(0);
有没有感觉第3步有问题?
while((_GetISTR()&ISTR_RESET) == 1);
while((_GetISTR()&ISTR_RESET) == 0);应该是正确的轮询方式;上面那行条件永远不会成立,所以肯定直接就跳过去了,搞不懂这程序是怎么工作起来的,到底有没有复位??
还有一个明显的错误,虽然不影响程序功能,但看着不舒服:
usb_reg.h:
第120行:#define ISTR_DOVR (0x4000) /* DMA OVeR/underrun (clear-only bit) */
第148行:#define CNTR_DOVRM(0x4000) /* DMA OVeR/underrun Mask */
什么是DMA? 这跟这里的定义有关系吗?
中英文手册我都查了,没有这个定义。
页:
[1]