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);应该是正确的轮询方式;上面那行条件永远不会成立,所以肯定直接就跳过去了,搞不懂这程序是怎么工作起来的,到底有没有复位?? |
使用STM32G431做HID Keyboard与CDC符合设备,发现根本做不成,可能是ST提供的库的问题
STM32U073的usb问题。
STM32F103标准库配置的虚拟串口,设备描述符请求失败
STM32L4R9最大支持SD卡的容量是?支持SDXC 64G卡吗?
usb虚拟多个串口如何操作?
USBX在F407上创建CDC不能正常使用
stm32F407作为usb device时,PC发数据下去,为什么会收到一样的数据?
USB复合设备MSC+CDC,MSC异常影响CDC收发
STM32F407 作USB host 驱动 声卡 问题
STM32F407 USB 的FIFO究竟有多少空间?
usb_reg.h:
第120行:#define ISTR_DOVR (0x4000) /* DMA OVeR/underrun (clear-only bit) */
第148行:#define CNTR_DOVRM (0x4000) /* DMA OVeR/underrun Mask */
什么是DMA? 这跟这里的定义有关系吗?
中英文手册我都查了,没有这个定义。