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); } }
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); }
/**----------------------------------------------------------------------------- * @brief Desinitialisation de la carte. */ void BSP_DeInit() { // Desactivation des interruptions __disable_irq(); // Arret Systick SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0; // DeInitialisation des horloges //RCC_AHB1PeriphClockCmd(0xFFFFFFFF, DISABLE); RCC_AHB1PeriphResetCmd(0xFFFFFFFF, ENABLE); RCC_AHB1PeriphResetCmd(0xFFFFFFFF, DISABLE); //RCC_AHB2PeriphClockCmd(0xFFFFFFFF, DISABLE); RCC_AHB2PeriphResetCmd(0xFFFFFFFF, ENABLE); RCC_AHB2PeriphResetCmd(0xFFFFFFFF, DISABLE); //RCC_AHB3PeriphClockCmd(0xFFFFFFFF, DISABLE); RCC_AHB3PeriphResetCmd(0xFFFFFFFF, ENABLE); RCC_AHB3PeriphResetCmd(0xFFFFFFFF, DISABLE); //RCC_APB1PeriphClockCmd(0xFFFFFFFF, DISABLE); RCC_APB1PeriphResetCmd(0xFFFFFFFF, ENABLE); RCC_APB1PeriphResetCmd(0xFFFFFFFF, DISABLE); //RCC_APB2PeriphClockCmd(0xFFFFFFFF, DISABLE); RCC_APB2PeriphResetCmd(0xFFFFFFFF, ENABLE); RCC_APB2PeriphResetCmd(0xFFFFFFFF, DISABLE); RCC_DeInit(); // ReInit Flash FLASH_PrefetchBufferCmd(DISABLE); FLASH_InstructionCacheCmd(DISABLE); FLASH_DataCacheCmd(DISABLE); }
static void prvSetupHardware( void ) { #if 1 ErrorStatus HSEStartUpStatus; /* 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起振,该函数将等待直到HSE就绪,或者在超时的情况下退出 /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(ENABLE); // 使能预取指缓存 FLASH_InstructionCacheCmd(ENABLE); FLASH_DataCacheCmd(ENABLE); /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); // 设置代码延时值 /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); // 设置AHB时钟(HCLK) /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); // 设置高速AHB时钟(PCLK2) /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); // 设置低速AHB时钟(PCLK1) /* ADCCLK = PCLK2/4 */ //RCC_ADCCLKConfig(RCC_PCLK2_Div4); // 设置ADC时钟(ADCCLK) if(HSEStartUpStatus == SUCCESS) { /* PLLCLK = ((12MHz/12)*336)/4 = 84 MHz */ RCC_PLLConfig(RCC_PLLCFGR_PLLSRC_HSE, 12, 336, 4, 7); // 设置PLL时钟源及倍频系数 HSE_Or_HSI = 1; //MsTimeTick = 84000; } else { /* PLLCLK = ((4MHz/7)*336)/4 = 48 MHz */ RCC_PLLConfig(RCC_PLLCFGR_PLLSRC_HSI, 7, 336, 4, 4); // 设置PLL时钟源及倍频系数 HSE_Or_HSI = 0; //MsTimeTick = 48000; } /* Enable PLL */ RCC_PLLCmd(ENABLE); // 使能PLL /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) // 检查指定的RCC标志位设置与否 { } /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // 设置系统时钟(SYSCLK) /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08) // 返回用作系统时钟的时钟源 { } /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE and AFIO clocks */ RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1 , ENABLE ); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE,ENABLE); /* Configure HCLK clock as SysTick clock source. */ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK ); #endif RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000); }