STM32F4系列单片机如何修改主频
引言
在嵌入式系统开发中,STM32F4系列单片机的主频设置至关重要,它直接影响着系统的运行效率和性能表现。本文将为读者详细解析如何修改STM32F4系列单片机的主频。
F1与F4系列的区别
我首先想到最大的区别就是主频不同,什么是主频,我的理解就是CPU运行的频率,频率越大,性能肯定越强,F1系列单片机的主频大多数都是72Mhz,而F4系列单片机的主频却来到了惊人的168Mhz,什么概念?比F1的2倍还有多。所以刚刚从F1转到F4的朋友肯定会这么想,不就是主频提高了吗,把F1系列的代码移植管理不就行了吗。刚开始我也是这样想,也确实,除了配置方式不同意外,其它都大差不差。但当用上通信协议(软件模拟iic)的时候就发现,照搬F1系列的代码到F4系列上根本就行不通。其原因就在于F1与F4系列的主频不同,F4响应速度远超F1,所以要想成功移植须在基础上加延时,这里不作过多论述。总之,F1与F4系列的区别有很多方面,本文章只讲主频方面的不同。
修改F4主频
首先要想修改主频,就得先了解STM32单片机的时钟树,没了解过的朋友建议先去了解一下。
HAL库版本
这是我从STM32CUBEMX截下来的,我们都知道,大多数STM32单片机外接的大多数都8Mhz的晶振,所以HSE左边的蓝色方框里的数值改为8,代表着外接8Mhz的晶振。然后到PLL Source Mux(PLL时钟源选择器),依然选择HSE(外部高速时钟),接着我们看到有 /M, *N 和 /P。
/M全称 PLL_M,它是一个分频因子,用于对输入的时钟进行分频,就是除法操作,其取值范围通常为:2-63
*N全称PLL_N,它是一个倍频因子,用于将经过PLL_M分频后的频率进行乘法操作,其取值范围通常为:50-432
/P全称PLL_P,它是一个分频因子,用于将经过PLL_N倍频后的频率进行除法操作,其取值范围通常为:2-8(偶数倍)
对上面进行倍频分频操作后,进入到system clock mux(系统时钟源选择),我们选择PLLCLK,通过相位锁环倍频分频得到的时钟作为系统时钟。最后到AHB Prescaler(AHB总线分频器),经过这个分频后的HCLK(AHB时钟),用于驱动CPU和所有挂载在AHB总线上的外设。可以说,HCLK的频率直接影响着CPU的运行速度和AHB总线上外设的性能。所以最后这个AHB Prescaler我们通常选择1分频,也就是不分频。下面是结果图:
再往后的大家可以按需倍频分频。
标准库版本
首先查看自己用的是什么版本的系统文件
可以看到使用的是STM32F40_41xxx,记下这个版本号,等会需要用到。
先说一下#if和#endif预处理函数,它的功能是根据某些条件来决定是否编译特定的代码。
我在上图中已经定义了STM32F40_41xxx,所以它就会执行#if和#endif里面的代码
就比如这样
#if defined(STM32F40_41xxx)
uint32_t SystemCoreClock = 168000000;
#endif /* STM32F40_41xxx */因为#if后面定义的是STM32F40_41xxx,所以我就执行里面的代码
接着打开system _stm32f4xx.c这个C文件,找到#define HSE_BYPASS_INPUT_FREQUENCY 25000000,把250000000改成80000000,这个是HSE外部高速晶振的数值,如果不是8Mhz,可以按需修改。
接着我们找到PLL_M,PLL_N,PLL_P。然后按需修改自己需要的主频即可。
在static void SetSysClock(void)函数中,可以看到它们的分频倍频过程,如果不确定的,可以自己调试一下代码,看一下有没有按照预定的路线编译。
总结
本文只是个人看法,如有不足,欢迎指出,谢谢!