STM32的SYSCLK(系统时钟)可由三种不同的时钟源来驱动,分别是HSI振荡器时钟、HSE振荡器时钟、PLL时钟。这些设备还拥有2种二级时钟源:
1、低速内部RC(LSI RC)振荡器,频率在30~60KHZ之间变化,为了方便计算我们一般估算为40KHZ,它主要为独立看门狗提供时钟源,或通过相关寄存器配置驱动RTC(RTCCLK),用于从停机/待机模式下自动唤醒系统。
2、使用32.768KHZ的低速外部晶体时钟来驱动RTC(RTCCLK)。
为减小功耗,STM32的任一时钟源都可以独立地开启或关闭。
注意:1、当HSI(高速内部时钟)作为PLL时钟输入时,SYSCLK得到的最大频率为36MHZ(有些写的是64MHZ)。SDIO接口的时钟频率固定为HCLK/2。
2、AHB、高速APB(APB2)域的最大频率是72MHZ; 低速APB(APB1)域的最大频率是36MHZ,所以在配置由APB1提供时钟的外设时要特别留意。
3、RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SYSTick)的外部 时钟,当然SYSTICK的时钟也可通过相关寄存器来获得。
4、ADC时钟由高速APB2时钟经2、4、6、8分频后获得。
定时器在STM32中起着举足轻重的地位,学不好定时器就相当于没有学过STM32单片机。所以定时器的频率设置就显得尤为重要,其频率分频由硬件按以下2种情况自动设置:
1、如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致。
2、否则,定时器的时钟频率被设为与其相连的APB总线频率的2倍。
例:若AHB的时钟为72MHZ,因为APB1的时钟最大只能为36MHZ,所以APB1的预分频值不能为1,假设为2,则APB1=36MHZ时钟,则定时器2~7的时钟就为72MHZ。
以上介绍时钟主要来自系统时钟SYSCLK,其它请参考STM32官方参考手册。
高速外部时钟(HSE)
时钟来源:HSE外部时钟:它由 外部提供时钟(50%占空比的方波、正弦波、三角波)连接到输入端,同时要保证OSC_OUT端口悬空,输入最高频率50MHZ。
HSE外部晶体/陶瓷谐振器:3~25MHZ外部振荡器为系统提供精确的主时钟,在电路设计时为了减少时钟输出的失真和缩短启动稳定时间,晶振和负载电容必须尽可能的靠近振荡器引脚,连接线路时不要打过孔,最好进行包地处理。负载电容值必须根据所选的振荡器来调整。
晶振的负载电容=[(c1*c2)/(c1+c2)]+(4~6)pf的杂散电容;c1,c2为旁路电容。
高速内部时钟(HSI)
HSI时钟信号由内部8MHZ的RC震荡器产生,可直接作为系统时钟或2分频后作为PLL输入。在外部无时钟或HSE失效时,HSI时钟会作为备用时钟源自动切换,但时钟精度稍差。
低速外部时钟(LSE)
由一个外部的32.768khz低速晶体或陶瓷谐振器提供,主要为实时时钟或其他定时器功能提供一个低功耗且精确的时钟源。
低速内部时钟(LSI)
它可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟,时钟频率在(30KHZ和60KHZ之间)。
时钟初始化过程:
1、设置时钟配置为初始值
2、开启外部时钟,等待外部时钟配置是否成功;
成功:设置PLL输入时钟
失败:开启内部时钟
3、配置AHB、APB2、APB1、HCLK、PCLK2、PCLK1等
4、使能PLL时钟,如果PLL作为了SYSCLK,它将不能被失能
5、等待PLL时钟是否就绪。
6、将PLL作为系统时钟,等待就绪。
7、开启外设时钟
8、设置优先级分组
这里采用V3.5库函数版本,MDK4.7;STM32F103ZET6
s32 STM32_CLOCK_Init(void)
{
u32 Err=STM_ERR;
ErrorStatus HSEStartUpStatus;
u32 i=0;
/* Deinitialize the RCC registers */
RCC_DeInit();
//打开外部时钟,失败则选内部时钟
/* Enable the HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready and if Time out is reached exit */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
//PLLCLK=16MHZ*2=32MHZ
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_2);
Err=STM_TRUE;
}
else
{
/* Enable Internal High Speed oscillator */
RCC_HSICmd(ENABLE);
//PLLCLK=8MHZ/2*8=32MHZ
RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_8);
Err=0x60000001;
}
/* Configure HCLK such as HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB==系统时钟
/* Configure PCLK2 such as PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);//APB2==HCLK
/* Configure PCLK1 such as PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);//APB1==HCLK/2
/* Configure the Latency cycle: Set 2 Latency cycles */
FLASH_SetLatency(FLASH_Latency_2);//存储器取值延时2个周期
/* Enable The Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Enable the PLL */
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)
{
i++;
if(0xffff<=i)
{
Err=0x60000002;
break;
}
}
/* Select the PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
i=0;
while(RCC_GetSYSCLKSource()!=0x08)
{
i++;
if(0xffff<=i)
{
Err=0x60000003;
break;
}
}
RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
/* Configure the Priority Grouping with 1 bit */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
return Err;
}
在库函数V3.5以后,在不配置系统时钟的情况下,默认为72MHZ。从startup_stm32f10x_hd.s中可以看出:
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
在复位产生之后,系统首先运行SystemInit(),然后在执行main函数。而在system_stm32f10x.c中默认外部时钟为8M,设置为72MHZ,但在实际中如果我们使用大于8MHZ的外部时钟时,系统时钟依旧为72MHZ。如果想
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE HSE_VALUE */
#define SYSCLK_FREQ_24MHz 24000000
#else
/* #define SYSCLK_FREQ_HSE HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz 24000000 */
/* #define SYSCLK_FREQ_36MHz 36000000 */
/* #define SYSCLK_FREQ_48MHz 48000000 */
/* #define SYSCLK_FREQ_56MHz 56000000 */
#define SYSCLK_FREQ_72MHz 72000000
#endif
上一篇:cJson移植到STM32系统
下一篇:STM32时钟问题(重点)
推荐阅读最新更新时间:2024-11-10 10:28
设计资源 培训 开发板 精华推荐
- 【搜集令】晒晒你收藏的经典模拟电路!!!
- 晒出TI C2000的使用经验或优秀设计作品!
- NI白皮书下载《如何克服复杂待测设备的生产测试挑战》
- 【EEWORLD第二十七届】2011年06月社区明星人物揭晓!
- 有奖直播:Microchip适用于CryptoAuthentication™系列的可信任平台
- Intel最新物联网解决方案,抢先阅读,下载有惊喜
- 是德科技直播 | 小探头,大学问,别让探头拖累你的测试结果!
- 有奖直播|安森美图像传感器,助力汽车、机器视觉和人工智能领域发展
- 盛夏狂欢,与Microchip一起探索时钟与时序之旅 轻松答问题~赢奖品
- 力源&安森美有奖直播:RSL15 - 安森美更高效更智能更安全的 BLE 5.2 蓝牙芯片