上接:https://www.cnblogs.com/otaganyuki/p/10310979.html

前面一些宏定义略过,但有一个后面用到提下

这里定义了系统时钟频率为72mhz

从SystemInit开始讲,寄存器和时钟树参照stm32参考手册即可

void SystemInit (void)
{/* Reset the RCC clock configuration to the default reset state(for debug purpose) *//* Set HSION bit */RCC->CR |= (uint32_t)0x00000001;//打开内部8MHz振荡器/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits     SW 00:HSI设为系统时钟   ADCPRE 00:ADC的时钟预分频设置为2   PPRE2 000:APB2预分频器设置为1   PPRE1 000:APB1预分频设置为1   HPRE  000:AHB预分频设置为1   MCO    00:MCO时钟输出设为无  */
#ifndef STM32F10X_CL //CL就是类似HD的单片机型号选择RCC->CFGR &= (uint32_t)0xF8FF0000;
#elseRCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */   /* Reset HSEON, CSSON and PLLON bits     PLLON 0:关闭PLL   CSSON 0:Clock detector OFF    HSEON 0: HSE oscillator OFF   */RCC->CR &= (uint32_t)0xFEF6FFFF;/* Reset HSEBYP bit     0: external 4-16 MHz oscillator not bypassed 使用外部晶振*/RCC->CR &= (uint32_t)0xFFFBFFFF;/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits   PLLSRC 0: HSI oscillator clock / 2 selected as PLL input clock    PLLXTPRE 0: HSE clock not divided    PLLMUL 0000: PLL input clock x 2 */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_ExtSRAMSystemInit_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_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#elseSCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
}

SetSysClock函数 我这边时默认执行SetSysClockTo72子函数(之前开头宏定义过了),如下

static void SetSysClockTo72(void)
{__IO uint32_t StartUpCounter = 0, HSEStatus = 0;/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    /* Enable HSE */    RCC->CR |= ((uint32_t)RCC_CR_HSEON);/* Wait till HSE is ready and if Time out is reached exit    HSE_STARTUP_TIMEOUT就是之前在stm32f10x.h里提到的等待时钟稳定的时间   下面就是在等HSERDY被置高,若超过设定的TIMEOUT,则跳出  */do{HSEStatus = RCC->CR & RCC_CR_HSERDY;StartUpCounter++;  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));if ((RCC->CR & RCC_CR_HSERDY) != RESET){HSEStatus = (uint32_t)0x01;}else{HSEStatus = (uint32_t)0x00;}  if (HSEStatus == (uint32_t)0x01){/* Enable Prefetch Buffer    此寄存器在手册3.3节描述   */FLASH->ACR |= FLASH_ACR_PRFTBE;/* Flash 2 wait state      这个等待时间貌似改小也是有可能没问题的,因为芯片的实际质量一般高于手册的标准  */FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    /* HCLK = SYSCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;/* PCLK2 = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;/* PCLK1 = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;#ifdef STM32F10X_CL/* Configure PLLs ------------------------------------------------------*//* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz *//* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);/* Enable PLL2 */RCC->CR |= RCC_CR_PLL2ON;/* Wait till PLL2 is ready */while((RCC->CR & RCC_CR_PLL2RDY) == 0){}/* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9);
#else    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |RCC_CFGR_PLLMULL));RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#endif /* STM32F10X_CL *//* Enable PLL */RCC->CR |= RCC_CR_PLLON;/* Wait till PLL is ready */while((RCC->CR & RCC_CR_PLLRDY) == 0){}/* Select PLL as system clock source */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    /* Wait till PLL is used as system clock source */while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08){}}else{ /* If HSE fails to start-up, the application will have wrong clock configuration. User can add here some code to deal with this error */}
}

这样,这个文件剩下的只有SystemCoreClockUpdate没提了,其他函数基本类似或者没有用到,这个具体内容就不复制上来了,功能为:使SystemCoreClock变量保存当前的系统时钟频率,我稍微做了下测试,如果默认启动后调用此函数,SystemCoreClock自然就是72000000,如果把系统时钟切为HSI,即执行如下代码

   RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSI;      

再调用此函数,SystemCoreClock的值就是8000000,当然,单片机的执行速度也慢了许多。

转载于:https://www.cnblogs.com/otaganyuki/p/10323083.html

