| 
 
| void main(void) {
 RCC_ClocksTypeDef    get_rcc_clock;   //结构体
 RCC_GetClocksFreq(&get_rcc_clock);    //获取时钟信息
 while(1)
 {}
 }
 
 
 
 
 STM32F407自带结构体
 stm32f4xx_rcc.h
 
 /* Exported types ------------------------------------------------------------*/
 typedef struct
 {
 uint32_t SYSCLK_Frequency; /*!<  SYSCLK clock frequency expressed in Hz */
 uint32_t HCLK_Frequency;   /*!<  HCLK clock frequency expressed in Hz   */
 uint32_t PCLK1_Frequency;  /*!<  PCLK1 clock frequency expressed in Hz  */
 uint32_t PCLK2_Frequency;  /*!<  PCLK2 clock frequency expressed in Hz  */
 }RCC_ClocksTypeDef;
 
 
 
 
 
 stm32f4xx_rcc.c
 
 /**
 * @brief  Returns the frequencies of different on chip clocks; SYSCLK, HCLK,
 *         PCLK1 and PCLK2.
 *
 * @NOTE   The system frequency computed by this function is not the real
 *         frequency in the chip. It is calculated based on the predefined
 *         constant and the selected clock source:
 * @note     If SYSCLK source is HSI, function returns values based on HSI_VALUE(*)
 * @note     If SYSCLK source is HSE, function returns values based on HSE_VALUE(**)
 * @note     If SYSCLK source is PLL, function returns values based on HSE_VALUE(**)
 *           or HSI_VALUE(*) multiplied/divided by the PLL factors.
 * @note     (*) HSI_VALUE is a constant defined in stm32f4xx.h file (default value
 *               16 MHz) but the real value may vary depending on the variations
 *               in voltage and temperature.
 * @note     (**) HSE_VALUE is a constant defined in stm32f4xx.h file (default value
 *                25 MHz), user has to ensure that HSE_VALUE is same as the real
 *                frequency of the crystal used. Otherwise, this function may
 *                have wrong result.
 *
 * @note   The result of this function could be not correct when using fractional
 *         value for HSE crystal.
 *
 * @param  RCC_Clocks: pointer to a RCC_ClocksTypeDef structure which will hold
 *          the clocks frequencies.
 *
 * @note   This function can be used by the user application to compute the
 *         baudrate for the communication peripherals or configure other parameters.
 * @note   Each time SYSCLK, HCLK, PCLK1 and/or PCLK2 clock changes, this function
 *         must be called to update the structure's field. Otherwise, any
 *         configuration based on this function will be incorrect.
 *
 * @retval None
 */
 void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
 {
 uint32_t tmp = 0, presc = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
 
 /* Get SYSCLK source -------------------------------------------------------*/
 tmp = RCC->CFGR & RCC_CFGR_SWS;
 
 switch (tmp)
 {
 case 0x00:  /* HSI used as system clock source */
 RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
 break;
 case 0x04:  /* HSE used as system clock  source */
 RCC_Clocks->SYSCLK_Frequency = HSE_VALUE;
 break;
 case 0x08:  /* PLL used as system clock  source */
 
 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
 SYSCLK = PLL_VCO / PLLP
 */
 pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
 pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
 
 if (pllsource != 0)
 {
 /* HSE used as PLL clock source */
 pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
 }
 else
 {
 /* HSI used as PLL clock source */
 pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
 }
 
 pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
 RCC_Clocks->SYSCLK_Frequency = pllvco/pllp;
 break;
 default:
 RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
 break;
 }
 /* Compute HCLK, PCLK1 and PCLK2 clocks frequencies ------------------------*/
 
 /* Get HCLK prescaler */
 tmp = RCC->CFGR & RCC_CFGR_HPRE;
 tmp = tmp >> 4;
 presc = APBAHBPrescTable[tmp];
 /* HCLK clock frequency */
 RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;
 
 /* Get PCLK1 prescaler */
 tmp = RCC->CFGR & RCC_CFGR_PPRE1;
 tmp = tmp >> 10;
 presc = APBAHBPrescTable[tmp];
 /* PCLK1 clock frequency */
 RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
 
 /* Get PCLK2 prescaler */
 tmp = RCC->CFGR & RCC_CFGR_PPRE2;
 tmp = tmp >> 13;
 presc = APBAHBPrescTable[tmp];
 /* PCLK2 clock frequency */
 RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
 }
 
 
 
 | 
 |