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.pswp.cn/web/15357.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15357.shtml
英文地址,請注明出處:http://en.pswp.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…