/******************************************************************************* * Function Name : RCC_Configuration * Description : Configures the different system clocks. * Input : None * Output : None * Return : None *******************************************************************************/ void RCC_Configuration(void) { /* RCC system reset(for debug purpose) */ RCC_DeInit(); /* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON); /* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08) { } } /* Enable GPIO_LED clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_LED, ENABLE); }
void RCC_init() { // Drop all previous settings of rcc RCC_DeInit(); RCC_PLLCmd(DISABLE); RCC_PLLConfig(RCC_PLLSource_HSI, 25, 300, 2, 7); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08); RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div4); RCC_PCLK1Config(RCC_HCLK_Div4); }
// Configure System Clock void SYSCLK_Configuration(void) { // Stop RCC RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); // turn HSE on // detect status of HSE ErrorStatus HSEStartUpStatus; HSEStartUpStatus = RCC_WaitForHSEStartUp(); if (HSEStartUpStatus = SUCCESS) { /* Flash 2 wait state */ FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; // Disable the PLL RCC_PLLCmd(DISABLE); // Divide HCLK by 2 RCC_HCLKConfig(RCC_SYSCLK_Div2); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div1); // DIV2 //RCC->CFGR |= RCC_CFGR_PLLXTPRE; // 0111: PLL input clock x 9 RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9); // Enable the PLL RCC_PLLCmd(ENABLE); // Poll until the PLL is ready while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // Select PLLCLK as SYSCLK source RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Poll until PLLCLK is slected as SYSCLK while(RCC_GetSYSCLKSource() != 0x08); } else for(;;); }
/***************************************************************************** * Function Name : RCC_Configuration * Description : Reset and Clock Control configuration * Input : None * Output : None * Return : None ******************************************************************************/ void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; /* Reset the RCC clock configuration to default reset state */ RCC_DeInit(); /* Configure the High Speed External oscillator */ RCC_HSEConfig(RCC_HSE_ON); /* Wait for HSE start-up */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* Set the code latency value: FLASH Two Latency cycles */ FLASH_SetLatency(FLASH_Latency_2); /* Configure the AHB clock(HCLK): HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* Configure the High Speed APB2 clcok(PCLK2): PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* Configure the Low Speed APB1 clock(PCLK1): PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* Configure the PLL clock source and multiplication factor */ /* PLLCLK = HSE*PLLMul = 8*9 = 72MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Check whether the specified RCC flag is set or not */ /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Get System Clock Source */ /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08); } }
void RCC_Internal_Configuration(void) { ErrorStatus HSEStartUpStatus; //将外设 RCC寄存器重设为缺省值 RCC_DeInit(); RCC_HSICmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); if(HSEStartUpStatus == SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); //设置 PLL 时钟源及倍频系数 RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_2); //使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能 //等待指定的 RCC 标志位设置成功 等待PLL初始化成功 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //设置系统时钟(SYSCLK) 设置PLL为系统时钟源 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //等待PLL成功用作于系统时钟的时钟源 // 0x00:HSI 作为系统时钟 // 0x04:HSE作为系统时钟 // 0x08:PLL作为系统时钟 while(RCC_GetSYSCLKSource() != 0x08); } }
void fastMode() { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); if (RCC_WaitForHSEStartUp() == ERROR) { return; } RCC_PLLConfig(RCC_PLLSource_HSE, 8, 336, 2, 15); RCC_PLLCmd(ENABLE); RCC_WaitForPLLSturtUp(); RCC_HCLKConfig(RCC_SYSCLK_Div4); RCC_PCLK1Config(RCC_HCLK_Div1); RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); }
void Sys_Clock_Init(void) { ErrorStatus HSEStartUpStatus; RCC_DeInit(); // /* RCC system reset(for debug purpose) 重置了RCC的设置*/ RCC_HSEConfig(RCC_HSE_ON); /* Enable HSE */ /* 使能外部高速晶振 */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* Wait till HSE is ready 等待高速晶振稳定*/ if(HSEStartUpStatus == SUCCESS) { // FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* Enable Prefetch Buffer 使能flash预读取缓冲区*/ // FLASH_SetLatency(FLASH_Latency_2); /* Flash 2 wait state // 令Flash处于等待状态,2是针对高频时钟的,这两句跟RCC没直接关系,可以暂且略过*/ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* HCLK = SYSCLK 设置高速总线时钟=系统时钟*/ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK2 = HCLK 设置低速总线2时钟=高速总线时钟*/ RCC_PCLK1Config(RCC_HCLK_Div2); /* PCLK1 = HCLK/2 设置低速总线1的时钟=高速时钟的二分频*/ RCC_ADCCLKConfig(RCC_PCLK2_Div6); /* ADCCLK = PCLK2/6 设置ADC外设时钟=低速总线2时钟的六分频*/ /* RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // PLLCLK = 8MHz * 9 = 72 MHz 利用锁相环讲外部8Mhz晶振9倍频到72Mhz RCC_PLLCmd(ENABLE); // Enable PLL 使能锁相环 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) // Wait till PLL is ready 等待锁相环输出稳定 { } */ RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); //RCC_SYSCLKSource_HSI: 高速内部时钟信号 stm32单片机内带的时钟 (8M频率) //RCC_SYSCLKSource_HSE:(1)HSE外部晶体/陶瓷谐振器(晶振) (2)HSE用户外部时钟 //RCC_SYSCLKSource_PLLCLK:Select PLL as system clock source 将锁相环输出设置为系统时钟*/ while(RCC_GetSYSCLKSource() != 0x04) //HSE used as system clock // while(RCC_GetSYSCLKSource() != 0x08) /* Wait till PLL is used as system clock source 等待PLL校验成功*/ { } } /* 这个配置可使外部晶振停振的时候,产生一个NMI中断,不需要用的可屏蔽掉*/ //RCC_ClockSecuritySystemCmd(ENABLE); /* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */ //使能外围接口总线时钟,注意各外设的隶属情况,不同芯片的分配不同,查手册就可 /* Enable peripheral clocks -------------------------------*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); // RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | // RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG | // RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // AFIO时钟,用来禁止JTAG RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 串口1时钟, // RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ADC1时钟 // RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA1时钟 }
/***************************************************************************//** * @brief Selects HSE as System clock source and configure HCLK, PCLK2 and PCLK1 prescalers. ******************************************************************************/ void SetSysClockToHSE(void) { /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/ /* RCC system reset(for debug purpose) */ RCC_DeInit(); /* Enable HSE */ RCC_HSEConfig( RCC_HSE_ON); /* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if (HSEStartUpStatus == SUCCESS) { /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* Flash 0 wait state */ FLASH_SetLatency( FLASH_Latency_0); /* HCLK = SYSCLK */ RCC_HCLKConfig( RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config( RCC_HCLK_Div1); /* PCLK1 = HCLK */ RCC_PCLK1Config(RCC_HCLK_Div1); /* Select HSE as system clock source */ RCC_SYSCLKConfig( RCC_SYSCLKSource_HSE); /* Wait till PLL is used as system clock source */ while (RCC_GetSYSCLKSource() != 0x04) { } } else { /* If HSE fails to start-up, the application will have wrong clock configuration. User can add here some code to deal with this error */ /* Go to infinite loop */ while (1) { } } }
/**************************************************************/ //程 序 名: RCC_Config() //开 发 者: Haichao.Xie //入口参数: 无 //功能说明: 系统时钟配置 //**************************************************************/ void RCC_Config(void) { ErrorStatus HSEStartUpStatus; //定义结构体 /* RCC system reset(for debug purpose)将外设 RCC寄存器重设为缺省值 */ RCC_DeInit(); /* Enable HSE 设置外部高速晶振(HSE)*/ RCC_HSEConfig(RCC_HSE_ON); /* Wait till HSE is ready 等待 HSE 起振*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if (HSEStartUpStatus == SUCCESS) { /* Enable Prefetch Buffer 预取指缓存使能*/ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* Flash 2 wait state 设置代码延时值*/ FLASH_SetLatency(FLASH_Latency_2); /* HCLK = SYSCLK 设置 AHB 时钟(HCLK)*/ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK 设置高速 AHB 时钟(PCLK2)*/ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK/1 设置低速 AHB 时钟(PCLK1)*/ RCC_PCLK1Config(RCC_HCLK_Div1); /* PLLCLK = 12MHz * 6 = 72 MHz 设置 PLL 时钟源及倍频系数*/ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6); /* Enable PLL 使能或者失能 PLL*/ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready 等待指定的 RCC 标志位设置成功 等待PLL初始化成功*/ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /* Select PLL as system clock source 设置系统时钟(SYSCLK) 设置PLL为系统时钟源*/ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source 等待PLL成功用作于系统时钟的时钟源*/ while(RCC_GetSYSCLKSource() != 0x08) { } } }
void RCC_Config(void) { RCC_DeInit(); //RCC寄存器初始化 RCC_HSEConfig(RCC_HSE_ON); //使用外部時鐘 //if(RCC_WaitForHSEStarUp()==SUCCESS) //{ RCC_PLLCmd(DISABLE);//PLL前應先關閉主PLL RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//選擇PLL時鐘為系統時鐘 RCC_HCLKConfig(RCC_SYSCLK_Div1);//HCLK(AHB)時鐘為系統時鐘1分頻 RCC_PCLK1Config(RCC_HCLK_Div4);//PCLK1(AHB1)時鐘為HCLK時鐘8分頻,則TIM2時鐘為HCLK時鐘4分頻 RCC_PCLK2Config(RCC_HCLK_Div2);//PCLK1(AHB1)時鐘為HCLK時鐘2分頻 RCC_PLLConfig(RCC_PLLSource_HSE,27,162,2,7);//PLL時鐘配置,公式見system_stm43f4xx.c'line149 RCC_PLLCmd(ENABLE); //PLL時鐘開啟 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}//等待PLL時鐘準備好 //} }
void cpu_init(void) { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); ErrorStatus HSEStartUpStatus = RCC_WaitForHSEStartUp(); if (HSEStartUpStatus == SUCCESS) { // Enable flash buffers and prefetching FLASH_PrefetchBufferCmd(ENABLE); FLASH_InstructionCacheCmd(ENABLE); FLASH_DataCacheCmd(ENABLE); // Set startup speed cpu_reclock(&sysclock_120m); } }
static void RCC_Configuration(void) { /*---------------------------------*/ /* /!\ PLL2 not configured /!\ */ /*---------------------------------*/ ErrorStatus HSEStartUpStatus; // RCC system reset(for debug purpose) RCC_DeInit(); // Enable HSE RCC_HSEConfig(RCC_HSE_ON); // Wait till HSE is ready HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { // Enable Prefetch Buffer FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // Flash 2 wait state FLASH_SetLatency(FLASH_Latency_2); // HCLK = SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1); // PCLK2 = HCLK RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK1 = HCLK/2 RCC_PCLK1Config(RCC_HCLK_Div2); /* ADCCLK = PCLK2/4 */ RCC_ADCCLKConfig(RCC_PCLK2_Div4); // PLLCLK = 8MHz * 9 = 72 MHz RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // Enable PLL RCC_PLLCmd(ENABLE); // Wait till PLL is ready while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {;} // Select PLL as system clock source RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Wait till PLL is used as system clock source while(RCC_GetSYSCLKSource() != 0x08) ///???? {;} } /* Enable peripheral clocks (FOR USART1)---------------------------------*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* Enable GPIOA / GPIOC clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); }
void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); FLASH_SetLatency(FLASH_Latency_2); FLASH_PrefetchBufferCmd(ENABLE); RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() !=0x08); // the following is the selected part of the clock inicialization, according to your connecting devices //SPI1 clock open RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //USART-XTend (wireless data transmittion) clock open RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //USART-GPS clock open RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //USART-sensor clock open RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //GPIO LED clock open RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //GPIO Launching clock open RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); SysTick_ITConfig(ENABLE); } }
/* * RCC时钟频率引脚配置 */ void RCC_Configuration(void) { //定义错误状态变量 ErrorStatus HSEStartUpStatus; //将RCC寄存器重新设置为默认值 RCC_DeInit(); //打开外部高速时钟晶振 RCC_HSEConfig(RCC_HSE_ON); //等待外部高速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus != SUCCESS) return; //使能预取指缓存 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //设置FLASH代码延时 FLASH_SetLatency(FLASH_Latency_2); //设置AHB时钟(HCLK)为系统时钟 RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置高速AHB时钟(APB2)为HCLK时钟 RCC_PCLK2Config(RCC_HCLK_Div1); //设置低速AHB时钟(APB1)为HCLK的2分频 RCC_PCLK1Config(RCC_HCLK_Div2); //设置PLL时钟,为HSE的12倍频 PLLCLK = 12MHz/2 * 12 = 72 MHz RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_12); //使能PLL RCC_PLLCmd(ENABLE); //等待PLL准备就绪 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //设置PLL为系统时钟源 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //判断PLL是否是系统时钟 while(RCC_GetSYSCLKSource() != 0x08); }
void RCC_HSE_Configuration(void){ RCC_DeInit(); /*将外设RCC寄存器重设为缺省值 */ RCC_HSEConfig(RCC_HSE_ON); /*设置外部高速晶振打开*/ if(RCC_WaitForHSEStartUp() == SUCCESS) { /*等待HSE起振,晶振稳定且就绪*/ RCC_HCLKConfig(RCC_SYSCLK_Div1);/*设置AHB时钟*/ RCC_PCLK2Config(RCC_HCLK_Div1); /*设置高速AHB时钟*/ RCC_PCLK1Config(RCC_HCLK_Div2); /*设置低速AHB时钟*/ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/*设置PLL时钟源、倍频系数*/ RCC_PLLCmd(ENABLE);//使能PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//检查指定RCC标志位 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置系统时钟 while(RCC_GetSYSCLKSource() != 0x08); //PLL作为系统时钟 } }
void TSVN_FOSC_Init(void) { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); while(RCC_WaitForHSEStartUp() != SUCCESS); RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE, RCC_PREDIV1_Div1); RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div2); RCC_PCLK1Config(RCC_HCLK_Div2); RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08) SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); SystemCoreClockUpdate(); SysTick_Config(SystemCoreClock/1000); }
void RCC_Configuration(void) { /* 定义枚举型变量HSEStartUpStatus */ ErrorStatus HSEStartUpStatus; /* 复位系统时钟设置*/ RCC_DeInit(); /* 开启HSE*/ RCC_HSEConfig(RCC_HSE_ON); /* 等待HSE启振并稳定*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /*判断HSE是否起振成功, */ if(HSEStartUpStatus == SUCCESS) { /* 选择HCLK(AHB)时钟源为 SYSCLK 1分频 */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* 选择PCLK2时钟源为HCLK(AHB) 1分频*/ RCC_PCLK2Config(RCC_HCLK_Div1); /* 选择PCLK1时钟源为HCLK(AHB) 2分频*/ RCC_PCLK1Config(RCC_HCLK_Div2); /* 设置FLASH延时周期数为2 */ FLASH_SetLatency(FLASH_Latency_2); /* 使能FLASH预缓存 */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率 8MHz * 9 = 72MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* 使能PLL */ RCC_PLLCmd(ENABLE); /* 等待PLL输出稳定 */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /* 选择SYSCLK时钟源为PLL */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 等待PLL成为SYSCLK时钟源*/ while(RCC_GetSYSCLKSource() != 0x08); } /* 打开APB2总线上的GPIOA时钟*/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO |RCC_APB2Periph_USART1 ,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_TIM4,ENABLE); }
//=============================================== void RCC_Configuration(void) { FLASH_PrefetchBufferCmd(ENABLE); FLASH_SetLatency(FLASH_ACR_LATENCY_1); RCC_DeInit(); RCC_HSICmd(ENABLE); RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_ADCCLKConfig(RCC_PCLK2_Div6); RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_6); RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {} /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while (RCC_GetSYSCLKSource() != 0x08) {}; };
void RCC_HSE_Configuration(void) //HSE作为PLL时钟,PLL作为SYSCLK { 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*/ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/*设置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作为系统时钟 */ } }
void RCC_Configuration(void) { RCC_DeInit(); //将外设RCC寄存器重设为缺省值 #ifdef ExtOSC RCC_HSEConfig(RCC_HSE_ON); //开启外部高速晶振(HSE) //等待HSE起振 if( RCC_WaitForHSEStartUp() == SUCCESS) //若成功起振,(下面为系统总线时钟设置) { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能FLASH预取指缓存 //FLASH_SetLatency(FLASH_Latency_0); //设置FLASH存储器延时时钟周期数(根据不同的系统时钟选取不同的值) //RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟=72 MHz //RCC_PCLK2Config(RCC_HCLK_Div2); //设置APB1时钟=36 MHz(APB1时钟最大值) //RCC_PCLK1Config(RCC_HCLK_Div1); //设置APB2时钟=72 MHz //4*8=32Mhz RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4); //PLL必须在其激活前完成配置(设置PLL时钟源及倍频系数) RCC_PLLCmd(ENABLE); // while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // while(RCC_GetSYSCLKSource() != 0x08); } //DebugPrint("Use ExtOSC PLL \r\n",); #else /* 使用内部RC晶振 */ RCC_HSICmd(ENABLE);//使能内部高速晶振 ; while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);//选择内部高速时钟作为系统时钟SYSCLOCK=8MHZ RCC_HCLKConfig(RCC_SYSCLK_Div1);//选择HCLK时钟源为系统时钟SYYSCLOCK //DebugPrint("Use IntOSC\r\n"); #endif SystemCoreClockUpdate(); //更新时钟必须调用 }
/** * @brief Selects MSI (64KHz) as System clock source and configure * HCLK, PCLK2 and PCLK1 prescalers. * @param None * @retval None */ void SetHCLKToMSI_64KHz(void) { /* RCC system reset */ RCC_DeInit(); /* Flash 0 wait state */ FLASH_SetLatency(FLASH_Latency_0); /* Disable Prefetch Buffer */ FLASH_PrefetchBufferCmd(DISABLE); /* Disable 64-bit access */ FLASH_ReadAccess64Cmd(DISABLE); /* Enable the PWR APB1 Clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Select the Voltage Range 3 (1.2V) */ PWR_VoltageScalingConfig(PWR_VoltageScaling_Range3); /* Wait Until the Voltage Regulator is ready */ while (PWR_GetFlagStatus(PWR_FLAG_VOS) != RESET) {} /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK */ RCC_PCLK1Config(RCC_HCLK_Div1); /* Set MSI clock range to 64KHz */ RCC_MSIRangeConfig(RCC_MSIRange_0); /* Select MSI as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_MSI); /* Wait till PLL is used as system clock source */ while (RCC_GetSYSCLKSource() != 0x00) {} }
void RCC_Config_30MHz(void){ RCC_DeInit(); FLASH_SetLatency(FLASH_Latency_2); /*configurar clock externo a 72Mhz */ //bypass pois está ligado no OSC_IN um circuito oscilatorio externo RCC_HSEConfig(RCC_HSE_Bypass); //Após a ativação do HSE deveremos esperar até que o sinal de relógio esteja pronto e estável ErrorStatus HSEStartUpStatus; HSEStartUpStatus=RCC_WaitForHSEStartUp(); if(HSEStartUpStatus==SUCCESS) /*retorna SUCCESS ou ERROR*/ { //divisão do prescaler AHB por 1 RCC_HCLKConfig(RCC_SYSCLK_Div1); //divisão do prescaler APB1 por 2 RCC_PCLK1Config(RCC_HCLK_Div1); //divisão do prescaler APB2 por 1 RCC_PCLK2Config(RCC_HCLK_Div1); //configuar a PLL para 30Mhz RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_5); //activar a pll RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus( RCC_FLAG_PLLRDY)==RESET); //activa o sysclk pll RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //confirmar que o clock está correcto logo esperar que a fonte de relógio esteja correta while(RCC_GetSYSCLKSource()!=0x08); //clock configurado com sucesso } else while(1); /*se deu erro o micro nao arranca*/ }
void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); RCC_PLLConfig(RCC_PLLSource_HSE, 8, 168, 2, 6); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08); } }
void CLOCK_FLASH_config() { // クロックの状態を初期値に戻す RCC_DeInit(); // wait stateの設定 if (VoltageRange_x == VoltageRange_2) FLASH_SetLatency(FLASH_Latency_6); else if(VoltageRange_x == VoltageRange_3) FLASH_SetLatency(FLASH_Latency_5); else while(1); // ART Acceleratorの設定 FLASH_PrefetchBufferCmd(ENABLE); FLASH_InstructionCacheCmd(ENABLE); FLASH_DataCacheCmd(ENABLE); // HSIのキャリブレーション値を設定する RCC_AdjustHSICalibrationValue(HSICalibrationValue); // PLLの設定をする (max. 168 MHz) // PLLM: division factor, 2-63 --> 1-2 MHz (2MHz is recommended) // PLLN: multiplication factor, 64-432 --> 64-432 MHz // PLLP: division factor, 2, 4, 6, or 8 --> max 168 MHz // PLLQ: division factor, 2-15 --> 48 MHz RCC_PLLConfig(RCC_PLLSource_HSI, 8, 168, 2, 7); // HSI / 8 * 168 / 2 = 168 MHz //RCC_PLLConfig(RCC_PLLSource_HSI, 8, 168, 4, 7); // HSI / 8 * 168 / 4 = 84 MHz RCC_PLLCmd(ENABLE); while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) != SET); // HCLKの分周比を設定する (max. 168 MHz) RCC_HCLKConfig(RCC_SYSCLK_Div1); // PCLK2の分周比を設定する (max. 84 MHz) RCC_PCLK2Config(RCC_HCLK_Div2); // PLCK1の分周比を設定する (max. 42 MHz) RCC_PCLK1Config(RCC_HCLK_Div4); // SYSCLKのクロックソースをPLLに切り替える RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08); }
void RCC_Configuration(void) { /* system clocks configuration -----------------系统时钟配置-------------------*/ /* RCC system reset(for debug purpose) */ RCC_DeInit(); //将外设RCC寄存器重设为缺省值 /* Enable HSE */ //RCC_HSEConfig(RCC_HSE_ON); //开启外部高速晶振(HSE) /* Wait till HSE is ready */ //HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE起振 //if(HSEStartUpStatus == SUCCESS) //若成功起振,(下面为系统总线时钟设置) //{ /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能FLASH预取指缓存 /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); //设置FLASH存储器延时时钟周期数(根据不同的系统时钟选取不同的值) /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟=72 MHz /* PCLK2 = HCLK/2 */ RCC_PCLK2Config(RCC_HCLK_Div2); //设置APB1时钟=36 MHz(APB1时钟最大值) /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div8); //设置APB2时钟=72 MHz /* Configure ADCCLK such as ADCCLK = PCLK2/2 */ RCC_ADCCLKConfig(RCC_PCLK2_Div2); //RCC_PCLK2_Div2,4,6,8 /* PLLCLK = 8MHz * 9 = 72 MHz */ //RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12); //PLL必须在其激活前完成配置(设置PLL时钟源及倍频系数) RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12); /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08) { } //} }
//配置系统时钟 void RCC_Configuration(void){ //定义枚举类型变量 ErrorStatus HSEStartUpStatus; //复位系统时钟设置 RCC_DeInit(); //开启HSE时钟 RCC_HSEConfig(RCC_HSE_ON); //等待HSE起振并稳定 HSEStartUpStatus=RCC_WaitForHSEStartUp(); //判断HSE是否起振成功 if(HSEStartUpStatus == SUCCESS){ //选择HCLK(AHB)时钟源为SYSCLK 1分频 RCC_HCLKConfig(RCC_SYSCLK_Div1); //选择PCLK2时钟源为HCLK(AHB) 1分频 RCC_PCLK2Config(RCC_HCLK_Div1); //选择PCLK1时钟源为HCLK(AHB) 2分频 RCC_PCLK1Config(RCC_HCLK_Div2); //设置flash延时周期数为2 FLASH_SetLatency(FLASH_Latency_2); //使能预取缓冲 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //选择锁相环(PLL时钟源为HSE 1分频,倍频数为9,则PLL输出频率为8M * 9 = 72M) RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //使能PLL RCC_PLLCmd(ENABLE); //等待PLL输出稳定 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}; //选择PLL为系统时钟源,并等待PLL准备好 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08){}; } //4个LED对应PE2 PE3 PE4 PE5 //因此要使能APB2总线上的GPIOE时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); }
//设置系统时钟为72MHz void RCC_Configuration(void) { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); //使能外部高速时钟 while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) ; //等待外部的高速时钟就绪 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能指令预存取 FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟为系统时钟 RCC_PCLK2Config(RCC_HCLK_Div1); //设置APB2的时钟为AHB时钟 RCC_PCLK1Config(RCC_HCLK_Div1); //设置APB1的时钟为AHB时钟 RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //设置PLL时钟为外部告诉时钟的9倍频 RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置PLL时钟为系统时钟 while(RCC_GetSYSCLKSource()!=0x08); }
static void initialize(void) { RCC_DeInit(); /* Enable clock for relevant peripherals */ RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOFEN; RCC->APB2ENR |= RCC_APB2ENR_ADCEN; RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannelPriority = 1; NVIC_InitStructure.NVIC_IRQChannel = ADC1_IRQn; NVIC_Init(&NVIC_InitStructure); }
void main(void) { GPIO_InitTypeDef gpio; /* Reset rcc */ RCC_DeInit (); /* Enable GPIOA clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* Initialize GPIO struct */ GPIO_StructInit(&gpio); /* Use Pin 5 (LD2) */ gpio.GPIO_Pin = GPIO_Pin_5; /* Set GPIO Speed */ gpio.GPIO_Mode = GPIO_Mode_Out_PP; /* Set GPIO as output with push-pull */ gpio.GPIO_Speed = GPIO_Speed_50MHz; /* Apply configuration */ GPIO_Init(GPIOA, &gpio); while(1) { /* Switch led on */ GPIO_SetBits(GPIOA, GPIO_Pin_5); /* Wait */ delay(100000); /* Switch led off */ GPIO_ResetBits(GPIOA, GPIO_Pin_5); /* Wait */ delay(100000); } }
void RCC_Configuration(void) { // RCC system reset(for debug purpose) RCC_DeInit(); // Enable Prefetch Buffer FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 2 wait states FLASH_SetLatency(FLASH_Latency_2); // HCLK = SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1); // PCLK2 = HCLK/2 RCC_PCLK2Config(RCC_HCLK_Div2); // PCLK1 = HCLK/4 RCC_PCLK1Config(RCC_HCLK_Div4); // PLLCLK = 8MHz/2 * 16 = 64 MHz RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16); // Enable PLL RCC_PLLCmd(ENABLE); // Wait till PLL is ready while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {} // Select PLL as system clock source RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Wait till PLL is used as system clock source while(RCC_GetSYSCLKSource() != 0x08) {} //enable AFIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); }