系统的时钟可以有3个来源:内部时钟HSI,外部时钟HSE,或者PLL(锁相环模块)的输出。它们由RCC_CFGR寄存器中的SW来选择。
SW(1:0):系统时钟切换
由软件置’1’或清’0’来选择系统时钟源。 在从停止或待机模式中返回时或直接或间接作为系统时钟的HSE出现故障时,由硬件强制选择HSI作为系统时钟(如果时钟安全系统已经启动)
00:HSI作为系统时钟;
01:HSE作为系统时钟;
10:PLL输出作为系统时钟;
11:不可用。
PLL的输出直接送到USB模块,经过适当的分频后得到48M的频率供USB模块使用。
系统时钟的一路被直接送到I2S模块;另一路经过AHB分频后送出,送往各个系统,其中直接送往SDI,FMSC,AHB总线;8分频后作为系统定时器时钟;经过APB1分频分别控制PLK1、定时器TIM2~TIM7;经过APB2分频分别控制PLK2、定时器TIM1~TIM8、再经分频控制ADC;
由此可知,STM32F10x芯片的时钟比之于51、AVR、PIC等8位机要复杂复多,因此,我们立足于对着芯片手册来解读程序,力求知道这些程序代码如何使用,为何这么样使用,如果自己要改,可以修改哪些部分,以便自己使用时可以得心应手。
单步执行,看一看哪些代码被执行了。
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION bit */
RCC-》CR |= (uint32_t)0x00000001;
这是RCC_CR寄存器,由图可见,HSION是其bit 0位。
HSION:内部高速时钟使能
由软件置’1’或清零。
当从待机和停止模式返回或用作系统时钟的外部4-25MHz时钟发生故障时,该位由硬件置’1’来启动内部8MHz的RC振荡器。当内部8MHz时钟被直接或间接地用作或被选择将要作为系统时钟时,该位不能被清零。
0:内部8MHz时钟关闭;
1:内部8MHz时钟开启。
///
/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
RCC-》CFGR &= (uint32_t)0xF8FF0000;
这是RCC_CFGR寄存器
该行程序清零了MC0[2:0]这三位,和ADCPRE[1:0],ppre2[2:0],PPRE1[2:0],HPRE[3:0],SWS[1:0]和SW[1:0]这16位。
/*
MCO: 微控制器时钟输出,由软件置’1’或清零。
0xx:没有时钟输出;
100:系统时钟(SYSCLK)输出;
101:内部8MHz的RC振荡器时钟输出;
110:外部4-25MHz振荡器时钟输出;
111:PLL时钟2分频后输出。
*/
/* Reset HSEON, CSSON and PLLON bits */
RCC-》CR &= (uint32_t)0xFEF6FFFF;
清零了PLLON,HSEBYP,HSERDY这3位。
/* Reset HSEBYP bit */
RCC-》CR &= (uint32_t)0xFFFBFFFF;
清零了HSEBYP位 ///???为什么不一次写??
HSEBYP:外部高速时钟旁路,在调试模式下由软件置’1’或清零来旁路外部晶体振荡器。只有在外部4-25MHz振荡器关闭的情况下,才能写入该位。
0:外部4-25MHz振荡器没有旁路;
1:外部4-25MHz外部晶体振荡器被旁路。
所以要先清HSEON位,再清该位。
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
RCC-》CFGR &= (uint32_t)0xFF80FFFF;
清零了:USBPRE,PLLMUL,PLLXTPR,PLLSRC共7位
/* Disable all interrupts and clear pending bits */
RCC-》CIR = 0x009F0000;
这个暂不解读
SetSysClock();
系统的时钟可以有3个来源 - 工程师STM32单片机学习基础
最新推荐文章于 2024-09-20 21:14:31 发布