8、使用HSE\HSI配置时钟

编程入门 行业动态 更新时间:2024-10-26 20:34:07

8、使用HSE\HSI配置<a href=https://www.elefans.com/category/jswz/34/1769919.html style=时钟"/>

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配置时钟

本文发布于:2024-03-05 14:34:50,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1712560.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:时钟   HSE   HSI

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!