STM32F105 USB host,无法进入中断

2019-07-24 13:05发布

使用的是stm32的库V2.1.0版本,移植过来,外部使用的是8M晶振, 根据官方的USB host   MSC实例工程修改如下:
#define HSE_VALUE    ((uint32_t)8000000) ;
另外,根据网友的说法,USB的时钟改为48M,如下:   /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
     
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
   
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;     /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PLL2 configuration: PLL2CLK = (HSE / 2) * 10 = 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_DIV5 | RCC_CFGR2_PLL2MUL8 |
    //                         RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV2 | RCC_CFGR2_PLL2MUL10 |
                           RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
 
    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;
    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }
    
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
                            RCC_CFGR_PLLMULL9);
    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;     /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
   
    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;        /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
    {
    }
 
在OTG_FS_IRQHandler终端函数里增加了printf打印输出。 时钟获取到的如下:HCLK_Frequency:72000000,PCLK1_Frequency:36000000,PCLK2_Frequency:72000000,ADCCLK_Frequency:36000000
硬件上连接就只连接了D+  D-, 电源固定接5V,这么接有问题吗?
1、USB不进中断;
2、已开启串口3的输入中断,在为插USB时,串口3可以中断输入,插入USB后,串口3无法中断输入了,USB中断函数里也没有打印输出,说明没进中断?

请问各位大侠,这是哪里问题呀?  
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
cojone
2019-07-24 14:50
呵呵 谢谢原子哥,这个可能是我屏蔽了USB中断函数里面的函数导致的, 因后面修改了时钟的问题后,没有恢复屏蔽的中断。现在USB可以正常使用了。但是这有另外一个奇葩的问题:

我的板子,必须在main函数里,开始时再次调用SystemInit函数(该函数已在启动文件中调用)进行再次初始化系统时钟,否则的话,会死在usb内核初始化的地方:USB_OTG_CoreReset这个函数里面的:
  greset.b.csftrst = 1;
  USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRSTCTL, greset.d32 );
  do
  {
    greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL);
//    if (++count > 200000)
//    {
//      break;
//    }
  }
  while (greset.b.csftrst == 1);
因为屏蔽了超时,就死在这个循环里了。
如果恢复了这个超时跳出,看似USB初始化是通过了,但是插入USB,无法进入中断,USB无法使用。
而若在main函数里,有再次调用SystemInit函数,则USB可以中断,USB也正常读写使用。

这个是什么问题呢?硬件问题?外部晶振是8M的。
因为这个软件在其他的开发板子上可以正常使用的。ST的官方例程也是没有再次调用SystemInit函数的。不懂问题出在哪里。

一周热门 更多>