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

STM32 寄存器配置笔记——系统时钟配置 HSE as PLL

一、概述

       本文主要介绍使用HSE高速外部时钟通过PLL倍频输出72MHZ的时钟作为系统时钟。下图为时钟树。

        使用正点原子的开发板调试OSC_IN、OSC_OUT接的是8MHZ的晶振即为HSE时钟。

二、配置流程

        1)复位RCC相关的所有寄存器

            复位内容是参考正点原子例程,按照博主理解只要将HSE对应会影响到的RCC寄存器复位即可。本博客重点主要在时钟配置原理,此步骤可以不用特别关注。

 	RCC->APB1RSTR = 0x00000000;//RCC->APB2RSTR = 0x00000000; RCC->AHBENR = 0x00000014;  //睡眠模式闪存和SRAM时钟使能,其他关闭RCC->APB2ENR = 0x00000000; //外设时钟关闭		   RCC->APB1ENR = 0x00000000;   RCC->CR |= 0x00000001;     //使能内部高速时钟HSION														 RCC->CFGR &= 0xF8FF0000;   //复位SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0], MCO[2:0]RCC->CR &= 0xFEF6FFFF;     //复位HSEON, CSSON, PLLONRCC->CR &= 0xFFFBFFFF;     //复位HSEBYPRCC->CFGR &= 0xFF80FFFF;   //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRERCC->CIR = 0x00000000;     //关闭所有中断

        2)使能HSE时钟

        使能HSE时钟等待就绪。

	RCC->CR |= 1 << 16;       // enable HSE clockwhile (!(RCC->CR >> 17)); // wait HSE rdy

      

        3)配置PLLXTPRE

             配置为0,使得HSE作为PLL输出时不分频,上面复位操作已经配置为0这里就不重新配。

        4)配置PLLMUL

       

RCC->CFGR |= PLL << 18;   // set PLLMUL 

        5)配置PLL时钟源为HSE

      

RCC->CFGR |= 1 << 16;     // PLLSRC HSE as PLL clock

        6)配置FLASH等待周期

         由于半导体制造工艺的限制,存放程序的FLASH存储器不可能达到这么高的工作频率,这样当CPU直接访问Flash存储器时必须插入等待周期以得到正确的结果。

         在<<STM32F10xxx存编程手册>>有如下规定:

        ACR寄存器内容:

        7)使能PLL

        使能PLL时钟,等待PLL时钟就绪。

	RCC->CR |= 1 << 24;       // PLLON PLL enablewhile(!(RCC->CR >> 25));  // wait PLL rdy

        8)PLL时钟作为系统时钟

        配置PLL时钟作为系统时钟等待配置完成。

        

RCC->CFGR |= 0x00000002;  // PLL as sysclkdo
{temp = RCC->CFGR>>2;temp &= 0x3;
} while (temp != 2);       // temp = 2 indicator PLL as sysclk suc

三、源码

        整个代码调用情况如下:

        

void Stm32_Clock_Init(u8 PLL)
{unsigned char temp=0;   MYRCC_DeInit();		      // reset and cfg vector tabRCC->CR |= 1 << 16;       // enable HSE clockwhile (!(RCC->CR >> 17)); // wait HSE rdyRCC->CFGR |= 0x00000400;  // APB1=DIV2;APB2=DIV1;AHB=DIV1;PLL -= 2;                 // 0 - PLL * 2   14/15 - PLL * 16RCC->CFGR |= PLL << 18;   // set PLLMUL RCC->CFGR &= ~(1 << 17);  // PLLXTPRE set 0 HSE PLL DIV1RCC->CFGR |= 1 << 16;     // PLLSRC HSE as PLL clockFLASH->ACR |= 0x02;	      // LATENCY read Flash clock wait statesRCC->CR |= 1 << 24;       // PLLON PLL enablewhile(!(RCC->CR >> 25));  // wait PLL rdyRCC->CFGR |= 0x00000002;  // PLL as sysclkdo{temp = RCC->CFGR>>2;temp &= 0x3;} while (temp != 2);       // temp = 2 indicator PLL as sysclk suc
}

        在时钟配置完成后,通过能够成功点亮LED来验证配置成功。

相关文章:

  • web:[GXYCTF2019]禁止套娃
  • gwas数据获取如何获取完整的GWAS summary数据(1)------GWAS catalog数据库
  • 【JavaEE初阶】 JavaScript基础语法——贰
  • R语言——taxize(第三部分)
  • Linux 常用命令学习笔记
  • Postgresql常用命令函数
  • 目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】目标视觉检测
  • 二百零七、Flume——Flume实时采集5分钟频率的Kafka数据直接写入ODS层表的HDFS文件路径下
  • 使用 AWS boto3 库从 s3 桶中批量下载数据
  • UE TransformVector 学习笔记
  • Go 语言中的map和内存泄漏
  • 5-什么是猴子补丁,有什么用途?什么是反射,python中如何使用反射?http和https的区别?
  • 算法训练 第八周
  • 11 月 11 日 ROS 学习笔记——ROS 架构及概念
  • 五分钟,Docker安装kafka 3.5,kafka-map图形化管理工具
  • 【Leetcode】101. 对称二叉树
  • (三)从jvm层面了解线程的启动和停止
  • 3.7、@ResponseBody 和 @RestController
  • Codepen 每日精选(2018-3-25)
  • github从入门到放弃(1)
  • Intervention/image 图片处理扩展包的安装和使用
  • java8 Stream Pipelines 浅析
  • js继承的实现方法
  • JWT究竟是什么呢?
  • mysql innodb 索引使用指南
  • Odoo domain写法及运用
  • Vim 折腾记
  • 前端性能优化--懒加载和预加载
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 详解NodeJs流之一
  • 异常机制详解
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 2017年360最后一道编程题
  • linux 淘宝开源监控工具tsar
  • 阿里云ACE认证学习知识点梳理
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​水经微图Web1.5.0版即将上线
  • #pragma once与条件编译
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)常见O(n^2)排序算法解析
  • (3)选择元素——(17)练习(Exercises)
  • (二)hibernate配置管理
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (简单) HDU 2612 Find a way,BFS。
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十五)使用Nexus创建Maven私服
  • *上位机的定义
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET 常见的偏门问题
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • //解决validator验证插件多个name相同只验证第一的问题
  • /etc/sudoer文件配置简析
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)