STM32手写超频到128M函数

今天学习了野火的STM32教程学会了如何设置STM32的时钟频率,步骤比较详细,也很容易理解,就是视频教程不能跳着看,只能一节节的看,不然会知识不连贯,造成有些知识不理解,连续着看还是没有什么难度的。

我把怎么设置系统时钟的步骤总结一下吧:

第一步:将RCC的所有寄存器都恢复成默认值

第二步:使能HSE

第三步:判断HSE启动是否成功

        HSE启动成功的话:

        {

                1:使能预取缓冲区

                2:预取缓冲区等待周期2

                3:设置AHB的时钟 1分频   72M

                4:APB1的时钟设置 2分频 36M

                5:APB2的时钟设置 1分频 72M

                6:锁相环时钟配置:来源HSE1分频,倍频因子9倍(也可以改成自己想要的倍数,超频就改这里)

                7:使能锁相环

                8:等待锁相环稳定

                9:系统时钟选择锁相环时钟

                10:等待系统时钟切换成功

        }

        HSE启动不成功:

        {

                写不成功的代码。

        }

*******************************************************************************************************************

按照上面的步骤操作后,系统时钟就按照我们的标准来设置了。其实这个操作没有什么太大的必要性,因为系统会自动为我们配置好的,研究这个过程是为了更深一步的了解STM32的工作步骤。能叫自己的脑子里的思路更加清晰。

下面我就把源码发出来,自己研究吧!

RCC.c文件:

#include "RCC.h"                  // Device header/*HSE时钟设置函数(传入倍频因子)*/
void HSE_SetSysClk(uint32_t RCC_PLLMul_x)
{ErrorStatus HSEStatus;  //定义一个HSE启动成功与否的标志位变量RCC_DeInit();  //RCC所有寄存器恢复成默认值RCC_HSEConfig(RCC_HSE_ON);//使能HSEHSEStatus = RCC_WaitForHSEStartUp();//HSE启动是否成功的返回值if(HSEStatus == SUCCESS){FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能预取缓冲区 在《STM32F10xxx闪存编程》的3.1节 的FLASH_ACR 的 位4:PRFTBE 取值1 :启用预取缓冲区FLASH_SetLatency(FLASH_Latency_2);  //预取缓冲区等待周期2RCC_HCLKConfig(RCC_SYSCLK_Div1);   // AHB的时钟设置 1分频RCC_PCLK1Config(RCC_HCLK_Div2);   // APB1的时钟设置 2分频RCC_PCLK2Config(RCC_HCLK_Div1);   // APB2的时钟设置 1分频RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x); //锁相环配置 时钟来源与倍频因子  16倍频  8*16=128MRCC_PLLCmd(ENABLE); //使能锁相环//等待锁相环稳定// RCC_GetFlagStatus(uint8_t RCC_FLAG);  //RCC的标志位while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) != SET);//选择锁相环时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //时钟源选择while( RCC_GetSYSCLKSource() != 0x08 );  //如果不等于0x08就是没有切换成功就while等待}else{/* 如果HSE启动失败,用户可以在这里添加处理错误的代码 */}}//配置PA8为时钟输出
void MCO_GPIO_Config(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);
}

RCC.h文件:

#ifndef __RCC_H
#define __RCC_H#include "stm32f10x.h"                  // Device headervoid HSE_SetSysClk(uint32_t RCC_PLLMul_x);void MCO_GPIO_Config(void);#endif  /*__RCC_H*/

main.c文件:

#include "stm32f10x.h"                  // Device header
#include "led.h"  
#include "RCC.h" void Delay(uint32_t val)
{while(val){val--;}
}int main(void)
{LED_Init();//HSE_SetSysClk(RCC_PLLMul_16);  //设置时钟频率为16倍频  8*16=128M  超频MCO_GPIO_Config();RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);//MCO输出A8口输出锁相环时钟2分频,用示波器可以测量A8口的频率while(1){LED(ON);Delay(0xfffff);LED(OFF);Delay(0xfffff);}
}

由于我没有示波器,所以就只能用个led灯看看闪烁的速度来判断是不是超频了,所以还有个led的模块:

led.c文件:

