6395|2

4996

帖子

19

TA的资源

裸片初长成(初级)

楼主
 

stm32 USB-HID移植 [复制链接]

stm32芯片的设计确实很恶心简单举两个例子:

1. STM32F103芯片的USB和CAN中断和RAM共用,导致无法同时使用USB和CAN。

2.STM32F105芯片的USB的从机需要接VBUS脚,而103的不用接都可以;103的软连接的通过IO端口控制的,而105的却是内部上拉电阻。

这些问题导致了从STM32的103系列转到105时是不兼容的。USB部分代码还必须重新移植,这样的设计真的很恶心。

STM32不管是那个系列都为我们提供了例程,这一点来说大大减小了使用STM32的难道,下面我们简单的说说STM32的USB移植是需要注意的几点。

1. 首先应该注意更改外部晶振值,让实际与软件中的值相同:
      #define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */ (stm32f10x.h文件)

2. 设置内核时钟,我们一般都设置为72MHz:
    #define SYSCLK_FREQ_72MHz  72000000 (system_stm32f10x.c文件)
   
3. 设置USB时钟,这个固定在48MHz(usb_desc.c文件):
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
        
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV3 | RCC_CFGR2_PLL2MUL10 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);


4. 设置断点的收发尺寸(最大64字节):

    0x03,          /* bmAttributes: Interrupt endpoint */
    0x40,          /* wMaxPacketSize: 64 Bytes max */
    0x00,
    0x01,          /* bInterval: Polling Interval (10 ms) */
    /* 34 */
     
    0x07, /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */
   /* Endpoint descriptor type */
    0x01, /* bEndpointAddress: */
   /* Endpoint Address (OUT) */
    0x03, /* bmAttributes: Interrupt endpoint */
    0x40, /* wMaxPacketSize: 64 Bytes max  */
    0x00,
    0x01,

5. 必须同时修改以下几个地方的值与4设置相同():
  /* EP0 is already configured in DFU_Init() by USB_SIL_Init() function */
  
  /* Init EP1 IN as Interrupt endpoint */
  OTG_DEV_EP_Init(EP1_IN, OTG_DEV_EP_TYPE_INT, 64);
  
  /* Init EP1 OUT as Interrupt endpoint */
  OTG_DEV_EP_Init(EP1_OUT, OTG_DEV_EP_TYPE_INT, 64);

  SetBTABLE(BTABLE_ADDRESS);
  /* Initialize Endpoint 0 */
  SetEPType(ENDP0, EP_CONTROL);
  SetEPTxStatus(ENDP0, EP_TX_STALL);
  SetEPRxAddr(ENDP0, ENDP0_RXADDR);
  SetEPTxAddr(ENDP0, ENDP0_TXADDR);
  Clear_Status_Out(ENDP0);
  SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
  SetEPRxValid(ENDP0);
  /* Initialize Endpoint 1 */
  SetEPType(ENDP1, EP_INTERRUPT);
  SetEPRxAddr(ENDP1, ENDP1_RXADDR);
  SetEPRxCount(ENDP1, 64);
  SetEPRxStatus(ENDP1, EP_RX_VALID);
  
  SetEPType(ENDP1, EP_INTERRUPT);
  SetEPTxAddr(ENDP1, ENDP1_TXADDR);
  SetEPTxCount(ENDP1, 64);
  SetEPTxStatus(ENDP1, EP_TX_NAK);

6. 软连接设置(usb_pwr.h文件)
  #define USB_DCT_PIN    (GPIO_Pin_13)             // PC13
  #define USB_DCT_PORT   (GPIOC)                                                  // GPIOC
  #define USB_DCT_CLK    (RCC_APB2Periph_GPIOC)                           //

需要注意STM32F105/107是不需要设置这个管脚的,但是103必须设置。

7. 中断设置(stm32f10x_it.c文件)
void OTG_FS_IRQHandler(void)   // 105/107
{
  STM32_PCD_OTG_ISR_Handler();
}


void USB_LP_CAN1_RX0_IRQHandler(void) // 103
{
    USB_Istr();
}


需要特别注意的事103和105/107的程序是不同的,不能兼容,但105和107是兼容的。以上几个部分更改后基本上USB就可以正常工作了,您不防试试。
此帖出自stm32/stm8论坛

最新回复

试试试试试试  详情 回复 发表于 2015-2-6 13:52

赞赏

1

查看全部赞赏

点赞 关注(1)
个人签名我的博客
 

回复
举报

8

帖子

1

TA的资源

一粒金砂(初级)

沙发
 
学习
此帖出自stm32/stm8论坛
 
 

回复

32

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
试试试试试试
此帖出自stm32/stm8论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表