您现在的位置: 爱51代码网 >> 范文 >> 文章正文
Keil-v5开发STM32F103RCT6的USB时勾选后不生效

我在使用Keil-v5版本开发STM32F103RCT6型号的MCU的USB时遇见一个问题,在此请教下。

使用RTE开发的话,在RTE_Device.h中有一个USB Device Full Speed的配置项

其中的CON On/Off Pin设置看描述是用来驱动USB的D+ pull up

我勾选后设置active state = high,Port = GPIOA, Bit = 8(和硬件一致)

问题来了,为什么以上设置不起作用?板子上电后PC没有反应,USB口没有驱动起来

而在程序中直接使用以下代码就可以?

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;                                                                                          
    
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    
GPIO_Init(GPIOA, &GPIO_InitStruct);
 
GPIO_SetBits(GPIOA, GPIO_Pin_8);

stm32F103必须通过控制IO口电平间接控制外部的三极管或mos管来进行usb数据线的上下拉
stm32F2或stm32F4不存在该问题,所以不占用多余两个IO口
最好先检查一下usb线,是否是好的 没有看过你的RTE,如果只是定义,但没有调用IO响应功能,也没有作用。

经过这两天的查找,算是找到了原因:

一 硬件连接
      GPIOA.8做上拉信号输出口,接了1个1K的电阻到GPIOA.12(即USBDP信号)

二 RTE_Device.h中通过Configuration Wizard界面可以配置USB的上拉信号

对应的代码在文件中也能看到// <e> USB Device Full-speed
// <i> Configuration settings for Driver_USBD0 in component ::Drivers:USB Device
#define RTE_USB_DEVICE                  1
 
//     <e> CON On/Off Pin
//     <i> Configure Pin for driving D+ pull-up
//     <i> GPIO Pxy (x = A..G, y = 0..15)
//       <o1> Active State <0=>Low <1=>High
//       <i>  Selects Active State Logical Level
//       <o2> Port <0=>GPIOA <1=>GPIOB <2=>GPIOC <3=>GPIOD
//                 <4=>GPIOE <5=>GPIOF <6=>GPIOG
//       <i>  Selects Port Name
//       <o3> Bit <0-15>
//       <i>  Selects Port Bit
//     </e>
#define RTE_USB_DEVICE_CON_PIN          1
#define RTE_USB_DEVICE_CON_ACTIVE       1
#define RTE_USB_DEVICE_CON_PORT         GPIO_PORT(0)
#define RTE_USB_DEVICE_CON_BIT          8
 
//   </e>


问题来了,在USBD_STM32F10x.c文件中的USBD_HW_Initialize函数代码如下:

 
/**
  \fn          ARM_USBD_STATUS USBD_Initialize (ARM_USBD_SignalDeviceEvent_t   cb_device_event,
                                                ARM_USBD_SignalEndpointEvent_t cb_endpoint_event)
  \brief       Initialize USB Device Interface.
  \param[in]   cb_device_event    Pointer to \ref USBD_SignalDeviceEvent
  \param[in]   cb_endpoint_event  Pointer to \ref USBD_SignalEndpointEvent
  \return      \ref USBD_STATUS
*/
static ARM_USBD_STATUS USBD_HW_Initialize (ARM_USBD_SignalDeviceEvent_t   cb_device_event,
                                           ARM_USBD_SignalEndpointEvent_t cb_endpoint_event) {
 
#if (RTE_USB_DEVICE)
  cbDeviceEvent   = cb_device_event;
  cbEndpointEvent = cb_endpoint_event;
 
 
#if (RTE_USB_DEVICE_CON_PIN)
  // Configure CON pin (controls pull-up on D+ line)
  GPIO_PortClock (RTE_USB_DEVICE_CON_PORT, true);
  GPIO_PinWrite (RTE_USB_DEVICE_CON_PORT, RTE_USB_DEVICE_CON_BIT, !RTE_OTG_FS_VBUS_ACTIVE);
  if (!GPIO_PinConfigure(RTE_USB_DEVICE_CON_PORT, RTE_USB_DEVICE_CON_BIT, GPIO_OUT_OPENDRAIN, GPIO_MODE_OUT10MHZ)) return ARM_USBD_ERROR;
#endif
 
  RCC->APB1ENR   |=  RCC_APB1ENR_USBEN;         // Enable USB Device clock
  RCC->APB1RSTR  |=  RCC_APB1RSTR_USBRST;       // Reset USB Device
  osDelay(1);                                   // Wait 1 ms
  RCC->APB1RSTR  &= ~RCC_APB1RSTR_USBRST;       // Reset USB Device
#endif
 
  return ARM_USBD_OK;
}

