STM32修改主频的方法

大家都知道STM32F103C8T6的主频是72M,那怎么样才能在程序中获得这个主频的值呢?怎么样才能更改主频的值呢?

如图找到主频的变量,然后显示这个变量就是显示主频了。

#include "stm32f10x.h"                  // Device header
#include "OLED.h"


int main(void)
{
	OLED_Init();       //oled  屏幕初始化
	
	OLED_ShowString(1,1,"Freq:");
	OLED_ShowNum(1,6, SystemCoreClock, 8);  //OLED显示主频数值
	
}

上面是怎么显示主频的方法,下面是怎么更改主频的方法了:

想要修改主频就得修改这些个带有小钥匙的文件,首先要把这些个文件的属性修改了,修改成不是只读的属性,具体的方法就是先在工程文件夹中找到stm32f10x.c这个文件,然后修改它的属性:

### 动态调整 STM32 主频方法 STM32主频由其内部的时钟系统控制,主要通过配置 PLL(Phase-Locked Loop)、HSE(High-Speed External Clock)、HSI(High-Speed Internal Clock)以及 LSI/LSE 来实现。如果需要在运行过程中动态调整主频,则可以通过重新配置这些时钟源来完成。 以下是具体的操作方式: #### 配置 RCC 寄存器 RCC(Reset and Clock Control)模块负责管理 STM32 的时钟树结构。要动态改变主频,通常需要操作以下几个寄存器: - **RCC_CFGR**:用于设置系统的时钟源和分频系数。 - **RCC_CR**:用于使能或禁用 HSE/HSI 和 PLL。 - **RCC_PLLCFGR**:用于配置 PLL 输入频率、倍频因子以及其他参数。 为了安全地更改主频,需遵循以下原则[^1]: - 始终备份当前的时钟配置状态以便恢复。 - 确保新的时钟配置不会违反外设的工作范围。 - 使用 HAL 库或者 LL 库可以简化复杂的寄存器操作过程。 #### 示例代码 下面是一个基于 HAL 库的示例程序,展示如何动态切换到不同的主频: ```c #include "stm32f1xx_hal.h" void ChangeSystemClock(uint32_t pllm, uint32_t pllsrc, uint32_t plln, uint32_t pllp) { RCC_OscInitTypeDef OscInitStruct; RCC_ClkInitTypeDef ClkInitStruct; // Disable interrupts to avoid conflicts during clock switching __disable_irq(); // Backup current configuration (optional but recommended) HAL_RCC_GetOscConfig(&OscInitStruct); HAL_RCC_GetClockConfig(&ClkInitStruct); // Configure the new PLL settings OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI; OscInitStruct.PLL.PLLMUL = pllm; // Set multiplier value OscInitStruct.PLL.PLLSource = pllsrc; // Select source as HSE or HSI if (HAL_RCC_OscConfig(&OscInitStruct) != HAL_OK) { Error_Handler(); } // Update system clock with updated values ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { // Adjust flash latency accordingly Error_Handler(); } // Re-enable interrupts after successful change __enable_irq(); } // Example usage: Switching to a different frequency dynamically int main(void) { HAL_Init(); // Initialize HAL Library SystemClock_Config(); // Initial default clock setup while (1) { // Dynamically adjust the system clock every second ChangeSystemClock(RCC_PLL_MUL9, RCC_PLL_SOURCE_HSE, 8, RCC_PLLP_DIV2); // Example setting HAL_Delay(1000); } } ``` 上述代码展示了如何利用 `ChangeSystemClock` 函数动态修改主频。需要注意的是,每次调用此函数前应确认新设定是否满足目标应用的需求,并适当调整闪存延迟 (`FLASH LATENCY`) 参数以匹配更高的工作频率。 #### 注意事项 - 不同型号的 STM32 支持的最大主频不同,请查阅对应的数据手册获取准确信息。 - 修改主频可能会影响某些依赖精确定时的功能(如 UART 波特率),因此需要同步更新相关初始化代码。 - 如果使用外部晶振作为时钟源,确保该晶振已稳定启动后再启用 PLL。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尚久龙

你的鼓励是我最大的动力!谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值