LSI RC担当一个低功耗时钟源的角色,它可以在停机和待机模式下保存运行。为独立看门狗和自动唤醒单元提供时钟。LSI时钟频率大约40KHZ。
配置时钟流程:
1.将RCC寄存器重新设置为默认值 RCC_DeInit
2.打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);
3.等待外部高速时钟晶振工作 HSEStartUpStatus =RCC_WaitForHSEStartUp();
4.设置AHB时钟 RCC_HCLKConfig;
5.设置高速APB2时钟 RCC_PCLK2Config;
6.设置低速速APB1时钟 RCC_PCLK1Config
7.设置PLL RCC_PLLConfig
8.打开PLL RCC_PLLCmd(ENABLE);
9.等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
10.设置系统时钟 RCC_SYSCLKConfig
11.判断是否PLL是系统时钟 while(RCC_GetSYSCLKSource() != 0x08)
12.打开要使用的外设时钟 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()
//******************************************************************************* * Function Name : RCC_Configuration * Description : Configures the different system clocks. * Input : None * Output : None * Return : None //******************************************************************************* ErrorStatus HSEStartUpStatus; void RCC_Configuration(void) { RCC_DeInit(); //RCC system reset RCC_HSEConfig(RCC_HSE_ON); // Enable HSE HSEStartUpStatus = RCC_WaitForHSEStartUp(); // Wait till HSE is ready if(HSEStartUpStatus == SUCCESS) { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // Enable Prefetch Buffer FLASH_SetLatency(FLASH_Latency_2); // Flash 2 wait state RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLK RCC_PCLK1Config(RCC_HCLK_Div1); // PCLK1 = HCLK #ifdef HSE_Value_8M RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9); // PLLCLK = 8MHz/2 * 9 = 36 MHz #elif defined HSE_Value_12M RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_6); // PLLCLK = 12MHz/2 * 6 = 36 MHz #endif RCC_PLLCmd(ENABLE); // Enable PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) // Wait till PLL is ready {} RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Select PLL as system clock source while(RCC_GetSYSCLKSource() != 0x08) // Wait till PLL is used as system clock source {} } /* Enable PWR and BKP clocks RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Enable DMA clock RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* Enable AFIO clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); /*GPIOA Periph clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); /* GPIOB Periph clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /* GPIOC Periph clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); /* GPI0D Periph clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); /* GPI0E Periph clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); /* Enable TIM1 clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); /* EnableTIM2 TIM3 TIM4 clocks RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE); /*Enable USART1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); /* Enable USART2 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); /*Enable USART3 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); /*Enable I2C1 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); /*Enable ADC1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); /*Enable ADC2 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE); /* DAC Periph clock enable RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); }