你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32_USB-FS-Device_Lib_V4.1.0官方库里的一个问题

[复制链接]
uzslm 提问时间:2017-10-18 18:05 /
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);应该是正确的轮询方式;上面那行条件永远不会成立,所以肯定直接就跳过去了,搞不懂这程序是怎么工作起来的,到底有没有复位??
收藏 评论1 发布时间:2017-10-18 18:05

举报

1个回答
uzslm 回答时间:2017-10-18 22:56:40
还有一个明显的错误,虽然不影响程序功能,但看着不舒服:
usb_reg.h:
第120行:#define ISTR_DOVR   (0x4000) /* DMA OVeR/underrun (clear-only bit) */
第148行:#define CNTR_DOVRM  (0x4000) /* DMA OVeR/underrun Mask */

什么是DMA? 这跟这里的定义有关系吗?
中英文手册我都查了,没有这个定义。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版