NUCLEO教程之七:超频. E T: r8 u% E7 b3 W! v+ D* i3 I, y 编译:netlhx * v" e1 N' p/ |% Y1 P 2 R; e+ u; ~$ l8 E I nucleo_tutorial7.pdf (172.32 KB, 下载次数: 4312) 2015-1-9 08:16 上传 点击文件名下载附件 6 h8 U: k7 y3 y' e( Z 8 R* J& z1 m# r) WSTM32NUCLEO F072RB评估板的官方说明是:最大工作频率为48MHz。今天我们来测试一下超频,看能达到什么程度。 ( r% c- H8 P( \8 iMCU工作频率* Q& p5 {( o$ y; g- n% P 一张图看MCU工作频率,下面是STM32CubeMX中的时钟配置图 1 V& i, N8 ~7 P3 O* x - S2 o" g) S9 j6 I0 s F072评估板上没有焊接HSE,所以就只能使用HSI了,至于HSI也有两种,一个是HSI,另一个是HSI48,这里用的是HSI,默认频率8M,不可更改。 % L. f% w! r+ T2 a& ~. l外部频率一般不会做得很大,MCU内部需要的高频时钟都是由PLL提供的。从上图可以看出,PLL时钟源可以是:HSI、HIS48、HSE。然后经PREDiv分频之后就得到了VCPInput,经PLLMul倍频后得到VCO。这个VCO可以被选择做为系统主时钟。( `' @, o8 {# B% O( J1 X 因此有下述公式: 4 a. m& P$ z: j w D4 nSYSCLK = HSI / PREDiv * PLLMul C8 | h/ T6 u% Y; W0 t" r. J! ^默认情况下,SYSCLK = 8 MHz / 2 * 12 = 48Mh,这也是通常情况下的系统主频。! h5 ^. L8 h" R; x 换句话来说,通过修改PREDiv和PLLMul这两个值,可以调整MCU的工作频率,这也是我们实现超频的基础。( U, {" h+ o" z% V8 b 但话得说回来。这两个值你也不能胡乱设置。在MCU中,你通常会看到很多的频率设置,如48M, 100M, 336M, 360M等。为什么会有这么多奇怪的设置呢?主要是因为一些特定的设备如USB, SDIO等,它们需要工作在48M的频率下,比如说如果要使用USB的话,可以选择336M,经7分频后就得到了48的频率,如果你使用360M的话,是得不到48M的,因为分频系数只能取整数!$ r/ r O7 s; C% ?6 f2 y RCC配置+ e% r8 l9 g1 a: u 好了,基本原理介绍完毕,下面来看初始化代码是怎样配置RCC的。& t0 X5 S, [8 E; K" S+ @% N ; x7 T) e# c( o4 S/ e _ /** System Clock Configuration 8 F9 k( c- N7 U*/7 ~) C" v, ?) d! v O void SystemClock_Config(void)# _0 @6 ^7 ^# u n: w& d- @ { # k5 k( C) \% |' L % }; b9 u3 X& g" D RCC_OscInitTypeDef RCC_OscInitStruct; k1 y0 R+ D: b4 O* | RCC_ClkInitTypeDef RCC_ClkInitStruct; & O0 `5 K+ n' q' u/ T 3 F! H- N( z% ` RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;( h8 K% L. ~; h$ d. M RCC_OscInitStruct.HSIState = RCC_HSI_ON;6 I8 K# I y5 l RCC_OscInitStruct.HSICalibrationValue = 16;' E6 w9 {8 B1 w) U* V RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; 6 o, D3 |5 P' E& t0 ] RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;" l8 I% M' a9 O$ K* s$ N& @ RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12; * L5 e0 Q, s0 D: X/ c RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV2; & V% }+ u. J# ^+ f; n# d! r$ o HAL_RCC_OscConfig(&RCC_OscInitStruct); Q A6 |% C& J # C+ l" i+ ~/ h% t6 S RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;6 \' S8 |; n8 D RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; " f' d% l* F5 U6 k+ M# M( h RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + K' ?; ]5 L" ]7 s RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; 1 m4 S2 D; j9 H HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1); 9 G' i" F- W& ^; Q% k- l7 [ 7 f2 v( f" @/ H6 R' D7 w2 g" H2 M, s __SYSCFG_CLK_ENABLE(); 1 b7 N u* {: j3 Y. I4 w( E$ B 2 x/ W5 U$ g" n, N} 2 \0 A3 g1 \' @3 x* Q复制代码 3 B8 b0 w& u. c ' D/ U' [* _7 [7 i3 @! s这是标准配置代码,其中PREDiv和PLLMUL的值分别为2和12,这样MCU的工作频率为48M。 3 D' Z7 r$ E) B5 k; l" f3 r测试标准 o0 e" e# n6 E+ j" _3 `为了检验不同频率下的运行状态,我们通过运行一段代码来判断MCU是否正常工作。 : B3 K/ l5 X, G) h* N这里选择TIM2来生成一段PWM波形,通过检测波形参数来判断MCU的工作状态。下面是PWM波形代码,这是一个占空比为50%的方波,频率为1KHZ。 1 L- ^5 U+ Q/ E& P3 ?$ v u. g: Z% U4 N) Y8 N6 t1 ~/* TIM2 init function */ " `5 N6 s7 d, A; [' T) @void MX_TIM2_Init(void) 2 \; A/ P2 R. b# I8 U{: u0 e X# g4 T$ b , \+ B, X! y: ` TIM_ClockConfigTypeDef sClockSourceConfig;2 C- f5 s+ Q1 J1 C4 k7 k5 f+ i" g B TIM_MasterConfigTypeDef sMasterConfig; ) Z% T8 ?. E. |/ F TIM_OC_InitTypeDef sConfigOC; ' k1 Q: s: V# d1 b8 g- T0 E' ?+ ?5 u htim2.Instance = TIM2;! t# z4 i6 p+ S! ?! e htim2.Init.Prescaler = 47;5 s g5 w3 h C# b! {4 i0 H, ?5 b5 l htim2.Init.CounterMode = TIM_COUNTERMODE_UP; 1 E8 z* u" c; q1 e+ E5 v htim2.Init.Period = 999;/ B' T* ^6 N, g6 J# f htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;2 f9 Y. c" d7 O, t- d HAL_TIM_Base_Init(&htim2);0 ~# g( V3 P+ Z% Y, s& U : {4 o/ o2 g: J3 W( n sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + E# }- B. q3 S HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);! s* @, x- _) K - x2 f" e F: `9 b1 b" }$ f HAL_TIM_PWM_Init(&htim2); ' a5 W6 V! `4 n" l& K5 b6 K0 Y9 n& O8 s6 N2 A1 \ sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; ' J% i& y5 n" e sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;! ?- d8 W f9 n0 p( S' S0 Y! I HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); 7 n5 \. `& v/ J2 P/ T # f% c/ J. X" M- p( _1 E sConfigOC.OCMode = TIM_OCMODE_PWM1; : k+ X3 F9 ^, I* k sConfigOC.Pulse = 499; 1 |2 [2 K, r: I6 A, i sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; " n+ s. x I2 U9 v sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;7 y' y7 ^! e% x/ x HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1); . l" T7 o0 W J2 @0 K, w8 J . J* f! y9 [' y" h+ E/ @}0 ?! ~ w4 b1 [" t" ` 复制代码) [8 d1 u, o, X6 R8 z " [: G) F9 r8 W9 h, @9 _这是标准48M下的PWM波形- K/ M, b) M1 T 1 C3 b5 ?6 ~ M B" E由于使用的逻辑分析仪比较渣,所以结果你也将就着看。 9 S- T2 ^# {, X+ T超频及测试. {5 F3 c; Q+ _4 _( f 下面我们开始对MCU进行超频,看看它们各自的PWM波形如何。3 k; A9 u# T( n) e$ L1 x 1. 64M工作频率$ b+ @( E' D4 p9 i* e$ q PREDIV和PLLMUL的参数分别为:2、16,8/2*16=64M J9 Z/ f. u( ~ \3 ^9 z % y4 {' L0 a: t* J OK!/ i5 p, e5 n* h7 {/ Q1 z 2. 80M工作频率9 E5 W# a& d; V7 ]* R& [- `. `* x5 E PREDIV和PLLMUL的参数分别为:1、10,8/1*10=80M t1 ^1 L! L7 X, z- h 1 C4 Y; p+ i7 D& t3. 96M工作频率 ) a6 G( i8 a4 c& E% A0 p# t; iPREDIV和PLLMUL的参数分别为:1、12,8/1*12=96M : X& R, c, k' Q# n- V* i) j) H ; }/ N- q+ M; u汗!这正常么? a! J9 u% t# I1 T- ^: M O再调整PLLMUL的值为13的话,没有波形了,跑飞了么!2 [+ `! j, J# h# q3 j 也就是说,跑到这种程度已达极限了!' s9 V4 L! g0 Z% m - G: y% E6 V2 {: w) ^8 o, n' b注意: 7 I9 w: e. B0 |3 c关于测试标准,我没有想到更好的测试方法,如果你有,欢迎探讨! 2 @) a$ j8 w: g" A E4 \2 ] - J7 n5 k0 W9 r+ Q4 g$ o) c
0个等待周期的速度为50MHz左右;
1个等待周期的速度为100MHz左右;
2个等待周期的速度为150MHz左右。
48MHz的STM32F072,可以有一个等待周期,速度可以达到100MHz左右。
htim2.Init.Period = 999;0 N0 ^# U7 Y5 }9 Y" p# J
楼主你选择了内部时钟源,当上面两个值不变的情况下,你超频内部时钟变大,但是没发觉你的PWM波频率变大了啊!
测试一下
预分频器也相应的改了- H4 G2 S& I% J
测试STM32F103RBT6 超频到140M测试没有发现问题(但电流差不多大了一倍)。再高频率就容易出问题了。
差不多也超了一倍
逻辑分析仪抓的