stm32时钟选择与配置HSL HSE PLL

编程入门 行业动态 更新时间:2024-10-26 22:19:20

stm32<a href=https://www.elefans.com/category/jswz/34/1769919.html style=时钟选择与配置HSL HSE PLL"/>

stm32时钟选择与配置HSL HSE PLL

1. stm32时钟源分析

stm32f4有四个时钟源可供选择,分别是:
HSE(外部高速),HSI(内部高速), LSE(外部低速), LSL(内部低速)。

1.1 外部时钟源一般由外挂晶振产生

LSE为32.767KHz晶振输入。
HSE为8MHz或16MHz,实验用的是16MHz

1.2 内部时钟源一般为内部RC震荡电路

LSI 为内部32.767KHz的RC电路
HSI 为内部16MHz的RC电路

2. stm32时钟源配置

 四个时钟源中,只有HSI和HSE能作为整个系统的时钟源,LSI和LSE只作为看门狗,RTC及外部输出的时钟源。
 HSI和HSE频率都不高,所以ARM设计了PLL(锁相环)来进行倍频,把HSI和HSE频率拉高到百兆以上。所以能为整个系统提供时钟源的就多了个PLL的高速时钟源。
 下面来分别讨论这三个时钟源的配置过程。

2.1 stm32高速内部时钟源HSI配置

 HSI时钟是内部时钟源,系统复位后会自动选择这个时钟源,所以复位后,根据时钟图可以看到,system clock和PLL输入时钟都为16MHz。具体代码如下:

void SystemInit(void)
{  /* Reset the RCC clock configuration to the default reset state ------------*//* Set HSION bit */RCC->CR |= (uint32_t)0x00000001;/* Reset CFGR register */RCC->CFGR = 0x00000000;/* Reset HSEON, CSSON and PLLON bits */RCC->CR &= (uint32_t)0xFEF6FFFF;/* Reset PLLCFGR register */RCC->PLLCFGR = 0x24003010;/* Reset HSEBYP bit */RCC->CR &= (uint32_t)0xFFFBFFFF;/* Disable all interrupts */RCC->CIR = 0x00000000;/* Configure the Vector Table location add offset address ------------------*/SCB->VTOR = FLASH_BASE | 0x00 ; /* Vector Table Relocation in Internal FLASH */
} 

2.2 stm32高速外部时钟源HSE配置

 HSE为外部晶振,需要手动进行配置,系统复位后HSI首先工作,如需使用外部HSE时,要通过寄存器选择,进行切换即可,外部晶振产生的时钟要比内部电路产生的时钟精度高很多,所以一般都会选外部时钟。配置过程如下:

void SystemInit(void){/* Reset the RCC clock configuration to the default reset state ------------*/RCC->CR  = (uint32_t)0x00000001;  //reset RCC->CR  |= (uint32_t)(1<<16);  //open HSE while((RCC->CR & (uint32_t)(1<<17))==0) ;   //wait for HSE work SCB->VTOR = FLASH_BASE | (0x00); /* Vector Table Relocation in Internal FLASH */}

2.3 stm32高速PLL时钟配置

 高速PLL时钟的设置稍微复杂一点,根据PLL倍频计算公式,首先设置好PLLM,PLLN,PLLQ,经过倍频公式:
PLL_output_clk = PLL_input_clk × (PLLN ÷ PLLM) ÷ PLLQ
就可以获得输出的频率,当然这些参数需在使能PLL前进行设置。

 这里必须要注意一个点:那就是在切换system clock之前,必须配置I-Cache D-Cache以及Latency,否则PLL是设置不成功的。因为system clock由16MHz这样的低速切换到60MHz以上的高速时钟时候,会影响到指令和数据读取总线时序,所以在切换时钟之前必须设置好Latency。具体Latency数值参考下图:

void SystemInit(void){/* Reset the RCC clock configuration to the default reset state ------------*/RCC->CR  = (uint32_t)0x00000001;  //reset RCC->CR  |= (uint32_t)(1<<16);  //open HSE while((RCC->CR & (uint32_t)(1<<17))==0) ;   //wait for HSE work RCC->PLLCFGR |= (uint32_t)(1<<22); //select HSE as PLL source clock   HSECLK is 16MHzRCC->PLLCFGR |= (uint32_t)(16<<0);  //select PLLM==16 RCC->PLLCFGR |= (uint32_t)(192<<6);  //select PLLN==192   VCOCLK= HSECLK*(PLLN/PLLM)=16*(192/16)=192 RCC->PLLCFGR |= (uint32_t)(3<<24);  //set PLLQ==3   PLLVOUTCLK = VCOCLK/PLLQ= 192/3 = 64MHz RCC->CR |= (uint32_t)(1<<24);  //open PLLwhile((RCC->CR & (uint32_t)(1<<25))==0) ; //wait for PLL work FLASH->ACR |=(9<<1)|(10<<1)|(0<<2); //enable I-Cache  D-Cache and 2 LatencyRCC->CFGR |= (uint32_t)(2<<0);  //select PLL as the system clockwhile((RCC->CFGR & (2<<2))==0); //wait the PLL clockRCC->CFGR |= (uint32_t)(0<<4); //AHB presc is 1  AHBCLK=64MHzRCC->CFGR |= (uint32_t)(4<<10); //APB1 presc is 2 APB1CLK=32MHzRCC->CFGR |= (uint32_t)(4<<13); //APB2 presc is 2  APB2CLK=32MHzSCB->VTOR = FLASH_BASE | (0x00); /* Vector Table Relocation in Internal FLASH */}

SCB->VTOR表示中断向量表位于flash起始地址出,说明我们boot选择的是从flash启动,如需从ram启动这里需要修改地址,这个内容后续再讨论。

3. 结论

一般情况下,设置HSE为时钟源,并配置启动PLL进行倍频,并将PLL选为system clock的时钟源。这样能达到系统最大性能。

更多推荐

stm32时钟选择与配置HSL HSE PLL

本文发布于:2024-03-05 14:35:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1712561.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:时钟   HSL   PLL   HSE

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!