这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 有关于STM32系统时钟初始化

共10条 1/1 1 跳转至

有关于STM32系统时钟初始化

高工
2013-09-08 16:02:20     打赏

    在基于STM32的3.5版本库函数的开发应用中,其时钟初始化函数SystemInit()函数是在启动文件中被调用的,而且其调用是在Main()函数之前,所以说,如果不打算修改其默认的系统时钟(sysclk72M,AHB 72M,PCLK1  36M,PCLK2  72M,PLL 72M),在main函数中可以不添加系统时钟初始化函数SystemInit()函数,其在相应的函数文件中已经被设置好了。

    如果要对系统时钟进行重新设置,可以在main()函数中对其进行重新配置,也就回到了较早版本的ST开发库的应用之中,现举例如下:

1、以外部高速晶振为时钟源

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作为系统时钟 */  

}

}


2.以内部高速晶振为时钟源(可在外部晶振损坏时采用,精度稍低,之前有同志问到过这个问题,现在此给出

void RCC_HSI_Configuration(void){

   RCC_DeInit(); /*将外设RCC寄存器重设为缺省值 */

  RCC_HSICmd(ENABLE);

  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)== RESET);//等待HSI就绪

  RCC_HCLKConfig(RCC_SYSCLK_Div1);

  RCC_PCLK2Config(RCC_HCLK_Div1);

  RCC_PCLK1Config(RCC_HCLK_Div2);

  FLASH_SetLatency(FLASH_Latency_2);

  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);

 while(RCC_GetSYSCLKSource() != 0x00);     /*0x00:HSI作为系统时钟 */

}




关键词: STM32     系统时钟初始化    

高工
2013-09-08 16:07:05     打赏
2楼

小弟帮着补充一下啦,如果系统不用72M可以在这里修改

#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


高工
2013-09-08 16:54:55     打赏
3楼
3Q,楼主热心啊

菜鸟
2014-04-07 18:02:25     打赏
4楼
顺便问一下,那个systick的默认时钟是那个了。谢谢

高工
2014-04-07 20:19:15     打赏
5楼
Systick时钟源选择  (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟) ST使用的是HCLK

高工
2014-04-07 20:23:43     打赏
6楼
The RCC feeds the Cortex System Timer (SysTick) external clock with the AHB clock (HCLK) divided by 8. The SysTick can work either with this clock or with the Cortex clock (HCLK), configurable in the SysTick Control and Status Register.

高工
2014-04-07 20:23:43     打赏
7楼
The RCC feeds the Cortex System Timer (SysTick) external clock with the AHB clock (HCLK) divided by 8. The SysTick can work either with this clock or with the Cortex clock (HCLK), configurable in the SysTick Control and Status Register.

高工
2014-04-07 20:24:17     打赏
8楼

Cortex‐M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。


高工
2014-04-07 20:25:44     打赏
9楼

Cotex-M3里的一段话:

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。


高工
2014-04-07 20:32:54     打赏
10楼

stm32的systick通过少数的程序设置,当使用systick_config()函数之后,其载入值就是你的参数,并且自动打开中断,并将中断设为最低的优先级,将其时钟设为HCLK即系统时钟72mhz,并重置计数寄存器开始计数。也可以将时钟设置为HCKL的八分频,通过使用SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) 紧跟在systick_config()之后,而改变优先级则使用NVIC_SetPriority(SysTick_IRQn,...) 函数,而时基单元的设置使用如下公式,Reload Value = SysTick Counter Clock (Hz) x  Desired Time base (s)  Reload Value 就是传递进去的参数。但参数不能超过0xFFFFFF。

systick的时钟,systick的时钟包括内部时钟和外部时钟,对于stm32 其内部时钟FCLK就是AHB的时钟,72MHz,外部时钟就是8分频后的时钟,9MHz。因此使用systick_config()函数时其默认时钟为72MHz。

使用systick延时的时候也可以不开启中断,而直接对其寄存器进行读写.


共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]