当前位置: 首页 > news >正文

(STM32笔记)九、RCC时钟树与时钟 第二部分

我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者
之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。

九、RCC时钟树与时钟

  • 九、RCC时钟树与时钟
    • 2、时钟配置函数
      • 时钟初始化思路(72M)
        • 复位时钟至默认状态
        • 使能HSE,并等待HSE就绪
        • 设置flash,设置时钟树,使能PLL
      • 更新时钟频率思路
        • 获取时钟源
        • 选择系统时间源
        • 保存在SystemCoreClock

九、RCC时钟树与时钟

2、时钟配置函数

在程序启动文件startup_stm32f10x_hd.s里找到SystemInit函数跳转入口
在这里插入图片描述

system_stm32f10x.c中找到SystemInit函数

时钟初始化思路(72M)

复位时钟至默认状态
    RCC->CR   |= (u32)0x00000001;                                // 开启内部时钟RCC->CFGR &= (u32)0xF8FF0000;                                // 复位 SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bitsRCC->CFGR &= (u32)0xFF80FFFF;                                // 复位 PLL和分频的配置RCC->CIR   = 0x009F0000;                                     // 关闭中断,清理中断位
使能HSE,并等待HSE就绪
// 配置时钟 HCLK, PCLK, PCLK1, PCLK2, FLASH __IO u32 StartUpCounter = 0, HSEStatus = 0;      RCC->CR |= ((u32)RCC_CR_HSEON);                              // 使能 HSE  do{                                                          // 等待HSE就绪HSEStatus = RCC->CR & RCC_CR_HSERDY;StartUpCounter++;  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));   // 0x0500
设置flash,设置时钟树,使能PLL
    if ((RCC->CR & RCC_CR_HSERDY) != RESET)  {  FLASH->ACR |= FLASH_ACR_PRFTBE;                          // 启动预取缓冲区   FLASH->ACR &= (u32)((u32)~FLASH_ACR_LATENCY);            // 设置时延FLASH->ACR |= (u32)FLASH_ACR_LATENCY_2;    RCC->CFGR  |= (u32)RCC_CFGR_HPRE_DIV1;                   // [7:4]   AHB  预分频, HCLK = SYSCLK/1  不分频     RCC->CFGR  |= (u32)RCC_CFGR_PPRE2_DIV1;                  // [13:11] APB2 预分频, APB2 = HCLK/1,   不分频RCC->CFGR  |= (u32)RCC_CFGR_PPRE1_DIV2;                  // [10: 8] APB1 预分频, APB1 = HCLK/2,    2分频RCC->CFGR  &= (u32)(~( 1<<16 | 0x01<<17 | 0xF<<18));     // 清零RCC->CFGR  |= (u32)(0x01<<16 | 0x07<<18);                // PLL 时钟源,低频因子,倍频系数, 使PLLCK= HSE * 9= 72MHz   RCC->CR    |= (u32)(0x01<<24);                           // 使能PLL    while((RCC->CR & RCC_CR_PLLRDY) == 0) {  }               // 等待PLL就绪RCC->CFGR &= (u32)((u32)~(0x3<<0));                      // 清0RCC->CFGR |= (u32)(0x1 << 1);                            // 切换系统时钟源为:PLLCLOCK    while ((RCC->CFGR & (u32)RCC_CFGR_SWS) != (u32)0x08) { } // 等待系统时钟切换完成}else{ // 重要!!!// 时钟初始化失败 // 处理位置}    

更新时钟频率思路

获取时钟源
    u32 tmp = 0, pllmull = 0, pllsource = 0;    tmp = RCC->CFGR & RCC_CFGR_SWS;                                 // 获取时钟源
选择系统时间源
switch (tmp)  {case 0x00:                                                  // HSI 内部高速晶振 被选为系统时钟源SystemCoreClock = HSI_VALUE;break;case 0x04:                                                  // HSE 外部高速晶振 被选为系统时钟源SystemCoreClock = HSE_VALUE;break;case 0x08:                                                  // PLL 被先为系统时钟源     pllmull = RCC->CFGR & RCC_CFGR_PLLMULL;                 // PLL 时钟源及倍频系数pllsource = RCC->CFGR & RCC_CFGR_PLLSRC;       pllmull = ( pllmull >> 18) + 2;      if (pllsource == 0x00){        SystemCoreClock = (HSI_VALUE >> 1) * pllmull;       // HSI振荡器时钟2分频作为PLL时钟输入}else{                                                       // HSE作为PLL时钟输入                              if ((RCC->CFGR & RCC_CFGR_PLLXTPRE) != (u32)RESET){SystemCoreClock = (HSE_VALUE >> 1) * pllmull;   // HSE 2分频}else{SystemCoreClock = HSE_VALUE * pllmull;}}break;default:SystemCoreClock = HSI_VALUE;break;} 
保存在SystemCoreClock
    tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];  SystemCoreClock >>= tmp; 

相关文章:

  • Java中等题-最长回文子串(力扣)
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • 技术周总结 2024.07.29 ~ 08.04周日(MyBatis, 极限编程)
  • Cocos Creator2D游戏开发(9)-飞机大战(7)-爆炸效果
  • 使用ImDisk将Python安装到RAM磁盘提高运行速度
  • web小游戏开发:2048(完)移动操作及动画效果
  • 巧用casaos共享挂载自己的外接硬盘为局域网共享
  • CSP 2020 第三题:表达式
  • 【时时三省】unity test 测试框架 使用 code blocks 移植(核心文件:unity.c, unity_fixture.c)
  • PCB设计
  • OS X El-Capitan 安装 virtualenvwrapper 遇到 Operation not permitted
  • 模型微调(Fine-Tuning)及其在AI中的作用(优缺点)
  • 构建智能手写数字和符号识别系统:深度学习与YOLO模型的结合
  • springboot集成canal
  • Windows系统使用内网穿透配置Mysql公网地址实现IDEA远程连接
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [译]Python中的类属性与实例属性的区别
  • [译]前端离线指南(上)
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CEF与代理
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Laravel Telescope:优雅的应用调试工具
  • mockjs让前端开发独立于后端
  • NSTimer学习笔记
  • React-redux的原理以及使用
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • scala基础语法(二)
  • Travix是如何部署应用程序到Kubernetes上的
  • vue 个人积累(使用工具,组件)
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 百度小程序遇到的问题
  • 程序员该如何有效的找工作?
  • 从零搭建Koa2 Server
  • 和 || 运算
  • 记录一下第一次使用npm
  • 排序算法学习笔记
  • 入口文件开始,分析Vue源码实现
  • 实习面试笔记
  • 突破自己的技术思维
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 网页视频流m3u8/ts视频下载
  • 怎样选择前端框架
  • 栈实现走出迷宫(C++)
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • gunicorn工作原理
  • # SpringBoot 如何让指定的Bean先加载
  • #{} 和 ${}区别
  • #微信小程序(布局、渲染层基础知识)
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (21)起落架/可伸缩相机支架
  • (6)STL算法之转换
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解