STM32F030F4P6单片机由外部时钟改为内部时钟的步骤 * a# j6 e3 N3 D. J3 ?/ b 一.看程序运行的时候初始化时钟部分: $ A, t4 Y5 g+ m3 u/ \9 z( V 二.查看systeminit定义如下: % }# [5 ^0 a% Y+ `! o: |7 @( c) F+ a % @5 o* m) F# M |" _- }1 T5 G 这就是打开的函数内容这就是使用外部时钟的配置,也就是库函数的默认配置):static void SetSysClock(void)1 o$ t3 K* `* s8 {& T; H2 `: Y { __IO uint32_t StartUpCounter = 0, HSEStatus = 0;2 B2 j3 f( D2 F9 O" X 9 H! z8 w% @9 a, f9 `1 d% Y4 N* m /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/; @% G5 E' i+ u9 U9 Y% F /* Enable HSE */ //打开外部时钟开关 RCC->CR |= ((uint32_t)RCC_CR_HSEON);% l3 o/ |3 p$ V - T' @. j4 e) Z, p /* Wait till HSE is ready and if Time out is reached exit *///判断外部时钟是否起振1 U0 {" l- H! |; o( l do/ a2 ?3 t2 L: _0 \: w { HSEStatus = RCC->CR & RCC_CR_HSERDY;/ s" x: e7 P3 i- T+ v( g StartUpCounter++; } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); ' n/ F) {1 _/ e' G7 C2 q if ((RCC->CR & RCC_CR_HSERDY) != RESET)' l, z$ D2 I% [: O% C, Z& I9 q { HSEStatus = (uint32_t)0x01;, a6 K! b9 q' {( Q# m3 R7 z } else" Q- U' \9 o4 x u {* Z1 H( j, w' G; |- ]6 {6 ` HSEStatus = (uint32_t)0x00; } . H8 W' ~- G: E3 Q$ [4 o if (HSEStatus == (uint32_t)0x01); H' Z- w" \( r" ~2 h { /* Enable Prefetch Buffer and set Flash Latency */ //flash总线时钟使能 FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;+ O! }# i$ N( N /* HCLK = SYSCLK *///外设AHB总线时钟等于系统时钟" b8 Y! x, Y- g$ ]- J- N RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;4 s' ?4 ^# I9 C2 X3 ]! [ / Z$ E" i" s+ A- P! [ /* PCLK = HCLK *///外设APB总线时钟等于系统时钟 RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;4 H, b0 p7 i8 V! m ; r) D( u- _; d P /* PLL configuration = HSE * 6 = 48 MHz *///外部时钟6倍频 =系统时钟& ]0 Z5 i) A" H& W( N RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6); . e3 M; p" g. ? /* Enable PLL *///使能锁相环倍频开关 RCC->CR |= RCC_CR_PLLON;6 T4 Y* V: K+ k) M f [. J3 ` /* Wait till PLL is ready *///等待锁相环就绪 while((RCC->CR & RCC_CR_PLLRDY) == 0)) v! l! x0 J5 e/ ] m3 d { } ! K0 \7 n9 t5 S$ a6 l: z2 n( e& C /* Select PLL as system clock source *///选择锁相环输出时钟作为系统时钟 RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; ) |3 I* K) ^/ z' E8 Y5 F . V0 U) \9 i6 x /* Wait till PLL is used as system clock source *///等待锁相环输出时钟已经成为系统时钟 while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)2 S& b5 q; q: c3 V2 R { }4 ^: _2 ?7 H# [# S! W } else { /* If HSE fails to start-up, the application will have wrong clock configuration. User can add here some code to deal with this error */ } 1 d' I. n8 Q P1 Q. q5 E }+ w$ D( a% ]) F1 R1 u) ]; |4 T
( s; m- r$ D5 q 四.那么我们就按照上图的结构配置来修改SetSysClock()中的配置即可采用内部RC时钟作为时钟源,蓝色字体为修改关键处):, W g) D# z1 Z0 e# [$ g static void SetSysClock(void) { __IO uint32_t StartUpCounter = 0, HSIStatus = 0; : n, e- J* D# y* J* H" j /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/ q/ X. q7 y+ Q' E /* Enable HSI*/ //使能内部时钟 RCC->CR |= ((uint32_t)RCC_CR_HSION;( @ @, O7 q( Z# @1 {1 d /* Wait till HSI is ready and if Time out is reached exit */ //等待内部时钟起振 do {8 P/ n C& v$ ~2 _ HSIStatus = RCC->CR & RCC_CR_HSIRDY; StartUpCounter++; } while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));7 c. \$ G) G! K- ]+ b3 ` if ((RCC->CR & RCC_CR_HSIRDY) != RESET)+ a/ l, s* {! b5 c- h { HSIStatus = (uint32_t)0x01;' T# e7 x7 ?. C! i8 B; x } else { HSIStatus = (uint32_t)0x00; } & N, Y7 Y: a8 I: y if (HSIStatus == (uint32_t)0x01) { /* Enable Prefetch Buffer and set Flash Latency */ //flash总线时钟使能 FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;- c5 T8 V k. c: s) H , ^" w7 |$ A2 Z; W+ p+ J4 X /* HCLK = SYSCLK *///外设AHB总线时钟等于系统时钟 RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;8 Q; k U5 f( @7 t- [$ C: W/ u + l4 \0 l8 L: A- E/ | /* PCLK = HCLK *///外设APB总线时钟等于系统时钟* h7 b9 `1 g2 U8 x$ q+ W" D RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1; 8 [& V4 d' P1 p( ? /* PLL configuration = HSI/2 * 12= 48 MHz */# Y# x6 f$ u: j+ t! G$ a0 N RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL)); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12); //RC时钟2分频后 进行12倍频</font>% q4 W# V6 Q, }0 K! C3 k; k! z : ?* N9 p( T/ `* Z+ x r6 _1 K7 F /* Enable PLL *///使能锁相环倍频开关 RCC->CR |= RCC_CR_PLLON; /* Wait till PLL is ready *///等待锁相环就绪 while((RCC->CR & RCC_CR_PLLRDY) == 0) {+ J* K9 {2 Q; W. B( r }, M2 q, Y. P8 l# M( a7 V /* Select PLL as system clock source *///选择锁相环输出时钟作为系统时钟 + d4 p4 T/ x) T4 E" G' C! ^" k RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));; s" z9 O6 W9 y- N4 I* Z" o RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; 9 @) g" ?, d4 L% @ /* Wait till PLL is used as system clock source *///等待锁相环输出时钟已经成为系统时钟 while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)2 d* u. l5 j7 @ w' c {7 z! Z/ e$ v2 n7 j8 t, C }3 ?& t; T' \1 M }/ F! y! }: Q- u: M1 p. C# L5 J else { /* If HSI fails to start-up, the application will have wrong clock 2 h0 l9 l' X( L7 R8 Y8 X% W configuration. User can add here some code to deal with this error */, I: s3 ~: X' j6 x. N" {1 X : Y' H% C2 Y3 _4 o- ]* j9 u6 h% s } }
9 A$ M) v1 Q- }- j, v( D* J ! u3 Y. q+ B2 y5 i. M( Y% z |
三创电子(Tcreate)-STM32F030核心板代码
STM32F0 ADC(DMA中断)多通道,注释超详细
FreeRTOS在STM32F030上的移植
STM32固件库分享,超全系列整理
基于STM32移植而引发的疑问经验分享
分享STM32F051中文参考手册(重制书签版)
游名:STM32F0+Trinamic智能步进驱动芯片TMC5160(最高20A)参考原...
【MCU实战经验】+STM32F030的步进电机加减速
STM32F0的中文技术参考手册(标签处理过)
基于STM32F030硬件SPI经验分享
点评
加超链确实有问题的,最好的方法是去格式在操作,会反馈给技术部门
好的!