在前面推文的介绍中,我们知道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

STM32入门-STM32时钟系统,时钟初始化配置函数的更多相关文章

  1. CentOS7 系统服务器初始化配置、安全加固、内核升级优化常用软件安装的Shell脚本分享

    转载自:https://www.bilibili.com/read/cv13875630?spm_id_from=333.999.0.0 描述: 适用于企业内部 CentOS7 系列操作服务器初始化. ...

  2. STM32入门系列-STM32时钟系统,时钟初始化配置函数

    在前面推文的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,然后进入主函数main.那么我们就来看下SystemInit()函数到底做了哪些操作,首先打开我们前面使 ...

  3. STM32学习笔记:系统时钟和SysTick定时器

    原文:http://blog.sina.com.cn/s/blog_49cb42490100s60d.html 1.     STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI.HS ...

  4. stm32之Systick(系统时钟)

    Systick的两大作用: 1.可以产生精确延时: 2.可以提供给操作系统一个单独的心跳(时钟)节拍: 通常实现Delay(N)函数的方法为: for(i=0;i<x;i++) ; 对于STM3 ...

  5. STM32(4)——系统时钟和SysTick

    1.STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI.HSE.LSI.LSE.PLL HSI是高速内部时钟,RC振荡器,频率为8MHz: HSE是高速外部时钟,可接石英/陶瓷谐振器 ...

  6. Ubuntu 系统服务器初始化配置、安全加固、内核优化和常用软件安装的Shell脚本分享

    转载自:https://www.bilibili.com/read/cv13875402?spm_id_from=333.999.0.0 描述: 适用于企业内部 Ubuntu 操作服务器初始化.系统安 ...

  7. Linux 系统的初始化配置

      1.零时配置网卡IP地址 2.配置永久生效IP地址   需要进如 cd /etc/sysconfig/network-scripts  找到网卡文件编辑 3.零时主机名的更改. 4.永久主机名的更 ...

  8. STM32入门系列-STM32时钟系统,时钟使能配置函数

    之前的推文中说到,当使用一个外设时,必须先使能它的时钟.怎么通过库函数使能时钟呢?如需了解寄存器配置时钟,可以参考<STM32F10x中文参考手册>"复位和时钟控制(RCC)&q ...

  9. STM32时钟系统

    一.在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. ①HSI是高速内部时钟,RC振荡器,频率为8MHz. ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率 ...

随机推荐

  1. WinUI 3学习笔记(3)—— ComboBox & DropDownButton & SplitButton

    本篇想介绍相对小众但颇具使用价值的控件SplitButton,提到SplitButton难免会拿来与ComboBox进行比较,同时在WinUI 3的控件库中,还有一个默默无闻的DropDownButt ...

  2. io流-文件流\节点流

    FileOutputStream类(jdk1.0) 描述 java.io.FileOutputStream 类是文件字节输出流,用于将数据写入到文件中. 构造方法 //构造方法 FileOutputS ...

  3. Wpf UserControl使用 KeyBinding,失效问题

    我的问题根源是UserControl未获取相应焦点,在UserControl后台添加如下 public AccountDetailView()         {             Initia ...

  4. .Net core 的热插拔机制的深入探索,以及卸载问题求救指南.

    .Net core 的热插拔机制的深入探索,以及卸载问题求救指南. 一.依赖文件*.deps.json的读取. 依赖文件内容如下.一般位于编译生成目录中 { "runtimeTarget&q ...

  5. http升级https遇到的问题

    1. 功能请求失效: 可能是链接为http请求,导致出现问题 2.浏览器网址左边出现黄色感叹号: 这是由于网页中存在http的图片链接,需要根据实际情况修改; 3.将网页内的http请求变为https ...

  6. Docker系列(19)- 数据卷之Dockerfile

    初识Dockerfile Dockerfile就是用来构建docker镜像的构建文件!命令脚本! 通过这个脚本生成镜像,镜像是一层一层的,脚本与一个个的命令,每个命令都是一层! # 创建一个docke ...

  7. Jmeter监控技术实战

    性能测试中监控的意义 为性能分析提供依据 监控方案 serverAgent jmeter的插件,监控颗粒度不高,界面简陋 服务器中启动 jmeter中添加插件 Nmon Grafana 优秀监控方案所 ...

  8. Appium driver常用API

    click driver.find_element implicitly_wait send_keys close quit get_window_size switch_to execute bac ...

  9. three.js 纹理动画实现

    需求: 1.使用一张长图.分别播放这张长图的不同位置 来达到动态内容的目的 解决方案: 1.纹理创建并指定重复方向:this.texture.wrapS = this.texture.wrapT = ...

  10. 鸿蒙内核源码分析(调度机制篇) | 任务是如何被调度执行的 | 百篇博客分析OpenHarmony源码 | v7.07

    百篇博客系列篇.本篇为: v07.xx 鸿蒙内核源码分析(调度机制篇) | 任务是如何被调度执行的 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调 ...