我找到一个STM32 USB自定义设备的例子,可以正常连接。
但是发送数据老是失败。
我发现一个问题,原来程序是使用的内部时钟,烧进程序可以发现设备。
我改为外部时钟,就识别不了。
以下是时钟程序:
/*
ʹÓÃÄÚ²¿Ê±ÖÓ
*/
void RCC_HSI_Configuration(void)
{
//½«ÍâÉè RCC¼Ä´æÆ÷ÖØÉèΪȱʡֵ
RCC_DeInit();
RCC_HSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
{
}
if(1)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
//ÉèÖà PLL ʱÖÓÔ´¼°±¶ÆµÏµÊý
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);
//ʹÄÜ»òÕßʧÄÜ PLL,Õâ¸ö²ÎÊý¿ÉÒÔÈ¡£ºENABLE»òÕßDISABLE
RCC_PLLCmd(ENABLE);//Èç¹ûPLL±»ÓÃÓÚϵͳʱÖÓ,ÄÇôËü²»Äܱ»Ê§ÄÜ
//µÈ´ýÖ¸¶¨µÄ RCC ±ê־λÉèÖóɹ¦ µÈ´ýPLL³õʼ»¯³É¹¦
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
//ÉèÖÃϵͳʱÖÓ£¨SYSCLK£© ÉèÖÃPLLΪϵͳʱÖÓÔ´
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//µÈ´ýPLL³É¹¦ÓÃ×÷ÓÚϵͳʱÖÓµÄʱÖÓÔ´
// 0x00£ºHSI ×÷ΪϵͳʱÖÓ
// 0x04£ºHSE×÷ΪϵͳʱÖÓ
// 0x08£ºPLL×÷ΪϵͳʱÖÓ
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
}
void RCC_Configuration(void)
{
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
ErrorStatus HSEStartUpStatus;
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2); // 36MZH
/* On STICE the PLL output clock is fixed to 48 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP |
RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIO_DISCONNECT |
RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOB, ENABLE);
}
大神看看哪里有问题?谢谢!
|