美文网首页
时钟初始化配置函数

时钟初始化配置函数

作者: 呼啦啦的爱 | 来源:发表于2020-06-24 09:24 被阅读0次

     在前面推文的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,然后进入主函数main。那么我们就来看下SystemInit()函数到底做了哪些操作,首先打开我们前面使用库函数编写的LED程序,在system_stm32f10x.c文件中可以找到SystemInit()函数,SystemInit()代码如下:

      void SystemInit (void)

      {

      /* Reset the RCC clock configuration to the default reset state(for debug purpose) /

      / Set HSION bit /

      RCC->CR |= (uint32_t)0x00000001;

      / Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits /

      #IFndef STM32F10X_CL

      RCC->CFGR &= (uint32_t)0xF8FF0000;

      #else

      RCC->CFGR &= (uint32_t)0xF0FF0000;

      #endif / STM32F10X_CL /

      / Reset HSEON, CSSON and PLLON bits /

      RCC->CR &= (uint32_t)0xFEF6FFFF;

      / Reset HSEBYP bit /

      RCC->CR &= (uint32_t)0xFFFBFFFF;

      / Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits /

      RCC->CFGR &= (uint32_t)0xFF80FFFF;

      #ifdef STM32F10X_CL

      / Reset PLL2ON and PLL3ON bits */

      RCC->CR &= (uint32_t)0xEBFFFFFF;

      /* Disable all interrupts and clear pending bits /

      RCC->CIR = 0x00FF0000;

      / Reset CFGR2 register /

      RCC->CFGR2 = 0x00000000;

      #elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined

      STM32F10X_HD_VL)

      / Disable all interrupts and clear pending bits /

      RCC->CIR = 0x009F0000;

      / Reset CFGR2 register /

      RCC->CFGR2 = 0x00000000;

      #else

      / Disable all interrupts and clear pending bits /

      RCC->CIR = 0x009F0000;

      #endif / STM32F10X_CL /

      #if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined

      STM32F10X_HD_VL)

      #ifdef DATA_IN_ExtSRAM

      SystemInit_ExtMemCtl();

      #endif / DATA_IN_ExtSRAM /

      #endif

      / Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers /

      / Configure the Flash Latency cycles and enable prefetch buffer /

      SetSysClock();

      #ifdef VECT_TAB_SRAM

      SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; / Vector Table Relocation in Internal SRAM. /

      #else

      SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; / Vector Table Relocation in

      Internal FLASH. */

      #endif

      }

      SystemInit函数开始通过条件编译, 先复位RCC寄存器,同时通过设置CR寄存器的HSI时钟使能位来打开HSI时钟。默认情况下如果CR寄存器复位,是选择HSI作为系统时钟,这点大家可以查看RCC->CR寄存器相关位描述可以得知,当低两位配置为00的时候(复位之后),会选择HSI振荡器为系统时钟。也就是说,调用SystemInit函数之后,首先是选择HSI作为系统时钟。在设置完相关寄存器后才换成HSE作为系统时钟,接下来SystemInit函数内部会调用SetSysClock()函数。这个函数内部是根据宏定义设置系统时钟频率。函数如下:

      static void SetSysClock(void)

      {

      #ifdef SYSCLK_FREQ_HSE

      SetSysClockToHSE();

      #elif defined SYSCLK_FREQ_24MHz

      SetSysClockTo24();

      #elif defined SYSCLK_FREQ_36MHz

      SetSysClockTo36();

      #elif defined SYSCLK_FREQ_48MHz

      SetSysClockTo48();

      #elif defined SYSCLK_FREQ_56MHz

      SetSysClockTo56();

      #elif defined SYSCLK_FREQ_72MHz

      SetSysClockTo72();

      #endif

      }

      在system_stm32f10x.c文件的开头就有对此宏定义,系统默认的宏定义是72MHz,如下:

      #define SYSCLK_FREQ_72MHz 72000000

      如果你要设置为36MHz,只需要注释掉上面代码,然后加入下面代码即可:

      #define SYSCLK_FREQ_36MHz 36000000

      根据该函数内部实现过程可知,直接调用SetSysClockTo72()函数,此函数功能是将系统时钟SYSCLK设置为72M,AHB总线时钟设置为72M,APB2总线时钟设置为72M,APB1总线时钟设置为36M,PLL时钟设置为72M。函数具体实现大家可以打开库函数查看,这里我们就不截取出来。如果SystemInit内实现过程看不懂没有关系,大家只要知道SystemInit函数执行完,时钟大小设置如下:

      SYSCLK(系统时钟) =72MHz

      AHB 总线时钟(HCLK=SYSCLK) =72MHz

      APB1 总线时钟(PCLK1=SYSCLK/2) =36MHz

      APB2 总线时钟(PCLK2=SYSCLK/1) =72MHz

      PLL 主时钟 =72MHz

      在STM32中,这些时钟值是要熟悉的。

    最后还是给大家提供一些stm32方面的资料以供后续的学习参考

    从0到1,设计自己的开发板

    http://www.makeru.com.cn/live/4034_2016.html?s=45051

    1小时彻底掌握STM32中断

    http://www.makeru.com.cn/live/3523_1666.html?s=45051

    (定时器)

    http://www.makeru.com.cn/live/1392_1199.html?s=45051

    STM32定时器深藏不露的绝技

    http://www.makeru.com.cn/live/3523_1495.html?s=45051

    stm32 如何用DMA搬运数据

    http://www.makeru.com.cn/live/detail/1484.html?s=45051

    相关文章

      网友评论

          本文标题:时钟初始化配置函数

          本文链接:https://www.haomeiwen.com/subject/jpglfktx.html