//学习STM32F4的过程中关于时钟上面讲的比较好 特地转发与大家分享

STM32F4时钟设置分析

原文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

环境:

主机:WIN7

开发环境:MDK4.72

MCU:STM32F407VGT6

STM32F4启动与STM32F10X不同,时钟已经默认配置好.

1.启动代码:

文件:startup_stm32f4xx.s

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">; Reset handler
  2. Reset_Handler    PROC
  3. EXPORT  Reset_Handler             [WEAK]
  4. IMPORT  SystemInit
  5. IMPORT  __main
  6. LDR     R0, =SystemInit
  7. BLX     R0
  8. LDR     R0, =__main
  9. BX      R0
  10. ENDP</span>

可以看出,在进入main函数之前,系统调用了SystemInit函数.

2.SystemInit函数分析

SystemInit函数位于system_stm32f4xx.c文件中.此文件提供几个宏定义可以设置各个时钟:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">/************************* PLL Parameters *************************************/
  2. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
  3. #define PLL_M      25
  4. #define PLL_N      336
  5. /* SYSCLK = PLL_VCO / PLL_P */
  6. #define PLL_P      2
  7. /* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
  8. #define PLL_Q      7
  9. /******************************************************************************/</span>

而晶振频率则是在文件stm32f4xx.h中进行设置:

外部晶振:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">#if !defined  (HSE_VALUE)
  2. #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
  3. #endif /* HSE_VALUE */</span>

内部晶振:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">#if !defined  (HSI_VALUE)
  2. #define HSI_VALUE    ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
  3. #endif /* HSI_VALUE */ </span>

综上,可以得出默认配置中:

锁相环压腔振荡器时钟PLL_VCO = 25 / 25 * 336 = 336MHz

系统时钟SYSCLK = 336 / 2 = 168MHz

USB,SD卡时钟 = 336 / 7 = 48MHz

时钟图:

SystemInit函数代码:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">/**
  2. * @brief  Setup the microcontroller system
  3. *         Initialize the Embedded Flash Interface, the PLL and update the
  4. *         SystemFrequency variable.
  5. * @param  None
  6. * @retval None
  7. */
  8. void SystemInit(void)
  9. {
  10. /* FPU settings ------------------------------------------------------------*/
  11. #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
  12. SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  13. #endif
  14. /* Reset the RCC clock configuration to the default reset state ------------*/
  15. /* Set HSION bit */
  16. RCC->CR |= (uint32_t)0x00000001;
  17. /* Reset CFGR register */
  18. RCC->CFGR = 0x00000000;
  19. /* Reset HSEON, CSSON and PLLON bits */
  20. RCC->CR &= (uint32_t)0xFEF6FFFF;
  21. /* Reset PLLCFGR register */
  22. RCC->PLLCFGR = 0x24003010;
  23. /* Reset HSEBYP bit */
  24. RCC->CR &= (uint32_t)0xFFFBFFFF;
  25. /* Disable all interrupts */
  26. RCC->CIR = 0x00000000;
  27. #ifdef DATA_IN_ExtSRAM
  28. SystemInit_ExtMemCtl();
  29. #endif /* DATA_IN_ExtSRAM */
  30. /* Configure the System clock source, PLL Multiplier and Divider factors,
  31. AHB/APBx prescalers and Flash settings ----------------------------------*/
  32. SetSysClock();
  33. /* Configure the Vector Table location add offset address ------------------*/
  34. #ifdef VECT_TAB_SRAM
  35. SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
  36. #else
  37. SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
  38. #endif
  39. }</span>

