基础——内部RC振荡电路、外部晶振、RCC、RTC

1 定义

单片机内部是不会放晶振的,只有RC振荡器

1.1 RC振荡器

在振荡电路中的频率选择部分可以只用电阻R和电容C构成。 这种只用电阻和电容构成的振荡器称为RC振荡器 。


1.2 晶振

只要在晶体板极上施加交变电压,就会使晶片产生机械变形振动,此现象即所谓逆压电效应。当外加电压频率等于晶体谐振器的固有频率时,就会发生压电谐振,从而导致机械变形的振幅突然增大。

2 各自优缺点

2.1 RC振荡器

优点是实现的成本比较低,毕竟就是一个电阻电容。缺点是由于电阻电容的精度问题所以RC振荡器的震荡频率会有误差,同时受到温度、湿度的影响,这个跟元器件的工艺有关。

2.2 晶体振荡器

优点是相对来说震荡频率一般都比较稳定。缺点的话就是价格要稍微高点了,还有用晶体振荡器一般还需要接两个 15-33pF起振电容。

一般单片机中很少用RC振荡器,可能在实验室环境会用,而在实际的工程、工业上很少用到,常用的也就是晶体振荡器。因为很多时候单片机需要一个精度的机器周期作定时、通讯等用途,如果震荡频率不准的话对产品的功能是有很大影响的。

3 RTC

RTC(Real-Time Clock)即实时时钟,目前实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。任何实时时钟的核心都是晶振,此时晶振的作用是提供基准频率,频率为32.768kHz。相比较晶振只可以产生稳定的频率,实时时钟是以输入频率做基础,再依此作除频、倍频、PLL等等,产生出处理器与主板各部分所需的频率。

RTC是单片机的实时时钟,它需要时钟源,stm32中32 kHz 低速内部 RC (LSI RC),可选择提供给 RTC 用于停机/待机模式下的自动唤醒。32.768 kHz 低速外部晶振(LSE 晶振),用于驱动 RTC 时钟 (RTCCLK)。

4 RCC

Reset and clock control (RCC),即复位与时钟控制,主要是通过寄存器配置时钟源。

5 STM32的时钟源

有五个时钟源,为HSIHSELSILSEPLL:

HSI是高速内部时钟,RC振荡器,频率为8MHz。

HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

LSI是低速内部时钟,RC振荡器,频率为40kHz。

LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

【注】:

从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。

即当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APBx的频率;当 APBx的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APBx的频率两倍。

假设系统时钟频率160M,初始化 APB 的时钟为 4分频,所以 APB 的时钟为 160/4=40M, 而从 STM32的内部时钟树图得知:当 APB的时钟分频数为 1 的时候, 某些TIM 的时钟为 APB的时钟,而如果 APB1 的时钟分频数不为 1,那么这些定时器的时钟频率将为 APB时钟的两倍。

 

HAL库中可以使用RCC_ClkInitTypeDef结构体来初始化系统时钟,同时可以使用RCC_OscInitTypeDef结构体来初始化外部晶振内部振荡器。在初始化时,可以设置首选的时钟源和备用时钟源,以及在首选时钟源失效时自动切换到备用时钟源。 具体来说,可以先初始化外部晶振,然后在初始化时钟时设置外部晶振为首选时钟源,内部振荡器为备用时钟源。如果外部晶振失效,系统会自动切换到内部振荡器。 以下代码示例展示了如何使用HAL库来初始化系统时钟并设置外部晶振为首选时钟源: ``` RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; // 初始化外部晶振 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { // 外部晶振初始化失败 while(1); } // 初始化时钟 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { // 时钟初始化失败 while(1); } ``` 在上述代码中,我们首先使用RCC_OscInitStruct结构体初始化外部晶振,然后将其设置为PLL时钟源,并在RCC_ClkInitStruct结构体中将其设置为首选时钟源。如果在初始化时外部晶振失效,系统会自动切换到内部振荡器。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值