void INIT_CLOCK(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLKConfig(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_4);
RCC_PLLCmd(ENABLE); //使能PLL
//检查指定的RCC标志位设置与否
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // Wait till PLL is ready
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置系统时钟 (SYSCLK)
while(RCC_GetSYSCLKSource() != 0x08);
SystemCoreClock=32000000; //32MHZ
}
else
{
//内部晶振配置
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_OFF);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLKConfig(RCC_HCLK_Div1);
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI );
RCC_PLLCmd(DISABLE); //PLL
SystemCoreClock=8000000; //8MHZ
}
}
void TIM15_Basetimer(void)
{
uint16_t TimerPeriod = 0;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM15, ENABLE);
TIM_DeInit(TIM15);
TIM_TimeBaseStructure.TIM_Period = 4000; // 4000ms 定时4秒中断
#if 1
//这个是认为 APB2=32MHZ的?
TIM_TimeBaseStructure.TIM_Prescaler = 32000-1;
#else
//这个是认为 APB2=16MHZ的?
TIM_TimeBaseStructure.TIM_Prescaler = 16000-1;
#endif
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; // 时钟分割
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟0分割 1次时钟频率 1次计数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数方式
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0000;
TIM_TimeBaseInit(TIM15, &TIM_TimeBaseStructure);
/* Clear TIM1 update pending flag[清除TIM1溢出中断标志] */
TIM_ClearFlag(TIM15, TIM_FLAG_Update);//更新中断标记 由软件清0 ,例如当上溢或下溢时,软件对CNT重新初始化
TIM_ITConfig(TIM15,TIM_IT_Update,ENABLE);
TIM_SetCounter(TIM15, 0);
TIM_Cmd(TIM15, ENABLE); //开启计数器
//配置中断
NVIC_DisableIRQ(TIM15_IRQn);
NVIC_SetPriority(TIM15_IRQn,0);
NVIC_EnableIRQ(TIM15_IRQn);
}
|