在前面推文的介绍中,我们知道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. Java-SpringBoot整合SpringCloud

    SpringBoot整合SpringCloud 1. SpringCloud特点 SpringCloud专注于为典型的用例和扩展机制提供良好的开箱即用体验,以涵盖其他情况: 分布式/版本化配置 服务注 ...

  2. clion结合vcpkg以及GTest的使用

    目录 一.vcpkg简介.下载和使用 1. vcpkg是什么 2. vcpkg下载 3. 使用vcpkg下载第三方库 二.clion结合vcpkg 1. 方法一:使用环境变量 2. 方法二:添加cma ...

  3. Expression 表达式动态生成

    http://blog.csdn.net/duan1311/article/details/51769119 以上是拼装和调用GroupBy的方法,是不是很简单,只要传入分组列与合计列就OK了! 下面 ...

  4. python IO流操作

    python IO流操作 学习完本篇,你将会独立完成 实现操作系统中文件及文件目录的拷贝功能. 将目标图片拷贝到指定的目录中 实现一个自动阅卷程序, Right.txt保存正确答案,xx(学生姓名). ...

  5. PHP的Sodium加密扩展函数了解

    这是本次加密扩展系列的最后一篇文章,也是我们要学习了解的最后一个 PHP 加密扩展.Sodium 出现的目的也是为了代替 Mcrypt 这个原来的加密扩展.在 PHP7.2 之后,Mcrypt 已经被 ...

  6. Zookeeper分布式安装部署

    1. 解压安装 1.1 解压Zookeeper安装包到/opt/module/目录下 tar -zxvf /opt/software/apache-zookeeper-3.6.2-bin.tar.gz ...

  7. dede5.7 标题长度限制修改

    我们经常碰到dede标题长度不够用的问题20个字的标题有时候是真的有点短了网上也有些修改长度问题的帖子,但我发现都不完整所以写下来供大家参考下.免得浪费时间 第一步: 修改下面4处文件: dede目录 ...

  8. 最新seo优化技巧

    国内的SEO也发展不少年份了.我是最早开始从事SEO的那一班人.看着这个行业从零开始发展,长大.成熟还谈不上.可以这样说吧,国内做这个行业的,高手并不多.实战的高手更是寥寥无几.当然这个是我个人的推断 ...

  9. php 实现字符串最大子串长度

    求字符串最大子串长度<?php class zif { public function sz($str) { $strsz = str_split($str); $zi = []; $len = ...

  10. delete,drop,truncate 区别

    今天看到一篇关于delete.drop.truncate区别的文章,认为写得非常好,转过来. 打比方很形象. delete,drop,truncate 都有删除表的作用,区别在于: 1.delete ...