STM32 HAL库学习(五)RCC时钟树分析

开发板采用STM32F070RB,最大时钟速率为48MHZ,在STM32Cube MX中可以选择对应的芯片,得到它的时钟树如下所示:

分析时钟树,几种主要的时钟源分析如下

1、SYSCLK系统时钟的时钟源

          —— 8MHZ HSI内部晶振

          —— 8MHZ HSE外部晶振

          —— PLLCLK(来源于倍频后的HSI或HSE)

2、RTC实时时钟的时钟源

           —— HSE晶振32分频  250KHZ

           —— LSE 外部低速晶振 32.768KHZ

           —— LSI 内部低速晶振 40KHZ

3、USB时钟源

           ——  HSI内部晶振倍频

           ——  HSE外部晶振倍频(更准确)

4、ADC时钟源

           ——  HSI14RC  14MHZ

           ——  APB时钟2分频或4分频

5、 USART1时钟源

           —— SYSCLK

           —— HSI

           —— LSE

            —— PCLK1即APB1

6、MCO时钟输出引脚(PA8)

      ——  PLLCLK、HSI、HSI14、HSE、LSI、LSE、SYSCLK

7、挂靠AHB高速总线的设备

      —— CPU、DMA、GPIO等

8、挂靠APB低速时钟线的设备

      —— USART、TIM等

时钟配置中有一个Enable CSS,即允许Clock security system,如果使能宏变量 _HAL_RCC_CSS_ENABLE()或者在Cube MX中配置了Enable CSS,则当HSE时钟启用失败时,系统会自动切换到HSI作为时钟源,并产生一个NMI不可屏蔽中断。

 

STM32 RCC HAL库驱动主要在stm32f0xx_hal_rcc.c/h中

  —— HAL_RCC_DeInit主要完成整个系统时钟的复位

  —— HAL_RCC_OscConfig则根据RCC_OscInitStruct结构体的值对晶振进行初始化(HSE、HSI、LSI、LSE、HSI14、HSI48、PLL)

           如果要通过这个函数实现HSI/HSE从打开到旁路(或旁路到打开)的转换,必须先关闭HSI/HSE

   —— HAL_RCC_ClockConfig初始化CPU、AHB和APB时钟

   —— HAL_RCC_MCOConfig选择MCO管脚输出的时钟源

   —— HAL_RCC_GetSysClockFreq获取当前的SYSCLK时钟频率

   —— HAL_RCC_EnableCSS/HAL_RCC_DisableCSS系统始终安全,选择HSE作为时钟源时可配置

   —— HAL_RCC_NMI_IRQHandler处理RCC CSS中断,回调函数HAL_RCC_CSSCallback()可供用户重写

 

时钟的旁路模式,即不启用内部时钟驱动组件,直接引用外部时钟源,关于这点。这个博客上有很详细的说明:https://blog.csdn.net/wuyusheng314/article/details/78947096

好的,关于STM32HAL库时钟配置,我可以给你一些简单的介绍: 在使用STM32HAL库时,需要先对芯片的时钟进行配置,以确保正确的时钟频率和时钟源。 1. 配置时钟源:根据芯片型号和应用场景选择合适的时钟源,包括内部RC振荡器、外部晶体振荡器、PLL等。 2. 配置时钟分频器:根据需要对时钟频率进行分频,以得到所需的系统时钟、总线时钟和外设时钟等。 3. 配置时钟使能:使能所需的时钟源和分频器,以确保时钟系统正常工作。 关于具体的代码实现,你可以参考STM32HAL库提供的时钟配置函数,如下所示: ``` /* 配置时钟源为外部晶体振荡器 */ RCC_OscInitTypeDef RCC_OscInitStruct; 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; HAL_RCC_OscConfig(&RCC_OscInitStruct); /* 配置时钟分频器和使能外设时钟 */ RCC_ClkInitTypeDef RCC_ClkInitStruct; 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; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); ``` 以上只是一个简单的示例,具体的实现要根据应用场景和芯片型号进行调整。如果你需要更详细的信息,可以参考STM32HAL库的官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值