OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5554|回复: 3

STM32F105 USB host,无法进入中断

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-5-30
在线时间
1 小时
发表于 2015-6-1 18:19:41 | 显示全部楼层 |阅读模式
5金钱
使用的是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中断函数里也没有打印输出,说明没进中断?

请问各位大侠,这是哪里问题呀?  

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-6-1 22:08:19 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-5-30
在线时间
1 小时
 楼主| 发表于 2015-6-2 18:50:25 | 显示全部楼层
呵呵 谢谢原子哥,这个可能是我屏蔽了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函数的。不懂问题出在哪里。
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-4-19
在线时间
3 小时
发表于 2018-4-20 12:03:58 | 显示全部楼层
我的F439 也是进不了中断,用的F767的程序移植过来的.对了 F7的环境是MDK、F4的环境是IAR   不知道为什么  
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 02:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表