时钟源有3路:高速内部时钟(HSI)、低速内部时钟(LSI)、外部高速时钟(HSE)。 1. HSI: 内部 RC 振荡器,8MHz,可以提供给所有的模块 2. LSI: 内部低速RC振荡器,32KHz,仅提供给RTC,WDG,SPM(系统电源管理) 3. HSE: 外部晶体振荡器,4MHz-30MHz,一般选择8MHz。没有提供给SPM,所以如果要使用SPM则需要使能LSI? 当使用HSE时,分3种情况,第一种是使用外部晶体振荡器,第二种是使用外部时钟源,即通过OSC_IN脚输入时钟源,第三种是使用外部时钟源且不使用内部的PLL电路。下图中路径1对应第一、二种情况,路径2对应第三种情况。 对应的代码如下,其中SetXOSCClock对应HSE的第二种情况,SetHSEClock对应HSE的第一种情况,SetHSEBYPClock对应HSE的第三种情况。 void SetSysClock(void) { #if AC78XX_CLOCK_SRC == IC_CLOCK_SRC_XOSC SetXOSCClock(); #elif AC78XX_CLOCK_SRC == IC_CLOCK_SRC_HSI SetHSIClock(); #elif AC78XX_CLOCK_SRC == IC_CLOCK_SRC_HSE SetHSEClock(); #else SetHSEBYPClock(); #endif } 如何使能LSI没找到说明。 系统时钟SYSCLK: 输入频率:支持 4 ~ 30Mhz。 PREDIV:有效值1/2/4,PLL 输入频率推荐值不小于 8M(PLL输入频率 = 输入频率 / PREDIV,所以不建议用8M以下的晶体?) FBKDIV:推荐值为 72, 80, 96,128, 144, 160, 192 VCO:VCO = 输入频率 * FBKDIV/ PREDIV,VCO 的频率范围是 0.5~1.5GHz; POSDIV:有效值1/2/4,VCO 频率除以 POSDIV 不能高于 400MHz PLLCLK_DIV:有效值1-16,程序并没有设置,默认为1。API函数为voidCKGEN_SetPllDiv(uint8_t div),参数范围为0-15。 SYSCLK_DIV:有效值1/2/4/8/16/64/128/256/512。 以使用外部晶体为例 void SetHSEClock(void) { SPM_EnableXOSC(1); //使能外部频率源 CKGEN_SetPLLReference(PLL_REF_EXTERNAL_OSC); //PLL输入源为外部晶振 CKGEN_SetPllPrevDiv(PLL_PREDIV); //设置PREDIV CKGEN_SetPllPostDiv(PLL_POSDIV); //设置POSDIV CKGEN_SetPllFeedbackDiv(PLL_FBKDIV); //设置FBKDIV SPM_EnablePLL(1); //使能PLL CKGEN_SetSysclkDiv(SYSCLK_DIV); //设置SYSCLK_DIV CKGEN_SetSysclkSrc(SYSCLK_SRC_PLL_OUTPUT); //选择PLL作为系统时钟源 } 目前官方例程的配置SYSCLK为96MHz。 AHB时钟(高级高性能总线时钟): AHB时钟提供给内核(CM3的意思应该是内核)/DMA/SPIn/GPIO/CRC/eflash/sflash/CANn。 文档和代码中并没有找到AHB_DIV的配置,估计是AHB_DIV=1,即AHB的频率等于SYSCLK。当前配置为96MHz。 APB时钟(高级外设总线时钟) APB时钟提供给UARTn/LIN/TIMER/ACMP/IICn/PWMn/PWDT/CTU/ADC。APB时钟的源是AHB时钟,设置APB_DIV的API函数是void CKGEN_SetAPBClockDivider(APBCLK_DIVIDERdiv) ,分频参数范围1/ 2/4/8/16。现在的设置是2,即APB的频率为48MHz。 注意:各个模块的频率源可能是可以复选的,具体看应用。比如SPI的频率源可以是AHB,也可以是APB(注意,文档和代码中并没有找到配置SPI时钟源的说明,看代码只能用APB时钟作为SPI的时钟源)
|