NUCLEO教程之七:超频3 T+ i' \5 k! V# g) n+ o* P3 y 编译:netlhx : e$ z" Y* Q* D, C. g 5 |! H& s5 A$ i1 A; j nucleo_tutorial7.pdf (172.32 KB, 下载次数: 4312) 2015-1-9 08:16 上传 点击文件名下载附件 * K7 F: S% C& n! F+ X , ` b! N H) K' A( x STM32NUCLEO F072RB评估板的官方说明是:最大工作频率为48MHz。今天我们来测试一下超频,看能达到什么程度。 ! Q3 J* p: V& s4 DMCU工作频率 . N7 U4 `, B4 a7 r M! ^3 S+ i一张图看MCU工作频率,下面是STM32CubeMX中的时钟配置图1 M; _$ x) n' k- ]* ^! h 1 C3 R. `; J z; g7 ]" WF072评估板上没有焊接HSE,所以就只能使用HSI了,至于HSI也有两种,一个是HSI,另一个是HSI48,这里用的是HSI,默认频率8M,不可更改。 % ~# f. ]6 }- E2 U" B9 G: V外部频率一般不会做得很大,MCU内部需要的高频时钟都是由PLL提供的。从上图可以看出,PLL时钟源可以是:HSI、HIS48、HSE。然后经PREDiv分频之后就得到了VCPInput,经PLLMul倍频后得到VCO。这个VCO可以被选择做为系统主时钟。 # Q2 ?& y" H* ^0 p7 ^/ ]0 Z% a因此有下述公式: * K7 N6 R' Q2 C e9 XSYSCLK = HSI / PREDiv * PLLMul! c# O# j7 v- \4 f 默认情况下,SYSCLK = 8 MHz / 2 * 12 = 48Mh,这也是通常情况下的系统主频。$ }+ G* T) T& I1 t% R) N 换句话来说,通过修改PREDiv和PLLMul这两个值,可以调整MCU的工作频率,这也是我们实现超频的基础。 . w# c1 F7 o- r$ K# t但话得说回来。这两个值你也不能胡乱设置。在MCU中,你通常会看到很多的频率设置,如48M, 100M, 336M, 360M等。为什么会有这么多奇怪的设置呢?主要是因为一些特定的设备如USB, SDIO等,它们需要工作在48M的频率下,比如说如果要使用USB的话,可以选择336M,经7分频后就得到了48的频率,如果你使用360M的话,是得不到48M的,因为分频系数只能取整数! : F5 ]4 U7 J7 F& rRCC配置 & ?4 T; i7 E/ E ~好了,基本原理介绍完毕,下面来看初始化代码是怎样配置RCC的。* I- }! v8 B7 f0 N 9 M) J5 e& S0 @1 }8 }2 ` /** System Clock Configuration+ a6 S7 v2 p3 Z */- D6 M& f! l6 {( [. W void SystemClock_Config(void)! T0 u! z+ I I9 ]/ X { ' H1 U5 d3 J1 y4 N : b2 t( _! f+ I: m! v2 g( R RCC_OscInitTypeDef RCC_OscInitStruct; " x, M2 H; A* x7 y X! E RCC_ClkInitTypeDef RCC_ClkInitStruct;$ K; h4 |& g9 u5 K+ n6 i% l . ?& [( D8 d! W% { RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;& p& G* c/ ]' D6 } RCC_OscInitStruct.HSIState = RCC_HSI_ON;0 x2 w3 J5 W% C, B RCC_OscInitStruct.HSICalibrationValue = 16; 5 V$ n {) c- e D# R2 k RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; : ^+ Z, H. Y) _ Y' x9 n9 M RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; ) D* L1 F+ P) S3 s" ~5 R: Z( Q* ] RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;" y1 x5 |7 Z# c ~ RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV2;0 K/ e) j% i5 ]4 z+ d HAL_RCC_OscConfig(&RCC_OscInitStruct); ' G8 x! P; d$ f7 H4 u" s& G4 f/ \/ g# \* o3 b0 {2 ~+ Q O7 z) h7 D/ e RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;2 y% t% s! T0 ]+ b: f1 k RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + Y( S# M* W0 u: X$ T& U/ i" ]1 [ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;: }6 X# ?9 W" U X RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; 5 H* Z4 w2 U( w' s' `2 A$ r HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1); " V, z4 T% |& O K; t: C. @8 Z L. Z __SYSCFG_CLK_ENABLE();$ j! {& }- O t8 l8 O* ` 2 z1 G) _6 u# W- I7 v, F- q } 2 E/ Z$ _# s4 t1 N! B" M- [复制代码 * V g9 Z- ^! F0 Y: o. C3 Q* l" B" Z- ~6 E! z7 N, | 这是标准配置代码,其中PREDiv和PLLMUL的值分别为2和12,这样MCU的工作频率为48M。 + i& {' b! H0 ^+ B/ B. ]测试标准4 J! |4 {! I- _5 B8 h) F0 G 为了检验不同频率下的运行状态,我们通过运行一段代码来判断MCU是否正常工作。 ' K/ w; x! B3 Y9 @- e1 r这里选择TIM2来生成一段PWM波形,通过检测波形参数来判断MCU的工作状态。下面是PWM波形代码,这是一个占空比为50%的方波,频率为1KHZ。2 X) ~4 z- F1 D9 o2 W- F: [, m/ N ) x+ p6 {3 Y& t. L/* TIM2 init function */ * n3 z% q3 q" f1 `9 w ]& B" cvoid MX_TIM2_Init(void) , t" N, m. Y& r# J3 f v' m{/ M* J6 ~& @' s. i( r/ _ & I: L- G) t6 b TIM_ClockConfigTypeDef sClockSourceConfig;' [6 L: O3 Q7 I' P7 A TIM_MasterConfigTypeDef sMasterConfig;- U% y" {9 S6 j TIM_OC_InitTypeDef sConfigOC;$ L8 @8 B# z: `; I 5 _, c& {5 _6 D7 D- r$ R htim2.Instance = TIM2;3 v! W2 F. j% n6 e htim2.Init.Prescaler = 47;3 X( s D3 ]" {2 q8 @& B! Y htim2.Init.CounterMode = TIM_COUNTERMODE_UP;! d3 p$ c2 d5 l8 E3 _6 l7 L( O- H htim2.Init.Period = 999; ' B) C- y2 o& K4 T% j% E3 ~# O htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; ' F8 M( ~- ^% E* V HAL_TIM_Base_Init(&htim2); 9 L1 S6 s' s: g) ~' ?" N% z% f: j" |; [ sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;+ n8 }3 c1 q2 i% i9 w! U! o HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig); . K, j0 t7 z% g y$ s2 e. @1 P8 a, f9 j8 @) S- n9 F& a HAL_TIM_PWM_Init(&htim2);! m$ l) t; ?# W+ a# S* c 1 T# T _; e0 P" p; A sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; 1 _0 S) k$ _& `% M) b' m sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; 3 x0 G( ^6 E& h | HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);1 x# U& A2 F; C+ p % n0 o L- ^& s& `( h sConfigOC.OCMode = TIM_OCMODE_PWM1;# P8 O8 t8 x) `; ]" z# J# } sConfigOC.Pulse = 499; V$ u; c/ I- B' _2 n) K6 } sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;4 I$ k& N1 f2 v6 j% b sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;. ]- s/ E5 b2 w9 A3 \ HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);3 |" C' k" r4 Z! c3 w 8 G" U6 Y0 V/ A. q# A3 h6 ^8 x0 W/ L}$ t* k! k4 \9 V+ A5 V- } 复制代码; N2 o% ?9 B5 [8 W, o' r; h0 B+ I ?1 H ? K! F5 h8 D这是标准48M下的PWM波形 ) i' E. w& J8 P7 n' R 5 J. r# J) N) a( I' G9 q6 T% G由于使用的逻辑分析仪比较渣,所以结果你也将就着看。/ C( w7 m- M; J$ Z6 H! a 超频及测试6 o$ e; f0 I" i) e6 e& h/ a 下面我们开始对MCU进行超频,看看它们各自的PWM波形如何。% i5 w/ B1 Z4 l( K 1. 64M工作频率 + R! P( S9 o- u! i' j5 K7 F0 bPREDIV和PLLMUL的参数分别为:2、16,8/2*16=64M / v3 `6 i6 K. H3 t# P; o: m # x H2 i; _$ S- ?% t' }OK!. ], p$ q. W, I, k( l( S 2. 80M工作频率 4 e% b! F, J N5 M( `9 o8 I. H! a2 PPREDIV和PLLMUL的参数分别为:1、10,8/1*10=80M; v3 U f% I! I7 o- m* e # Z7 _, W; b/ m7 C1 m. e y* {5 ^8 \3. 96M工作频率; q2 H8 j8 R" O% L PREDIV和PLLMUL的参数分别为:1、12,8/1*12=96M . T$ b, E5 s" b" y( x4 k O. v& |1 q0 l0 R. [1 b+ B/ C汗!这正常么?6 U9 A' \; [; L: N3 x* o0 e 再调整PLLMUL的值为13的话,没有波形了,跑飞了么!: p! ]6 T. X7 X1 \' p% r 也就是说,跑到这种程度已达极限了! 0 y: N& ?% y! _: R+ D' \) M 0 m/ n+ Q; o5 U1 z$ E0 k注意: ) j! V5 e! o- }5 S关于测试标准,我没有想到更好的测试方法,如果你有,欢迎探讨!' b1 Z: @" o' q9 G' G 1 _; H2 ?- R% ]* J. Y
0个等待周期的速度为50MHz左右;/ Z1 h. q' K V2 c( B* _
1个等待周期的速度为100MHz左右;9 I, A/ _4 f" \: i; O
2个等待周期的速度为150MHz左右。
48MHz的STM32F072,可以有一个等待周期,速度可以达到100MHz左右。
htim2.Init.Period = 999;3 e# ^$ X9 W0 ]& u6 V3 Y
楼主你选择了内部时钟源,当上面两个值不变的情况下,你超频内部时钟变大,但是没发觉你的PWM波频率变大了啊!
测试一下
预分频器也相应的改了- _$ y1 f% z; i f7 P6 c
测试STM32F103RBT6 超频到140M测试没有发现问题(但电流差不多大了一倍)。再高频率就容易出问题了。
差不多也超了一倍
逻辑分析仪抓的