/******************************************************************************* * 名 称: Bsp_ConfgiSysClk * 功 能: 配置CPU系统时钟 * 入口参数: 枚举SYS_CLK_E ; 可选参数为: * HSI_2M = 0 内部高速RC振荡源16M, 分频倍率设置为 1/8 可得到2M * HSI_4M, 内部高速RC振荡源16M, 分频倍率设置为 1/4 可得到4M * HSI_8M, 内部高速RC振荡源16M, 分频倍率设置为 1/2 可得到8M * HSI_16M, 内部高速RC振荡源16M, 分频倍率设置为 1/1 可得到16M * LSI_128K, 内部低速RC时钟源,频率固定为128KHz * HSE_XTAL, 外部高速时钟 (频率由用于外接晶振决定,无分频选项) * 出口参数: 无 * 作 者: Roger-WY * 创建日期: 2014-08-20 * 修 改: * 修改日期: * 备 注: 建议使用优化代码模式 *******************************************************************************/ void Bsp_ConfgiSysClk(SYS_CLK_E _iSysClk) { #if 1 /* 空间不足,优化代码, 只保留需要的时钟设置 */ if (_iSysClk == HSI_16M) { /* 自动切换, 切换到内部高速时钟HSI, 禁止系统时钟中断, 关闭当前的时钟源 */ CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); /* 设置内部高速RC时钟HSI为时钟源,分频系数为1 */ while (CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == RESET); /* 等待HSI时钟稳定 */ } #else switch (_iSysClk) { case HSE_XTAL: /* 自动切换, 切换到外部高速时钟HSE, 禁止系统时钟中断, 关闭当前的时钟源 */ CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); break; case LSI_128K: /* 自动切换, 切换到内部低速时钟LSI, 禁止系统时钟中断, 关闭当前的时钟源 */ CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_LSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); break; case HSI_16M: /* 自动切换, 切换到内部高速时钟HSI, 禁止系统时钟中断, 关闭当前的时钟源 */ CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); /* 设置内部高速RC时钟HSI为时钟源,分频系数为1 */ while (CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == RESET); /* 等待HSI时钟稳定 */ break; case HSI_8M: /* 自动切换, 切换到内部高速时钟HSI, 禁止系统时钟中断, 关闭当前的时钟源 */ CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2); /* 设置内部高速RC时钟HSI为时钟源,分频系数为2 */ while (CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == RESET); /* 等待HSI时钟稳定 */ break; case HSI_4M: /* 自动切换, 切换到内部高速时钟HSI, 禁止系统时钟中断, 关闭当前的时钟源 */ CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4); /* 设置内部高速RC时钟HSI为时钟源,分频系数为4 */ while (CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == RESET); /* 等待HSI时钟稳定 */ break; case HSI_2M: /* 自动切换, 切换到内部高速时钟HSI, 禁止系统时钟中断, 关闭当前的时钟源 */ CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8); /* 设置内部高速RC时钟HSI为时钟源,分频系数为8 */ while (CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == RESET); /* 等待HSI时钟稳定 */ break; default: break; } #endif }
/** * @brief Main program. * @param None * @retval None */ void main(void) { /* Enable LSE */ CLK_LSEConfig(CLK_LSE_ON); /* Wait for LSE clock to be ready */ while (CLK_GetFlagStatus(CLK_FLAG_LSERDY) == RESET); /* wait for 1 second for the LSE Stabilisation */ LSE_StabTime(); /* Select LSE (32.768 KHz) as RTC clock source */ CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1); CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); /* Calendar Configuration */ Calendar_Init(); /*RTC Tamper Configuration*/ Tamper_Init(); /* EvalBoard Configuration */ EvalBoard_Init(); Tamper_DelayShow(TampFilterIndex); while (1) { EnterSafeCode(); Time_Show(LCD_LINE2, SHOW_POINT2); ExitSafeCode(); } }
//设置内部时钟16M为主时钟 //输入参数:无 //输出参数:无 void Set_HSI(void) { //CLK_DeInit(); //恢复默认设置 CLK_HSICmd(ENABLE); //内部时钟开 while(SET != CLK_GetFlagStatus(CLK_FLAG_HSIRDY)); //等待内部时钟稳定 CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1); //不分频,16M CLK_ClockSwitchCmd(ENABLE); //时钟切换使能 //切换配置 CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO,CLK_SOURCE_HSI,DISABLE,CLK_CURRENTCLOCKSTATE_DISABLE); }
void clock_config(void) { CLK_HSICmd(ENABLE); CLK_RTCClockConfig(CLK_RTCCLKSource_HSI,CLK_RTCCLKDiv_64); CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI); CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY)==RESET); CLK_PeripheralClockConfig(CLK_Peripheral_LCD, ENABLE); CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, ENABLE); CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE); CLK_PeripheralClockConfig(CLK_Peripheral_TIM3, ENABLE); CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE); };
/** * @brief Main program. * @param None * @retval None */ void main(void) { /* Enable LSE */ CLK_LSEConfig(CLK_LSE_ON); /* Wait for LSE clock to be ready */ while (CLK_GetFlagStatus(CLK_FLAG_LSERDY) == RESET); /* wait for 1 second for the LSE Stabilisation */ Delay_Seconds(1); /* Select LSE (32.768 KHz) as RTC clock source */ CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1); CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); /*RTC Tamper Configuration*/ Tamper_Init(); /* Calendar Configuration */ Calendar_Init(); /* EvalBoard Configuration */ EvalBoard_Init(); /* RTC Time fields reset*/ Time_Reset(); /* RTC Time pause waiting for a press on SEL Key */ Time_Pause(); while (1) { EnterSafeCode(); Time_Show(LCD_LINE2); ExitSafeCode(); } }