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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版