使用的是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中断函数里也没有打印输出,说明没进中断?
请问各位大侠,这是哪里问题呀?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我的板子,必须在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函数的。不懂问题出在哪里。
一周热门 更多>