历史上的今天
今天是:2025年01月09日(星期四)
2019年01月09日 | STM32学习笔记一一时钟系统
2019-01-09 来源:eefocus
一、系统架构:

二、时钟树:


STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。
①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。
②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。 倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
2. 系统时钟SYSCLK可来源于三个时钟源:
①、HSI振荡器时钟
②、HSE振荡器时钟
③、PLL时钟
3.STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL 输出的2分频、HSI、HSE、或者系统时钟。这个时钟可以用来给外部其他系统提供时钟源。
用户可通过多个预分频器配置AHB总线、高速APB2总线和低速APB1总线的频率。AHB和APB2域的最大频率是72MHZ。APB1域的最大允许频率是36MHZ。SDIO接口的时钟频率固定为HCLK/2。
4.系统时钟SYSCLK
它是供STM32中绝大部分部件工作的时钟源,它可选择为PLL输出、HSI或者HSE,(一般程序中采用PLL倍频到72Mhz)在选择时钟源前注意要判断目标时钟源是否已经稳定振荡。Max=72MHz,它分为2路,1路送给I2S2、I2S3使用的I2S2CLK,I2S3CLK;另外1路通过AHB分频器分频(1/2/4/8/16/64/128/256/512)分频后送给以下8大模块使用:
①送给SDIO使用的SDIOCLK时钟。
②送给FSMC使用的FSMCCLK时钟。
③送给AHB总线、内核、内存和DMA使用的HCLK时钟。
④通过8分频后送给Cortex的系统定时器时钟(SysTick)。
⑤直接送给Cortex的空闲运行时钟FCLK。
⑥送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer2-7)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4、5、6、7使用。
⑦送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer1、Timer8)1、2倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1和定时器8使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后得到ADCCLK时钟送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。
⑧2分频后送给SDIO AHB接口使用(HCLK/2)。
5.时钟输出的使能控制
在以上的时钟输出中有很多是带使能控制的,如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等。当需要使用某模块时,必需先使能对应的时钟。需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。
连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、 Timer2、Timer3、Timer4。注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。USB模块工作的时钟应该是由APB1提供的。
连接在APB2(高速外设)上的设备有:GPIO_A-E、USART1、ADC1、ADC2、ADC3、TIM1、TIM8、SPI1、AFIO;
6.重新配置系统时钟源以及时钟
void RCC_PLL_Configuration(void)
{
RCC_DeInit(); /*将外设RCC寄存器重设为缺省值 */
RCC_HSEConfig(RCC_HSE_ON); /*设置外部高速晶振(HSE) HSE晶振打开(ON)*/
if(RCC_WaitForHSEStartUp() == SUCCESS) { /*等待HSE起振, SUCCESS:HSE晶振稳定且就绪*/
RCC_HCLKConfig(RCC_SYSCLK_Div1); /*设置AHB时钟(HCLK) RCC_SYSCLK_Div1——AHB时钟 = 系统时*/
RCC_PCLK2Config(RCC_HCLK_Div1); /* 设置高速AHB时钟(PCLK2)RCC_HCLK_Div1——APB2时钟 = HCLK*/
RCC_PCLK1Config(RCC_HCLK_Div2); /*设置低速AHB时钟(PCLK1)RCC_HCLK_Div2——APB1时钟 = HCLK / 2*/
FLASH_SetLatency(FLASH_Latency_2); /*设置FLASH存储器延时时钟周期数FLASH_Latency_2 2延时周期*/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /*选择FLASH预取指缓存的模,预取指缓存使能*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_3);/*设置PLL时钟源及倍频系数*/
RCC_PLLCmd(ENABLE); /*使能PLL */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ; /*检查指定的RCC标志位(PLL准备好标志)设置与否*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /*设置系统时钟(SYSCLK) */
while(RCC_GetSYSCLKSource() != 0x08); /*0x08:PLL作为系统时钟 */
}
}
参考:
1.STM32中文参考手册_V10
2.STM32的时钟系统
3.关于STM32时钟系统
4. STM32 时钟系统
上一篇:STM32学习笔记一一独立看门狗
下一篇:STM32学习笔记一一外部中断
史海拾趣
|
今天刚买回来的东东。 THK十字滑台 1000 THK Z轴滑块 100 Z轴丝杆 50 ta8435h 8X3 sanyo 57电机 30X3 连轴器 15X3 bosch 680W 2800r/min电磨 80 电路板 热转印 … 查看全部问答> |
|
在2416上运行裸机程序,同样一套硬件和软件。现在发现的问题是:启动运行程序,触摸屏上同一个点上点击多次,每次的采样值相差不大;但是重新启动程序后(掉电后启动或者ReLoad都是同样情况),该点的采样值相对上一次运行变动较大。也 ...… 查看全部问答> |
|
现在板子上只上了一个晶振,xt2接的是1.8432m的晶振。32k的没有接。下面是我的程序,不知道为什么,程序下载都没有问题,但是do while那个地方时而能过时而不能过,总的来说能过的机会要少一些。(dco状态是正常的) 大家帮忙分析下子? #include ...… 查看全部问答> |
|
1.PCB走线的电感是1mm长度1nH,在高频时注意不要忽略这个电感量 2.反馈走线越短越好,注意不能收到干扰,沿路不能有开关(或高频)的走线,若有条件,把它夹在两个地之间 3.靠近IC的正负极放一个100nF的滤波电容 4.大电流的走线尽量短 5.控制电 ...… 查看全部问答> |
|
ADC12中ADC12SHT0是设置采样时间间隔的,请问这个时间间隔的大小是根据什么来设置的?它最大为1024个ADC12CLK,最小为4个ADC12CLK,能随便设置吗? [ 本帖最后由 wstt 于 2013-1-4 14:56 编辑 ]… 查看全部问答> |
|
所处的工作一般不会涉及到PC与单片机的通信,故而觉得单片机与单片机之间的通信没有必要深入去学?MCU之间用高低电平控制就可以了,一般会应用到哪些实用方面啊??… 查看全部问答> |
|
内容提要 作者以自己1985年在Bell实验室时发表的一篇论文为基础,结合自己的工作经验扩展成为这本对C程序员具有珍贵价值的经典著作。写作本书的出发点不是要批判C语言,而是要帮助C程序员绕过编程过程中的陷阱和障碍。 全书分为8章,分别从词法分 ...… 查看全部问答> |