另外还有对应的USBD_HW_DeviceConnect()函数,代码如下:

/**
  \fn          ARM_USBD_STATUS USBD_HW_DeviceConnect (void)
  \brief       Connect USB Device.
  \return      \ref ARM_USBD_STATUS
*/
static ARM_USBD_STATUS USBD_HW_DeviceConnect (void) {
  // Soft connect
  GPIO_PinWrite (RTE_USB_DEVICE_CON_PORT, RTE_USB_DEVICE_CON_BIT, RTE_OTG_FS_VBUS_ACTIVE);
 
  CNTR = CNTR_FRES;                             // Force USB Reset
  CNTR = 0;
  ISTR = 0;                                     // Clear Interrupt Status
  CNTR = CNTR_RESETM | CNTR_SUSPM | CNTR_WKUPM; // USB Interrupt Mask
 
  return ARM_USBD_OK;
}


在Initialize函数中,GPIO配置的模式是GPIO_OUT_OPENDRAIN模式,即GPIO是开漏模式。
同时在Initialize和Connect函数中,GPIO_PinWrite()函数使用的参数都是RTE_OTG_FS_VBUS_ACTIVE!

后果就是当执行完毕
USBD_Initialize    (0);               /* USB Device 0 Initialization        */
USBD_Connect       (0);
代码后,USBDP信号还是没有拉高,这样主机就检测不到USB设备的插入。

对于这个问题,RTE配置为GPIO_OUT_OPENDRAIN模式可以理解,毕竟硬件设计不同(我也不了解硬件,大牛可以分析下)。但是对于使用RTE_OTG_FS_VBUS_ACTIVE做参数配置没有任何道理吧?
我认为应该是RTE_USB_DEVICE_CON_ACTIVE,RTE这个地方不知道是错误还是有别的含义,也希望大牛能分析下

  • 上一篇文章:

  • 下一篇文章: 没有了
  • 最新文章 热点文章 相关文章
    SharePoint 2013 Search REST AP
    SharePoint如何搜索指定的爬网内
    weblogic Servlet: "action" fai
    webdav 与exchange通信失败未找到
    SharePoint2013文档库可以直接存
    Unable to write data to the tr
    asp.net中listbox的items.count属
    C#不是每次查询数据是不是被缓存
    ASP.NET发布后能加载引用的js文件
    Hadoop2.2.0在eclipse控制台没有
    SharePoint 2013 Search REST AP
    SharePoint如何搜索指定的爬网内
    weblogic Servlet: "action" fai
    webdav 与exchange通信失败未找到
    SharePoint2013文档库可以直接存
    Unable to write data to the tr
    asp.net中listbox的items.count属
    C#不是每次查询数据是不是被缓存
    ASP.NET发布后能加载引用的js文件
    Hadoop2.2.0在eclipse控制台没有
    BKP_DR寄存器中的值RESET之后
    arm板自启动运行应用程序时为
    RX8025T日和秒都读成32
    tornado 2.2 PPC 加入-mlong
    8 error C2664: “sscanf”:
    如何在windows上检测耳机的热
    串口接收用DMA总线空闲是开始
    K9k8G08U0A 裸机驱动复位不正
    VS2013+WDK8.1如何配置
    W5300 UDP 接收不到数据
     



    设为首页 | 加入收藏 | 网站地图 | 友情链接 |