stm32时钟设置函数

这里涉及到一个很重要的寄存器,时钟配置寄存器:RCC_CFGR

 1 #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
 2 /* #define SYSCLK_FREQ_HSE    HSE_VALUE */
 3  #define SYSCLK_FREQ_24MHz  24000000
 4 #else
 5 /* #define SYSCLK_FREQ_HSE    HSE_VALUE */
 6 /* #define SYSCLK_FREQ_24MHz  24000000 */
 7 /* #define SYSCLK_FREQ_36MHz  36000000 */
 8 /* #define SYSCLK_FREQ_48MHz  48000000 */
 9 /* #define SYSCLK_FREQ_56MHz  56000000 */
10 #define SYSCLK_FREQ_72MHz  72000000
11 #endif
 1 /**
 2   * @brief  Setup the microcontroller system
 3   *         Initialize the Embedded Flash Interface, the PLL and update the
 4   *         SystemCoreClock variable.
 5   * @note   This function should be used only after reset.
 6   * @param  None
 7   * @retval None
 8   */
 9 void SystemInit (void)
10 {
11   /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
12   /* Set HSION bit */
13   RCC->CR |= (uint32_t)0x00000001;
14
15   /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
16 #ifndef STM32F10X_CL
17   RCC->CFGR &= (uint32_t)0xF8FF0000;
18 #else
19   RCC->CFGR &= (uint32_t)0xF0FF0000;
20 #endif /* STM32F10X_CL */
21
22   /* Reset HSEON, CSSON and PLLON bits */
23   RCC->CR &= (uint32_t)0xFEF6FFFF;
24
25   /* Reset HSEBYP bit */
26   RCC->CR &= (uint32_t)0xFFFBFFFF;
27
28   /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
29   RCC->CFGR &= (uint32_t)0xFF80FFFF;
30
31 #ifdef STM32F10X_CL
32   /* Reset PLL2ON and PLL3ON bits */
33   RCC->CR &= (uint32_t)0xEBFFFFFF;
34
35   /* Disable all interrupts and clear pending bits  */
36   RCC->CIR = 0x00FF0000;
37
38   /* Reset CFGR2 register */
39   RCC->CFGR2 = 0x00000000;
40 #elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
41   /* Disable all interrupts and clear pending bits  */
42   RCC->CIR = 0x009F0000;
43
44   /* Reset CFGR2 register */
45   RCC->CFGR2 = 0x00000000;
46 #else
47   /* Disable all interrupts and clear pending bits  */
48   RCC->CIR = 0x009F0000;
49 #endif /* STM32F10X_CL */
50
51 #if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
52   #ifdef DATA_IN_ExtSRAM
53     SystemInit_ExtMemCtl();
54   #endif /* DATA_IN_ExtSRAM */
55 #endif
56
57   /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
58   /* Configure the Flash Latency cycles and enable prefetch buffer */
59   SetSysClock();
60
61 #ifdef VECT_TAB_SRAM
62   SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
63 #else
64   SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
65 #endif
66 }
/**
  * @brief  Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.
  * @param  None
  * @retval None
  */
static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
  SetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHz
  SetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHz
  SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
  SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
  SetSysClockTo56();
#elif defined SYSCLK_FREQ_72MHz
  SetSysClockTo72();
#endif
  1 /**
  2   * @brief  Sets System clock frequency to 72MHz and configure HCLK, PCLK2
  3   *         and PCLK1 prescalers.
  4   * @note   This function should be used only after reset.
  5   * @param  None
  6   * @retval None
  7   */
  8 static void SetSysClockTo72(void)
  9 {
 10   __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
 11
 12   /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
 13   /* Enable HSE */
 14   RCC->CR |= ((uint32_t)RCC_CR_HSEON);
 15
 16   /* Wait till HSE is ready and if Time out is reached exit */
 17   do
 18   {
 19     HSEStatus = RCC->CR & RCC_CR_HSERDY;
 20     StartUpCounter++;
 21   } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
 22
 23   if ((RCC->CR & RCC_CR_HSERDY) != RESET)
 24   {
 25     HSEStatus = (uint32_t)0x01;
 26   }
 27   else
 28   {
 29     HSEStatus = (uint32_t)0x00;
 30   }
 31
 32   if (HSEStatus == (uint32_t)0x01)
 33   {
 34     /* Enable Prefetch Buffer */
 35     FLASH->ACR |= FLASH_ACR_PRFTBE;
 36
 37     /* Flash 2 wait state */
 38     FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
 39     FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
 40
 41
 42     /* HCLK = SYSCLK */
 43     RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
 44
 45     /* PCLK2 = HCLK */
 46     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
 47
 48     /* PCLK1 = HCLK */
 49     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
 50
 51 #ifdef STM32F10X_CL
 52     /* Configure PLLs ------------------------------------------------------*/
 53     /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
 54     /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
 55
 56     RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
 57                               RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
 58     RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
 59                              RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
 60
 61     /* Enable PLL2 */
 62     RCC->CR |= RCC_CR_PLL2ON;
 63     /* Wait till PLL2 is ready */
 64     while((RCC->CR & RCC_CR_PLL2RDY) == 0)
 65     {
 66     }
 67
 68
 69     /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
 70     RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
 71     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
 72                             RCC_CFGR_PLLMULL9);
 73 #else
 74     /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
 75     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
 76                                         RCC_CFGR_PLLMULL));
 77     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
 78 #endif /* STM32F10X_CL */
 79
 80     /* Enable PLL */
 81     RCC->CR |= RCC_CR_PLLON;
 82
 83     /* Wait till PLL is ready */
 84     while((RCC->CR & RCC_CR_PLLRDY) == 0)
 85     {
 86     }
 87
 88     /* Select PLL as system clock source */
 89     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
 90     RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
 91
 92     /* Wait till PLL is used as system clock source */
 93     while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
 94     {
 95     }
 96   }
 97   else
 98   { /* If HSE fails to start-up, the application will have wrong clock
 99          configuration. User can add here some code to deal with this error */
100   }
101 }
时间: 2024-08-25 13:39:00

