|
STM32F030F4P6单片机由外部时钟改为内部时钟的步骤; {2 M0 Q3 z2 E, n 一.看程序运行的时候初始化时钟部分:
; ` l2 T3 x3 y! [+ A/ V 二.查看systeminit定义如下:
8 o. z4 S& T, ] c. Q 这就是打开的函数内容 这就是使用外部时钟的配置,也就是库函数的默认配置):static void SetSysClock(void){ __IO uint32_t StartUpCounter = 0, HSEStatus = 0;, N9 W' p7 g6 f- M /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/1 @' n% B0 p6 q /* Enable HSE */ //打开外部时钟开关 RCC->CR |= ((uint32_t)RCC_CR_HSEON);; F! `; f, v& \ y# O% ? " h& W! R3 L7 D, f7 ^% g /* Wait till HSE is ready and if Time out is reached exit *///判断外部时钟是否起振/ S+ C% d7 k% `2 f! O [0 E2 Y do { HSEStatus = RCC->CR & RCC_CR_HSERDY; StartUpCounter++; } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); if ((RCC->CR & RCC_CR_HSERDY) != RESET) {- ~7 f7 d- D; {4 T" R) X: m8 Z HSEStatus = (uint32_t)0x01; } else {; l7 w" k3 F' t1 A9 E! N$ @ HSEStatus = (uint32_t)0x00; } if (HSEStatus == (uint32_t)0x01): k; H: B$ {& V3 a' j4 Y- S- y {" `# }$ p7 Y$ a% M7 _2 @/ O- A /* Enable Prefetch Buffer and set Flash Latency */ //flash总线时钟使能 FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;' ^7 J: T* j+ k& t & J6 D# J+ B" z6 F \* { /* HCLK = SYSCLK *///外设AHB总线时钟等于系统时钟$ _, U" J8 v$ B, j& y9 l0 |; ~9 U RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;9 O; w" Z, U! V' p1 c7 B /* PCLK = HCLK *///外设APB总线时钟等于系统时钟 RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;4 H1 ~* I2 s" y6 w2 z 8 B/ ?; L) w: A /* PLL configuration = HSE * 6 = 48 MHz *///外部时钟6倍频 =系统时钟 RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));( W( o7 x; v9 W" L) ^; F0 Y RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);0 i+ [) z' i* x( m /* Enable PLL *///使能锁相环倍频开关# ~) b4 X. e2 ]: H# v, D RCC->CR |= RCC_CR_PLLON; /* Wait till PLL is ready *///等待锁相环就绪 while((RCC->CR & RCC_CR_PLLRDY) == 0)% [) i4 [! c9 Y* f { }) B1 v I7 U# P* W + x( Q; G- ]* k /* Select PLL as system clock source *///选择锁相环输出时钟作为系统时钟5 J* D( k0 ^! V RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));! c0 r: F+ {; b' O RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; 9 y$ f* N8 g6 x ( z6 s- A% C/ r8 l6 _6 B8 a /* Wait till PLL is used as system clock source *///等待锁相环输出时钟已经成为系统时钟 while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL) { } } else { /* If HSE fails to start-up, the application will have wrong clock p0 r3 E. G. Q9 J5 A" N! w; x configuration. User can add here some code to deal with this error */3 e6 c5 X- C. E J } 7 t9 U$ g2 h, u5 L) l }
3 F6 k1 w$ V" v$ | 四.那么我们就按照上图的结构配置来修改SetSysClock()中的配置即可 采用内部RC时钟作为时钟源,蓝色字体为修改关键处):' }' A( J3 I" P$ b: u2 Y& g8 Kstatic void SetSysClock(void)$ d8 Q4 B( r' A2 C3 p {' W1 d( _' P6 B- [# R3 l __IO uint32_t StartUpCounter = 0, HSIStatus = 0; /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/ /* Enable HSI*/ //使能内部时钟) M. } P" \' w: v RCC->CR |= ((uint32_t)RCC_CR_HSION;- u% P! O7 F" y% p% w' Q6 I1 e; M, K /* Wait till HSI is ready and if Time out is reached exit */ //等待内部时钟起振. I3 G& R( W. `. C do {) E# B: g7 e: ~: Q HSIStatus = RCC->CR & RCC_CR_HSIRDY; `1 g# G# z f( H& d StartUpCounter++; } while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT)); if ((RCC->CR & RCC_CR_HSIRDY) != RESET)6 Q6 @2 _2 V7 a& p1 |; ^: n { HSIStatus = (uint32_t)0x01; } else {: f, E1 J, |& `7 s$ s4 v+ {. j! W HSIStatus = (uint32_t)0x00;/ l2 }, H9 u* W6 u1 M4 P } ) k: g& V3 T0 Q; q/ O, T, l$ _' _* @ 3 _0 N. p( }4 t2 b9 { if (HSIStatus == (uint32_t)0x01) {- n: {; }8 N3 J1 q9 b /* Enable Prefetch Buffer and set Flash Latency */ //flash总线时钟使能) [* T- X) L2 l" } Z FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY; /* HCLK = SYSCLK *///外设AHB总线时钟等于系统时钟! h- V6 P& c k5 P G$ s RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;7 y8 v8 J0 _& x0 w: F$ J6 J, ] I' f; X0 S" O1 S0 L) q /* PCLK = HCLK *///外设APB总线时钟等于系统时钟 RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;9 a# o* v1 u6 } U* l0 W( W" {- U2 o9 m /* PLL configuration = HSI/2 * 12= 48 MHz */ 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> / a* L+ I7 b2 E8 B( V /* Enable PLL *///使能锁相环倍频开关 - ^7 l# e. m9 e9 K3 A RCC->CR |= RCC_CR_PLLON; /* Wait till PLL is ready *///等待锁相环就绪 " B1 K5 r6 a4 y1 u) E& T0 o% m& h while((RCC->CR & RCC_CR_PLLRDY) == 0) {3 y# B5 g' [; }, _. m } /* Select PLL as system clock source *///选择锁相环输出时钟作为系统时钟 RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));- D! ?) f1 L ?7 x& y+ k; ?8 D1 O RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; + X* K W w2 ?! s& ` /* Wait till PLL is used as system clock source *///等待锁相环输出时钟已经成为系统时钟 , Q V6 d* r1 s while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL) { }! g) Q9 F! p. T }4 W6 d: P3 h& P2 F, u8 e. p# F% X else { /* If HSI fails to start-up, the application will have wrong clock # I2 S$ O% i3 D1 l5 }* _ configuration. User can add here some code to deal with this error */. ~ p$ G5 I* `8 K) t } ; k3 C6 v- r1 p) n6 Q' e/ n+ p } # K2 @! k1 J9 f; I |
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
小白也能明白的STM32的低功耗与唤醒机制
STM32系统中2种数据掉电保护的方法
分享STM32F051中文参考手册(重制书签版)
AI工具训练营-用ChatGPT解决HID Keyboard实现的问题
STM32固件库分享,超全系列整理
STM32小白入门指南:从基础到OTA实现方案
STM32超详细学习笔记
新手必看!STM32单片机应该怎么学?
如果你解决了这些问题,就可以直接学STM32
微信公众号
手机版
点评
加超链确实有问题的,最好的方法是去格式在操作,会反馈给技术部门
好的!