时钟"/>
8、使用HSE\HSI配置时钟
RCC :reset clock control 复位和时钟控制器。时钟控制和时钟寄存器很重要,不同的芯片对于不同总线的时钟配置也不一定完全一样。。
三种不同的时钟源可被用来驱动系统时钟(SYSCLK):
● HSI振荡器时钟- high speed internal oscillator clock
● HSE振荡器时钟- high speed external oscillator clock
● PLL时钟 - Phase Locked Loop锁相环倍频,用于将低频时钟配置成倍数的高频时钟
1、HSE时钟
HSE时钟:high speed external clock signal
来源:有源晶振(1-50M,从OSC_IN口进入,得到HSE)、无源晶振(4-26M)
控制:RCC_CR时钟控制寄存器(32位)的位16:HSEON控制
2、HSI时钟
HSI时钟:high speed internal clock signal
来源:芯片内部,大小为8M,当HSE出现故障时,系统会自动切换到HSI,直到HSE启动成功。
控制:RCC_CR时钟控制寄存器的位0,:HSION控制
3、锁相环时钟PLLclk
锁相环时钟:
Phase Locked Loop Clock
来源:HSI,HSE,由时钟配置寄存器(RCC_CFGR) 的PLLSRC位配置,通常选择HSE(HSI精度不够高)。
控制:RCC_PLLCFGR:RCC_PLL配置寄存器
PLL48CK为USB_FS、RANG、SDIO提供时钟。
系统时钟
系统时钟:SYSCLK,最高为72MHz
来源:以上三种时钟
时钟配置
系统开始启动文件stratup_stm32f10x_hd.s 中对系统初始化IMPORT SystemInit
,即定义在system_stm32f10x.c中的void SystemInit (void)
,这个函数最后一行就调用了SetSysClock();
对系统时钟进行配置。static void SetSysClock(void)
也包含在system_stm32f10x.c文件中,默认为72M
在static void SetSysClock(void);
中定义了许多宏,如果手动定义了SYSCLK_FREQ_HSE
,系统时钟配置为HSE,也可以配置系统时钟为PLLclk,只需要手动定义SYSCLK_FREQ_24MHz
等等;如果以上都没有定义,则系统时钟默认为8*9=72M
按照系统时钟不同的来源,在时钟树分成三条线路
1、HSE作系统时钟
直接选择 HSE作为系统时钟信号源。
再配置AHB分频因子为1,得到HCLK,72M;设置APB1总线分频因子为2,得到PCLK1,36M;设置APB2总线分频因子为1,得到PCLK2,72M。
2、HSE(HSI)选作锁相环时钟
外部HSE(8M),经过PLLXTPRE(不分频),选为锁相环PLL的输入时钟,配置锁相环倍频因子(2-16)为9倍,得到锁相环时钟72M,然后把锁相环时钟配置为系统时钟72M。然后和1后面相同。
3、HSI作系统时钟
直接选择 HSI作为系统时钟信号源。然后和1后面相同。
随意配置PLL倍频为系统时钟
设计思路
1、复位RCC寄存器到默认值
2、使能HSE,等待稳定,确定HSE启动成功
3、使能FLASH预取值,设置FLASH等待周期
4、配置AHB,APB2,APB1这三条总线的分频因子
5、选择锁相环的时钟源,倍频因子
6、使能锁相环,等待其稳定
7、选择锁相环时钟为系统时钟,读取相关状态位,等待转换完成
具体代码如下:
void HSE_SetSysClk(uint32_t RCC_PLLMul)
{__IO uint32_t StartUpCounter = 0, HSEStatus = 0;/* 复位RCC寄存器到默认值 */ RCC_DeInit();//使能RCC_HSEConfig(RCC_HSE_ON);/*等待HSE稳定*/HSEStatus = RCC_WaitForHSEStartUp(); //返回success和error/* HSE启动成功 */if(HSEStatus == SUCCESS){
/***************************************************************************//* 使能预取值 */FLASH->ACR |= FLASH_ACR_PRFTBE;/* FLASH等待时间 */FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
/***************************************************************************/ /*配置分频因子*/RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_SYSCLK_Div2);RCC_PCLK2Config(RCC_SYSCLK_Div1); /* 选择PLL的时钟源头,配置PLLDL的倍频因子*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul); //最高稳定工作在72MHz,这里8*9=72M,超频,大于9即可 /* 使能PLL */RCC_PLLCmd(ENABLE); /* 等待PLL稳定 */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //当PLL标志位为SET=1时,循环,不为1时,结束循环 /*选择PLL为系统时钟*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 等待P系统时钟稳定*/while(RCC_GetSYSCLKSource() != 0x09); }else{/* HSE启动失败(晶振坏了,对应电容坏了,硬件问题),用户可以在这里添加处理错误的代码*/}
}
除了查看系统时钟对流水灯刷新频率对应系统时钟的改变之外,还可以主时钟输出SYSCLK,用示波器接PA8引脚输出口查看其波形,幅值,频率。
更多推荐
8、使用HSE\HSI配置时钟
发布评论