在以上的时钟输出中有很多是带使能控制的,如AHB 总线时钟、内核时钟、各种APB1外设时钟、APB2 外设时钟等。
当需要使用某模块时,必须先使能对应的时钟。需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,
否则它的倍频值就为2。
连接在APB1上的设备(低速外设)有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看
门狗、Timer2、Timer3、Timer4。注意:USB模块虽然需要一个单独的48MHz时钟信号,但它不能供USB模块工作的时
钟,而只是提供给串行接口引擎(SIE)使用的时钟。USB模块工作的时钟应该是由APB1提供的。
连接在APB2上的设备(高速外设)有:GPIO-A-E、USART1、ADC1、ADC2、ADC3、TIM1、TIM8、SPI1、AFIO。
以下是时钟设置的基本流程。
假设,使用HSE时钟,并且使用ST的固件库函数,那么在程序中设置时钟参数的流程如下。
第一步:
将RCC寄存器重新设置为默认值,即调用函数RCC-DeInit;
第2部
打开外部高速时钟晶振HSE,调用函数RCC-HSEConfig(RCC-HSE-ON);
第3步
等待外部高速时钟晶振工作,调用HSEStartUpStatus=RCC-WaitForHSEStartUpO;
第四步
设置AHB时钟,即调用函数RCC-HCLKConfig;
第五步
设置高速AHB时钟,即调用函数RCC-PCLK2Config;
第6步
设置低速AHB时钟,即调用函数RCC-PCLK1Config;
第7步
设置PLL,即调用函数RCC-PLLConfig;
第8步
打开PLL,即调用函数RCC-PLLCmd(ENABLE);
第9步
等待PLL工作,while(PCC-GetFLagStatus(PCC-FLAG-PLLRDY)==RESET);
第10步
设置系统时钟,即调用函数PCC-SYSCLKConfig;
第11步
判断PLL是否是系统时钟,while(RCC-GetSYSCLKSource()!=0x08);
第12步
打开要使用的外设时钟,即调用函数RCC-APB2PeriphCLockCmd();或者PCC-APB1PeriphClockCmd)();