默认芯片复位后以4MHz内部时钟运行,为了以高性能运行,我们需要配置系统时钟按照最大时钟频率运行。本篇测试RCC时钟配置,并进行超频测试。
参考手册的《11 Reset and clock control (RCC)》
从原理图可知没有焊接HSE晶振,所以只能使用内部的。
Figure 33. Clock tree可以看时钟树结构。
我们选择HSI RC16 MHz作为系统时钟。
见《11.4.6 PLL》
最大输出时钟
系统最大时钟为160MHz
PLL的输入4~ 16 MHz ,我们这里选择16M的HSI
计算公式
PLLM:可设置值1~63
分频值,PLL的输入时钟比如16MHz/PLLM作为VCO的输入,VCO的输入必须是1~16MHz
所以我们这里设置为1
PLLN:可设置值4~512
倍频值,VCO的输入x PLLN为VCO的输出,
VCO的输出最大值和电压范围对应
范围1 ,2则最大128~544MHz
范围3 则最大128~330MHz
为了最高性能需要使用电压等级1,设置PLLN=20
PLLP:1~128
PLLQ:1~128
PLLR:1和偶数值
必须设置电压等级为1,否则高频运行会异常。
LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_PWR);
HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
FLASH等待周期也要设置为4以上。
HAL_RCC_ClockConfig(&pRCC_ClkInitStruct, FLASH_LATENCY_4);
FLASH等待周期与主频,电压等级的关系,最大160MHz,电压等级1时需要配置最少4WS。
总的代码如下
#include "stm32u575xx.h"
#include "stm32u5xx_ll_gpio.h"
#include "stm32u5xx_ll_bus.h"
void SysTick_Handler(void)
{
static volatile uint32_t num = 0;
if(num++ >= 1000)
{
LL_GPIO_TogglePin(GPIOB, 1u<<7);
LL_GPIO_TogglePin(GPIOC, 1u<<7);
num=0;
}
HAL_IncTick();
}
void delay(uint32_t t)
{
volatile uint32_t timeout = t;
while(t--);
}
int main(void)
{
#if 1
LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_PWR);
HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitTypeDef pRCC_OscInitStruct;
pRCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
pRCC_OscInitStruct.HSIState = RCC_HSI_ON;
pRCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
pRCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
pRCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
pRCC_OscInitStruct.PLL.PLLM = 1;
pRCC_OscInitStruct.PLL.PLLMBOOST = RCC_PLLMBOOST_DIV1;
pRCC_OscInitStruct.PLL.PLLN = 20;
pRCC_OscInitStruct.PLL.PLLP = 1;
pRCC_OscInitStruct.PLL.PLLQ = 1;
pRCC_OscInitStruct.PLL.PLLR = 2;
pRCC_OscInitStruct.PLL.PLLRGE = RCC_PLLVCIRANGE_0;
pRCC_OscInitStruct.PLL.PLLFRACN = 0; /* */
HAL_RCC_OscConfig(&pRCC_OscInitStruct);
RCC_ClkInitTypeDef pRCC_ClkInitStruct;
pRCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
pRCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
pRCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
pRCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
pRCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
pRCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&pRCC_ClkInitStruct, FLASH_LATENCY_4);
#endif
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);
LL_GPIO_InitTypeDef GPIO_InitStruct;
//LL_GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.Pin = LL_GPIO_PIN_7;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LL_GPIO_PIN_7;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
LL_GPIO_Init(GPIOC, &GPIO_InitStruct);
HAL_Init();
while(1)
{
///delay(1000000ul);
///LL_GPIO_TogglePin(GPIOB, 1u<<7);
}
}
160MHz
PLLN设置为20
PLLN设置为33, 8*33=264MHz ,FLASH等待时间设置为FLASH_LATENCY_4
此时还能点灯OK,再减小FLASH等待时间或者增加PLLN都会导致运行异常,所以这应该就是极限了。
可以看出可超频范围还是挺大的,并且在超频后还能保持FLASH等待周期为FLASH_LATENCY_4,说明内部FLASH的读性能也是裕量很大的。
以上进行了RCC时钟配置的演示,并且进行了超频测试。不愧是大厂,由160M超频到264M还能工作,且能保持较小的FLASH等待周期。
引用: 秦天qintian0303 发表于 2022-12-15 12:01 超频稳定性如何?能超多少,有介绍吗
文中测试可以超频到264MHz,FLASH等待周期4,点灯还OK,没有测试其他外设。
没有测试ICACHE,DCACHE使能测试。