3.SetSysClock函数分析
在SetSysClock函数中,配置了系统时钟,PLL倍频以及分频系数:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">/**
  2. * @brief  Configures the System clock source, PLL Multiplier and Divider factors,
  3. *         AHB/APBx prescalers and Flash settings
  4. * @Note   This function should be called only once the RCC clock configuration
  5. *         is reset to the default reset state (done in SystemInit() function).
  6. * @param  None
  7. * @retval None
  8. */
  9. static void SetSysClock(void)
  10. {
  11. /******************************************************************************/
  12. /*            PLL (clocked by HSE) used as System clock source                */
  13. /******************************************************************************/
  14. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  15. /* Enable HSE */
  16. RCC->CR |= ((uint32_t)RCC_CR_HSEON);
  17. /* Wait till HSE is ready and if Time out is reached exit */
  18. do
  19. {
  20. HSEStatus = RCC->CR & RCC_CR_HSERDY;
  21. StartUpCounter++;
  22. } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  23. if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  24. {
  25. HSEStatus = (uint32_t)0x01;
  26. }
  27. else
  28. {
  29. HSEStatus = (uint32_t)0x00;
  30. }
  31. if (HSEStatus == (uint32_t)0x01)
  32. {
  33. /* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */
  34. RCC->APB1ENR |= RCC_APB1ENR_PWREN;
  35. PWR->CR |= PWR_CR_VOS;
  36. /* HCLK = SYSCLK / 1*/
  37. RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
  38. /* PCLK2 = HCLK / 2*/
  39. RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
  40. /* PCLK1 = HCLK / 4*/
  41. RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
  42. /* Configure the main PLL */
  43. RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
  44. (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
  45. /* Enable the main PLL */
  46. RCC->CR |= RCC_CR_PLLON;
  47. /* Wait till the main PLL is ready */
  48. while((RCC->CR & RCC_CR_PLLRDY) == 0)
  49. {
  50. }
  51. /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
  52. FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
  53. /* Select the main PLL as system clock source */
  54. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
  55. RCC->CFGR |= RCC_CFGR_SW_PLL;
  56. /* Wait till the main PLL is used as system clock source */
  57. while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
  58. {
  59. }
  60. }
  61. else
  62. { /* If HSE fails to start-up, the application will have wrong clock
  63. configuration. User can add here some code to deal with this error */
  64. }
  65. }</span>

如果外部时钟启动失败,系统会使用内部时钟

默认配置:

HCLK = SYSCLK / 1 = 168MHz

PCLK2 = HCLK / 2 = 84MHz

PCLK1 = HCLK / 4 = 42MHz

STM32F4时钟配置分析的更多相关文章

  1. STM32F4时钟配置库函数详解

    在STM32中,所有的应用都是基于时钟,所以时钟的配置就尤为重要了,而不能仅仅只知道使用默认时钟. STM32F4的时钟树如上图所示,HSE为外部接入的一个8M的时钟,然后再给PLL提供输入时钟,经过 ...

  2. STM32F4系统时钟配置及描述

    STM32F4系统时钟配置及描述 stm32f407时钟配置方法(感觉很好,分享一下) STM32F4_RCC系统时钟配置及描述 STM32F4时钟设置分析 stm32f4 - 时钟树分析配置

  3. STM32F072从零配置工程-自定义时钟配置详解

    从自己的板子STM32F407入手,参考官方的SystemInit()函数: 核心在SetSysClock()这个函数,官方默认是采用HSE(设定为8MHz)作为PLL锁相环的输入输出168MHz的S ...

  4. STM32F4_RCC系统时钟配置及描述

    Ⅰ.概述 对于系统时钟应该都知道它的作用,就是驱动整个芯片工作的心脏,如果没有了它,就等于人没有了心跳. 对于使用开发板学习的朋友来说,RCC系统时钟这一块知识估计没怎么去配置过,原因在于开发板提供的 ...

  5. STM32的时钟配置随笔

    以前使用STM32都是使用库函数开发,最近心血来潮想要使用寄存器来试试手感,于是乎便在工作之余研究了一下STM32F4的时钟配置,在此将经历过程写下来作为锻炼,同时也供和我一样的新手参考,如有错误或者 ...

  6. STM32_3 时钟初始化分析

    在startup文件中,调用了2个函数,一个是System_Init, 另一个是main. System_Init()在system_stm32f10x.c 这个文件中,先看一下时钟树,再分析一下这个 ...

  7. 痞子衡嵌入式:系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题. 我们知道,i.MXRT1xxx家族早期型号(RT1050/ ...

  8. STM32F0xx_RTC实时时钟配置详细过程

    Ⅰ.概述 今天总结RTC(Real Time Clock)实时时钟相关的知识,顺带将BKP简单总结一下. STM32的RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待 ...

  9. 四轴飞行器1.2.3 STM32F407时钟配置和升级标准库文件

    原创文章,欢迎转载,转载请注明出处 这个星期进度比较慢哈,只有周末和晚上下班回来才能做,事件不连续,琐碎的事情又比较多,挺烦的,有多琐碎呢?           1.本人有点小强迫症哈,虽然RTT将文 ...

随机推荐

  1. .NET Core installation guide

      .NET Core installation guide 1.Download Visual Studio 2015 Make sure you have Visual Studio 2015 U ...

  2. Cannot create PoolableConnectionFactory (ORA-28040: No matching authentication protocol

    Oracle 12c 如果java报这个错误,用oracle自带的ojdbc6.jar,可以解决这个问题.

  3. TSP问题(旅行商问题)[分支限界法]

    问题: 旅行商从 a 开始周游下图所有的城市一次,然后回到 a,城市之间的旅行代价在图中标明. 请选择一个最优的行走顺序使得周游所有城市的代价最小. 思路: 随便怎么周游,对于一个城市来说,一定有一条 ...

  4. 国民身份证号码校验之“C#/Winform方法实现+案例分析”

    根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出 ...

  5. PHP格式化字符串函数 sprintf()

    定义和用法 sprintf() 函数把格式化的字符串写入一个变量中. 语法 sprintf(format,arg1,arg2,arg++) 参数 描述 format 必需.转换格式. arg1 必需. ...

  6. 利用Navicat实现MySQL数据库结构对比和同步

    在生产环境中,我们总会因为这样或那样的原因导致主从不同步,亦或者是测试环境要和生产环境进行同步,利用Navicat结构同步工具,不但能找出库结构差异,还可以针对create.modify.drop等进 ...

  7. 天兔(Lepus)监控系统快速安装部署

    Lepus安装需要Lamp环境,Lamp环境的安装个人认为比较费劲,XAMPP的一键部署LAMP环境省心省力, lepus官网手册也建议采用XAMPP的方式安装,lepus也是在XAMPP上进行研发的 ...

  8. RMAN中FILESPERSET设置对备份速度的影响

    看到网上部分人说不指定FILESPERSET(默认值=64)则会导致分配的通道只走第一个而导致备份效率低下,今天仔细研究了一下,参照了多个博主文章,得出结论如下: 如果没有指定filesperset, ...

  9. C++设计模式——抽象工厂模式

    问题描述 之前讲到了C++设计模式——工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Produ ...

  10. sqlserver查询数据库中有多少个表

    sql server 数表: select count(1) from sysobjects where xtype='U' 数视图: select count(1) from sysobjects ...