2019-12-30 19:28发布
tuy0326 发表于 2015-5-28 03:19 我不相信你用HSI跑起来USB 请看RM0008 P56的时钟树,请问你是怎么配置使用HSI能分成48M的?????
2.jpg (115.12 KB, 下载次数: 0)
下载附件
2015-5-28 08:18 上传
最多设置5个标签!
我把2年前做的样板抓图出来,注意上面是有USB插座的,只有一个32.768K的晶振,并没有外部8M晶振,芯片是STM32F103RBT6
你应该相信,我没有必要为了回你这个帖子专门画个作假的PCB,或者写个没有验证过的代码,因为划不来。
后来正式产品我加上了外部晶振,因为几毛钱的事情不能省,毕竟安全第一。
以下PCB是以前做样板验证用的,代码也是当时测试通过对,里面一些注释不一定对,因为2年前测试用的没那么规范。
2.jpg (115.12 KB, 下载次数: 0)
下载附件
2015-5-28 08:18 上传
通过宏来决定用HSI还是HSE
- /*******************************************************************************
- * Function Name : RCC_Configuration
- * Description : 配置不同的系统时钟
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- void RCC_Configuration(void)
- {
- /* RCC system reset(for debug purpose) */
- RCC_DeInit();
- #ifdef HSIENABLE //当使用HSI高速内部时钟作为系统时钟时
- RCC_HSICmd(ENABLE); //打开内部高速时钟
- //等待HSI准备好
- while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预取指功能
- //FLASH时序控制
- //推荐值:SYSCLK = 0~24MHz Latency=0
- // SYSCLK = 24~48MHz Latency=1
- // SYSCLK = 48~72MHz Latency=2
- FLASH_SetLatency(FLASH_Latency_2);
- RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置HCLK(AHB时钟)=SYSCLK
- RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2(APB2) = HCLK
- RCC_PCLK1Config(RCC_HCLK_Div1); //PCLK1(APB1) = HCLK
- //PLL设置 SYSCLK/2 * 12 = 4*12 = 48MHz
- RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);
- //启动PLL
- RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,不能被DISABLE
- //等待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);
- #else
- /* Enable HSE */
- RCC_HSEConfig(RCC_HSE_ON);
- /* Wait till HSE is ready */
- HSEStartUpStatus = RCC_WaitForHSEStartUp();
- if(HSEStartUpStatus == SUCCESS)
- {
- /* HCLK = SYSCLK */
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
- /* PCLK2 = HCLK */
- RCC_PCLK2Config(RCC_HCLK_Div1);
- /* PCLK1 = HCLK/2 */
- RCC_PCLK1Config(RCC_HCLK_Div2);
- /* Flash 2 wait state */
- FLASH_SetLatency(FLASH_Latency_2);
- /* Enable Prefetch Buffer */
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
- /* PLLCLK = 8MHz * 6 = 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);
- }
- #endif
- /* Enable DMA1 clock */
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
- /* Enable ADC1E clock */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
- /* TIM4 clock source enable */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
- /* Enable GPIOA, GPIOB, GPIOC, GPIOD and AFIO clocks */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
- }
复制代码- /*******************************************************************************
- * Function Name : Set_USBClock
- * Description : Configures USB Clock input (48MHz)
- * Input : None.
- * Return : None.
- *******************************************************************************/
- void Set_USBClock(void)
- {
- /* USBCLK = PLLCLK */
- RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div1);
- /* Enable USB clock */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);
- }
复制代码一周热门 更多>