#include "led.h"                  // Device headervoid LED_Init(void)
{RCC_APB2PeriphClockCmd(GPIO_CLK, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin = GPIO_PIN;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOx, &GPIO_InitStruct);}

led.h文件:

#ifndef __LED_H
#define __LED_H#include "stm32f10x.h"                  // Device header#define GPIOx                GPIOB
#define GPIO_PIN             GPIO_Pin_0
#define GPIO_CLK             RCC_APB2Periph_GPIOB#define ON                   1
#define OFF                  0#define LED(x)               if(x)\GPIO_ResetBits(GPIOx, GPIO_PIN);\else \GPIO_SetBits(GPIOx, GPIO_PIN);void LED_Init(void);#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker-file 网络

docker挂载 1.绑定挂载(Bind Mounts):绑定挂载是将主机上的文件或目录挂载到容器中。 docker run -v /host/path:/container/path image_name 2.卷挂载(Volume Mounts):卷挂载将 Docker 数据卷挂载到容器中…

【CTF Web】CTFShow web4 Writeup(SQL注入+PHP+字符型注入)

web4 1 管理员阿呆又失败了&#xff0c;这次一定要堵住漏洞 解法 注意到&#xff1a; <!-- flag in id 1000 -->拦截很多种字符&#xff0c;连 select 也不给用了。 if(preg_match("/or|\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\|select/i",$id)){die(&q…

yolov8推理由avi改为mp4

修改\ultralytics-main\ultralytics\engine\predictor.py&#xff0c;即可 # Ultralytics YOLO &#x1f680;, AGPL-3.0 license """ Run prediction on images, videos, directories, globs, YouTube, webcam, streams, etc.Usage - sources:$ yolo modepred…

Android开发-Android开发中的TCP与UDP通信策略的实现

Android 开发中的 TCP 与 UDP 通信策略的实现 1. 前言2. 准备工作3. Kotlin 中 TCP 通信实现客户端代码示例&#xff1a;服务器代码示例&#xff1a; 4. Kotlin 中 UDP 通信实现客户端代码示例&#xff1a;服务器代码示例&#xff1a; 5. TCP 与 UDP 应用场景分析TCP 实现可靠传…

搭建访问阿里云百炼大模型环境

最近这波大降价&#xff0c;还有限时免费&#xff0c;还不赶快试试在线大模型&#xff1f;下面整理访问百炼平台的千问模型方法。 创建RAM子账号并授权 创建RAM子账号 1. “访问控制RAM”入口&#xff08;控制台URL&#xff09; 然后点击进入“RAM管理控制台” 2. 添加用户 …

vue 区分多环境打包

需求&#xff1a;区分不同的环境&#xff08;测试、正式环境&#xff09;&#xff0c;接口文档地址不同&#xff1b; 配置步骤&#xff1a; 1、在根目录下面新建 .env.xxx 文件&#xff08;xxx 根据环境不同配置&#xff09; 文件中一定要配置的参数项为&#xff1a;NODE_ENV…

【Python搞定车载自动化测试】——Python实现CAN总线Bootloader刷写(含Python源码)

系列文章目录 【Python搞定车载自动化测试】系列文章目录汇总 文章目录 系列文章目录&#x1f4af;&#x1f4af;&#x1f4af; 前言&#x1f4af;&#x1f4af;&#x1f4af;一、环境搭建1.软件环境2.硬件环境 二、目录结构三、源码展示1.诊断基础函数方法2.诊断业务函数方法…

python 火焰检测

在日常生活,总是离不开火,有时候我们需要预防火灾发生,但是我们又不可能一直盯着,这时候我们就需要一款程序帮我们盯着,一旦发生火灾从而告知我们,今天就带大家编写这么一款应用。 安装需要的库 pip install opencv-python 代码实现 import cv2 # Library for…

qmt量化教程4----订阅全推数据

文章链接 qmt量化教程4----订阅全推数据 (qq.com) 上次写了订阅单股数据的教程 量化教程3---miniqmt当作第三方库设置&#xff0c;提供源代码 全推就主动推送&#xff0c;当行情有变化就会触发回调函数&#xff0c;推送实时数据&#xff0c;可以理解为数据驱动类型&#xff0…

mysql中使用 mysqldump 实现跨机器备份|数据同步

