时钟源:
时钟源为系统时钟提供原始频率信号,系统时钟则通过(分频、倍频、选择器)成为整个芯片的“主时钟”,驱动 CPU 内核、总线(AHB、APB)及外设的运行。
- 内部时钟源:
- HSI(高速内部时钟):64 MHz,配合 PLL1 用于系统时钟。
- HSI48(高速内部时钟):48 MHz,HSI48 是内部高精度时钟源,频率为 48Mhz,配合 CRS 可以直接作为 USB 的时钟源使用。
- CSI(低功耗内部时钟):4 MHz
- LSI(低速内部时钟):32 kHz
- 外部时钟源:
- HSE(高速外部时钟):4-48 MHz(通常使用25 MHz的外部晶振)
- LSE(低速外部时钟):32.768 kHz
- PLL配置: 通过 PLL1 可以将时钟频率提升到最高 400 MHz,用于系统时钟(SYSCLK)。
PLL1 锁相环,该 PLL 主要用到两路输出:pll1_p_ck 和 pll1_q_ck,
pll1_p_ck 一般用于 SYSCLK 的时钟源,最终作为 CPU、 SysTick、 AXI、 AHB1~4 和 APB1~4 等的时钟源;
pll1_q_ck 则可以通过 PKSU 选择作为部分外设的内核时钟( perx_ker_ck),如 FMC、 QSPI、SDMMC1/2 等。
时钟源在芯片中的划分和使用:
- System时钟:系统时钟通常是最高频率的时钟源,用于整个微控制器的核心和外设时钟,包括CPU时钟、外设总线( APB、AHB 或 AXI)、存储器等,它决定了系统的整体运行速度。系统时钟一般用HSI(高速内部时钟)HSE(高速外部时钟)PLL(锁相环)。
- RTC时钟:主要负责时间和日期的保持,即使在系统断电时也能继续运行。它通常用于日历、闹钟和自动唤醒功能。RTC时钟一般用LSE(低速外部时钟)LSI(低速内部时钟)。
- D1 域,是高性能域,包括 CPU、SysTick、AXI、AHB3 和 APB3等时钟,CPU 可以从 TCM 和 Cache 中提取紧急的或优先级较高的用户程序,在 400M 的主频下执行,确保实现最快速响应。
- D2 域,通信接口域,包括 AHB1、AHB2、APB1 和 APB2 等时钟,定时器的时钟都是在 D2 域进行控制。此域主要进行数据通信工作,减轻 CPU 的负担。
- D3 域,数据批处理域,包括 AHB4 和 APB4 等时钟,此部分中的 ADC 可以在整个系统深度休眠时仍然进行数据处理。在电池驱动的情况下,D3 可以保证在低功耗条件下仍然进行必要的数据处理工作。
定时器:
- SysTick:为操作系统(如 FreeRTOS)提供周期性中断(称为滴答中断),用于任务调度。是 ARM Cortex-M 内核的内置定时器,其时钟源通常直接取自 SYSCLK(或 SYSCLK 的分频)。
- 定时器分为基本定时器(Basic)、通用定时器(General-purpose)、高级定时器(Advanced)和低功耗定时器(LPTIM)
- 系统时钟(SYSCLK)驱动 CPU 内核和所有定时器:外设定时器(基本、通用、高级)的时钟 并非直接来自 SYSCLK,而是通过 APB 总线时钟间接驱动。
- APB 分频系数 = 1:APB 时钟 = SYSCLK。
- APB 分频系数 ≠1(如 2/4/8):APB 时钟 = SYSCLK / 分频系数,但定时器时钟自动 ×2。
- 基本定时器(Basic):仅支持内部时钟,无输入/输出,只能生成周期性中断或触发信号。(类似“闹钟”)比如定时触发 DAC 输出更新,用于非精确延时需求。
- 通用定时器(General-purpose):测量外部信号的脉冲宽度或频率,输入捕获:测量外部信号的脉冲宽度或频率,输出比较:生成 PWM 波形。
- 高级定时器(Advanced):用于高精度时间,比如以太网时间同步IEEE1588,提供高精度时钟源(如100 MHz),驱动ETH的系统时间计数器。
- 定时器的使用要根据总线连接的外设的频率来设计:
- 系统时钟(SYSCLK)驱动 CPU 内核和所有定时器:外设定时器(基本、通用、高级)的时钟 并非直接来自 SYSCLK,而是通过 APB 总线时钟间接驱动。
举例 QSPI 总线说明:
1. 使用 HSE(高速外部时钟)RCC_HSE_ON 作为时钟源,频率为 25 MHZ,如果设置 CPU 的频率为 400 MHZ,也就是 pll1_p_ck 输出 400 MHZ,需要设置 PLL1 的分频系数,DIVM1=5, DIVN1=160, DIVP1=2。计算公式如下:
2. CPU的频率是 400 MHZ,操作系统的滴答时钟也是 400 MHZ。
3. 对于通信接口 QSPI,它属于 D1 域的 AHB3 - RCC_AHB3ENR_QSPIEN 总线,我设置 AHB3 的分频系数 RCC_HCLK_DIV2 是 2,所以 AHB3总线的频率是 200 MHZ。(具体根据现实需要设置,要考虑到整个D1域的AHB3频率)
4. 因为 W25Q256 Q-FLASH 最大支持 104 MHZ 的时钟,所以我们需要将 AHB3 总线进行二分频,也就是 QSPI_Handler.Init.ClockPrescaler 等于 1,所以此时 QSPI 的速率是 100 MHZ。
5. 100 MHZ 的 QSPI 总线,他的周期是 1 / (100*10000000) = 10 ns,也就是每个上升沿的周期是 10 ns;片选 QSPI_CS_HIGH_TIME_5_CYCLE 高电平时间为5个时钟(10*5=50ns),即手册里面的 tSHSL 参数(为了确保QSPI接口在数据传输过程中有足够的时间进行片选信号的切换和稳定)