|
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);应该是正确的轮询方式;上面那行条件永远不会成立,所以肯定直接就跳过去了,搞不懂这程序是怎么工作起来的,到底有没有复位?? |
STM32F401RBT6 USB 大容量存储设备问题
USB OTG 主机枚举问题
STM32F042 在启动文件内跳转至 USB DFU Bootloader
B-L475E-IOT01A 无法枚举为 USB DFU 设备
USBX Audio Class frame done 不触发回调
STM3210C-EVAL USB 官方例程调试报错
STM32F103 全速 USB 大容量存储方案咨询
STM32H573ZI 全速 USB
STM32F2xx 是否有 UVC 相关示例工程
USBX在F407上创建CDC不能正常使用
微信公众号
手机版
usb_reg.h:
第120行:#define ISTR_DOVR (0x4000) /* DMA OVeR/underrun (clear-only bit) */
第148行:#define CNTR_DOVRM (0x4000) /* DMA OVeR/underrun Mask */
什么是DMA? 这跟这里的定义有关系吗?
中英文手册我都查了,没有这个定义。