1.如果同步数据库&#xff0c;必须先创建数据库&#xff1a; mysqldump -h 192.168.1.10 --lock-tablesfalse -uroot -proot db_name | mysql -h127.0.0.1 -uroot -proot db_name2.过滤掉不想要的表(没试过&#xff0c;但是试过转为sql文件的) mysqldump -h 192.168.1.10 --…

vs2019 c++ 函数的返回值是对象的值传递时候,将调用对象的移动构造函数

以前倒没有注意过这个问题。但编译器这么处理也符合移动构造的语义。因为本来函数体内的变量也要离开作用域被销毁回收了。测试如下&#xff1a; 谢谢

实现信号发生控制

1. 信号发生器的基本原理 信号发生器是一种能够产生特定波形和频率的电子设备&#xff0c;常用于模拟信号的产生和测试。 信号发生器的基本原理 信号发生器的工作原理基于不同的技术&#xff0c;但最常见的类型包括模拟信号发生器和数字信号发生器&#xff08;DDS&#xff0…

[SCTF2019]babyre

打开看看还是有花指令 解除后首先pass1是解maze&#xff0c;好像又是三维的 x是25&#xff0c;也就是向下跳五层,注意是立体的 得到 passwd1&#xff1a; ddwwxxssxaxwwaasasyywwdd 接着往下看 有一个加密函数IDA逆向常用宏定义_lodword-CSDN博客 unsigned __int64 __fastca…

primeflex样式库笔记 Display相关的案例

回顾 宽度设置的基本总结 w-full&#xff1a;表示widtdh&#xff1a;100%&#xff1b;占满父容器的宽度。 w-screen&#xff1a;表示占满整个屏幕的宽度。 w-1到w-12&#xff0c;是按百分比划分宽度&#xff0c;数字越大&#xff0c;占据的比例就越大。 w-1rem到w-30rem&…

Oracle的安装以及一些相关问题

系列文章目录 Oracle的安装以及一些相关问题 文章目录 系列文章目录前言一、Oracle的安装二、常用命令三、误删dbf四、PLSQL乱码五、oracle更换数据库字符集总结 前言 一段时间没更新&#xff0c;主要最近一直在找工作&#xff0c;最终还是顺着春招找到工作了&#xff0c;现在…

美信時代監控易:堆疊交換機的監控與配置管理策略

隨著企業數字化轉型的加速&#xff0c;網絡架構的複雜性日益提升&#xff0c;堆疊交換機作為高可靠性、靈活擴展性的解決方案&#xff0c;在網絡基礎設施中扮演著至關重要的角色。然而&#xff0c;如何確保堆疊交換機的穩定運行&#xff0c;實現高效監控與配置管理&#xff0c;…

剖析 OceanBase 应对高并发的技术策略

推荐一个AI网站&#xff0c;免费使用豆包AI模型&#xff0c;快去白嫖&#x1f449;海鲸AI 在当今互联网时代&#xff0c;高并发场景下的数据库处理能力成为了许多应用的关键需求。为了满足用户对快速响应和高吞吐量的期望&#xff0c;数据库系统需要采用一系列技术来优化并发性…

七大经典排序算法——冒泡排序

文章目录 &#x1f4d1;冒泡排序介绍&#x1f324;️代码实现&#x1f324;️做个简单的优化&#x1f324;️复杂度和稳定性分析☁️结语 &#x1f4d1;冒泡排序介绍 冒泡排序是一种简单但效率较低的排序算法。它重复地比较相邻的两个元素&#xff0c;如果顺序不对则交换它们&…

C++ socket epoll IO多路复用

IO多路复用通常用于处理单进程高并发&#xff0c;在Linux中&#xff0c;一切皆文件&#xff0c;一个socket连接会对应一个文件描述符&#xff0c;在监听多个文件描述符的状态应用中epoll相对于select和poll效率更高 epoll本质是系统在内核维护了一颗红黑树&#xff0c;监听的文…

Linux中bash脚本怎么表示一个字符串变量

Linux中bash脚本怎么表示一个字符串变量 在Bash脚本中&#xff0c;你可以使用单引号&#xff08;&#xff09;或双引号&#xff08;"&#xff09;来表示一个字符串变量。以下是两种方式的示例&#xff1a; 使用单引号&#xff08;&#xff09;&#xff1a; my_variable…