stm32时钟设置函数的相关文章

STM32内部时钟设置-寄存器版

STM32寄存器版本--内部时钟设置 同时要记得把延时初始化函数设置好 1 //系统时钟初始化函数 2 //pll:选择的倍频数,从2开始,最大值为16 3 //pll:选择的倍频数,这里使用内部时钟,PLL为4就是4分频 4 void Stm32_Clock_Init(u8 PLL) 5 { 6 unsigned char temp=0; 7 MYRCC_DeInit(); //复位并配置向量表 8 // RCC->CR|=0x00010000; //外部高速时钟使能HSEON 9 RCC->

STM32中断管理函数

CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置.但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分. STM32 有76 个中断,包括16 个内核中断和60 个可屏蔽中断,具有16 级可编程的中断优先级. 而我们常用的就是这60 个可屏蔽中断,所以我们就只针对这60 个可屏蔽中断进行介绍. 在 MDK 内,与NVIC 相关的寄存器,MDK 为其定义了如下的结构体: typedef struct { vu32 I

关于STM32时钟系统

初学STM32,感觉最蛋疼的是它的时钟系统,每次看到它的那个时钟树就有点晕,虽然看了很多这方面的资料,甚至也已经写过很多STM32的模块代码,做过一些小项目,但一直还是对这一块模模糊糊,似懂非懂,所以想把自己对它的一点点认识写出来,一步一步,直到完全搞通的那一天,(这些内容并非自己原创,只是想帮助自己理解) 在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. HSI是高速内部时钟,RC振荡器,频率为8MHz. HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频

STM32时钟系统

一.在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. ①HSI是高速内部时钟,RC振荡器,频率为8MHz. ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz.一般接8MHZ. ③LSI是低速内部时钟,RC振荡器,频率为40kHz. ④LSE是低速外部时钟,接频率为32.768kHz的石英晶体. ⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2.HSE或者HSE/2.倍频可选择为2~16倍,但是其输出频率最大不得超过72

(转)stm32时钟分析

原文传送门 在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. 其实是四个时钟源,如下图所示(灰蓝色),PLL是由锁相环电路倍频得到PLL时钟. ①.HSI是高速内部时钟,RC振荡器,频率为8MHz. ②.HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz. ③.LSI是低速内部时钟,RC振荡器,频率为40kHz. ④.LSE是低速外部时钟,接频率为32.768kHz的石英晶体. ⑤.PLL为锁相环倍频输出,其时钟输入源可选择为HS

stm32时钟分析

文章来源:http://blog.chinaunix.net/uid-21658993-id-3129667.html 在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. 其实是四个时钟源,如下图所示(灰蓝色),PLL是由锁相环电路倍频得到PLL时钟. ①.HSI是高速内部时钟,RC振荡器,频率为8MHz. ②.HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz. ③.LSI是低速内部时钟,RC振荡器,频率为40kHz. ④.LSE

STM32时钟配置方法

一.在STM32中,有五个时钟源,为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. 二.在

Linux硬件时钟和系统时钟设置

Linux时钟分为系统时钟(System Clock)和硬件时钟(Real Time Clock,简称RTC).系统时钟是指当前Linux Kernel中的时钟:而硬件时钟则是主板上由电池供电的时钟,硬件时钟可以在BIOS中进行设置.当Linux启动时,系统时钟会去读取硬件时钟的设置,然后系统时钟就会独立于硬件时钟运作. Linux关于时间的设置的shell命令有date和hwclock两种: 嵌入式s3c6410 ARM开发板中Linux时间设置: 1. date  -- 用来读取或设置系统时

stm32时钟初探

stm32时钟初探 在STM32中,有五个时钟源,为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倍,但是其输出频率最大不得超过72