system_stm32f10x.c文件了解相关推荐

  1. STM32 system_stm32f10x.c文件分析

    startup_stm32f10x_md.s文件中,调用了一个叫SystemInit的函数,该函数其实在system_stm32f10x.c中定义,旨在初始化系统时钟.初始化外部SRAM.设置中断向量 ...

  2. STM32启动文件代码解析

    目录 启动流程 代码详解 启动文件使用的 ARM 汇编指令汇总 关于与启动文件有关的一些问题思考 下面是F1固件库V3.5.0的启动文件startup_stm32f10x_hd.s,以此为例做解析,其 ...

  3. STM32启动文件——startup_stm32f10x_hd.s

    STM32启动文件--startup_stm32f10x_hd.s 宗旨:技术的学习是有限的,分享的精神是无限的.   一.启动文件的作用  (关于启动代码的作用,前面已经提到过了,这里再啰嗦一下) ...

  4. STM32工程文件的建立以及Keil软件的基本设置和修改

    STM32工程文件的建立 1. 解压STM32官方库 2. 建立启动文件夹Libraries. 2.1 内核寄存器描述文件 2.2 外设寄存器描述文件.配置时钟文件 3. 建立输出文件夹Output. ...

  5. KEIL5创建新工程模板 以及文件简介概述

    STM32中文参考手册 第三章 MDK5软件入门 1.介绍MDK5软件的使用 2.ST官方固件库介绍 3.介绍怎样建立一个基于STM32官方固件库的工程模板 固件库就是函数的集合,固件库的作用就是向下 ...

  6. IAR分析内存重要的神器 - map文件全解析

    " 对于使用RTOS进行项目开发的朋友可能会有这样的疑惑,我创建的任务到底需要多大的堆栈空间才够呢? 其实,除了使用RTOS开发,就是使用裸机进行开发的朋友同样也会遇到类似的问题,有些地方需 ...

  7. IAR中map文件全解析

    推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang 推荐在我的公 ...

  8. 一份标准的STM32工程模板都需要哪些文件?(B站江科大自化协)

    大家好,我是烟火.目前BMS软件工程师在职,利用自由时间,输出一些基础知识合集,一方面巩固,另一方面写博客作为成长记录. 人间清醒: 明明有能力可以变成更优秀的人 遇见更好的人 过更喜欢的生活 如果因 ...

  9. 学习笔记7-STM32官方库.c/.h文件功能(汇总)

    主要针对一些使用较多.但本人并不十分清楚其作用的stm32官方.c/.h文件进行系统的梳理.贴上官网标准库下载地址(操作如下图),或是直接下载这个附件. 目录 简介 工程目录 1.misc.c/h 2 ...

最新文章

  1. 左手程序员,右手作家:你必须会的Jupyter Notebook
  2. 机器学习近年来之怪现象
  3. C++文件读写 打开方式等比较全
  4. Ubuntu 16.04下Caffe-SSD的应用(五)——安装VOC数据标注工具LabelImag
  5. notepad正则表达式替换_正则表达式装逼(实用)指南
  6. 位置子段最大子段和 hdu 1003 max sum ACM的开始
  7. npm执行命令后无任何响应(windows下)
  8. mysql按日期获取最新_mysql获取按日期排序获取最新的记录
  9. keyshot渲染玻璃打光_KeyShot新手的第一次打光,无脑三点打光塑造模型质感
  10. matlab中quiver,matlab quiver 比例尺
  11. javascript常用工具类整理(copy)
  12. Sql注入截取字符串常用函数
  13. 电力-103规约主站端实现
  14. 使用vscode编写原生微信小程序
  15. 163个人邮箱注册申请流程,公司邮箱怎么注册?
  16. win10系统升级没有声音?老司机教你怎么重新安装声卡驱动
  17. 在职研究生计算机专业好考么,湖南在职研究生计算机专业好考不
  18. 石墨笔记,为知笔记和Effie哪个更适合采编?
  19. 老雷PHP教程,老雷socket編程之PHP利用socket擴展實現聊天服務
  20. 多语言在线客服系统源码-自动识别中英环境-私有化部署完美支持跨境电商网站...

热门文章

  1. 大数据技术——从海量数据的存储到海量数据的计算
  2. CentOS8搭建SonarQube9+SonarScanner+Postgresql+bitbucket+cppcheck 扫描C语言。(未完待续)
  3. 大数据挖掘分析工具集
  4. Windows下system()函数详解
  5. 图像视频去雨的几种主流方法
  6. 完整体验了一次,微信7.0新开放的「亲属卡」功能
  7. C# 中常用的文件流(FileStream、StreamReader/Writer、MemoryStream)
  8. Plant, Cell Environment:DAP-seq技术在ZmEREB57调控OPDA合成提高玉米耐盐性研究中的应用
  9. 2022春软件工程课后作业(4.4)
  10. shell脚本之判断字符串是否相等