STM32F103XX时钟
三种不同的时钟源可被用来驱动系统时钟(SYSCLK):
-
HSI振荡器时钟:系统时钟;由内部8MHz的RC振荡器产生,启动时间比HSE晶体振荡器短。即使在校准之后它的时钟频率精度仍较差。
-
HSE振荡器时钟:3~25Mz外部振荡器可为系统提供非常精确的主时钟。
-
PLL时钟主PLL以下述时钟源之一为输入,产生倍频的输出:
-
-
HSI时钟除以2
-
HSE或通过一个可配置分频器的PLL2时钟
-
这些设备有以下2种二级时钟源:
● 40kHz低速内部RC(LSI RC)振荡器,可以用于驱动独立看门狗,或通过程序选择驱动RTC,用于从停机/待机模式下自动唤醒系统。
● 也可以通过程序选择32.768kHz低速外部晶体(LSE晶体)用来驱动RTC(RTCCLK)。 当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。
时钟树
初始时钟:
系统复位后,HSI振荡器被选为系统时钟。当时钟源被直接或通过PLL间接作为系统时钟时,它将不能被停止。 只有当目标时钟源准备就绪了(经过启动稳定阶段的延迟或PLL稳定),从一个时钟源到另一个时钟源的切换才会发生。在被选择时钟源没有就绪时,系统时钟的切换不会发生。直至目标时钟源就绪,才发生切换。 在时钟控制寄存器(RCC_CR)里的状态位指示哪个时钟已经准备好了,哪个时钟目前被用作系统时钟。
多工程协作,赋值给变量用位或,防止其他位数据被篡改。
配置72MHZ
-
1.配置振荡器类型 HSE打开(8MHz时钟源,检查是否稳定)HSEON,HSE预分频;打开PLL,PLL的时钟源设置为HSE(检查是否切换成功),PLL倍频值为9。
-
配置系统时钟源SYSCLK(设置PLL作为系统时钟源(检查时钟源是否切换成功,作为系统时钟源是否已经稳定))、 AHB、 APB1和 APB2的分频设置。物理连接,C13连接F103C8T6的灯,时钟切换成功,代码执行速度变快,灯闪烁会变快。
#define RCC_BASE_addr 0X40021000 #define GPIOB_BASE_addr 0X40010C00 #define GPIOC_BASE_addr 0X40011000 #define GPIOE_BASE_addr 0X40011800 #define FLASH_BASE_addr 0X40022000 #define flash (*(unsigned int *)(FLASH_BASE_addr)) typedef struct{ volatile unsigned int CR; volatile unsigned int CFGR; volatile unsigned int CIR; volatile unsigned int APB2RSTR; volatile unsigned int APB1RSTR; volatile unsigned int AHBENR; volatile unsigned int APB2ENR; volatile unsigned int APB1ENR; volatile unsigned int BDCR; volatile unsigned int CSR; }RCC; RCC *RCC72=(RCC*)(RCC_BASE_addr); // // RCC72->CR|=1<<16;//打开HSE时钟 // int a=0; // // do//检测HSE工作状态 // { // a=0; // a=((RCC72->CR>>17)&1); // }while(!a); // GPIO_B->ODR|=(1<<5); // //delayus(10); // // RCC72->CFGR|=1<<1;//PLL输出作为系统时钟; do//检测切换成功 { //a=0; a=((RCC72->CFGR>>2)&0x2); if(a==0x2) { break; } }while(1); // // delayus(10); // // RCC72->CFGR&=~(1<<7); //AHB预分频 (AHB Prescaler)置0SYSCLK不分频 // RCC72->CFGR|=(4<<8); //低速APB预分频(APB1)HCLK不分频 // RCC72->CFGR&=~(1<<13); //高速APB预分频(APB2) (APB high-speed prescaler (APB2)) // RCC72->CFGR|=(1<<16); //置1HSE时钟作为PLL输入时钟。 // RCC72->CFGR&=~(1<<17); //置零HSE不分频 // RCC72->CFGR|=(7<<18); //PLL倍频系数PLL 9倍频输出 // RCC72->CFGR|=(7<<24); //微控制器时钟输出 (Microcontroller clock output)PLL时钟2分频后输出。 // RCC72->CR|=1<<24; //PLL使能 // flash=0x2;