刚接触STM32,还只看了时钟系统、中断、GPIO和通用定时器的普通定时功能。 编译器MDK4.0,借固件库写个了用TIM2控制灯闪的程序。不优化时正常,优化后(优化等级1~3都试过)闪烁频率翻倍了!本来一秒一次,现在一秒两次。 使用RCC_GetClocksFreq(&RCC_clock_value)函数读出来的时钟值如下:f[SYSCLK]=8MHz,f[HCLK]=8MHz,f[PCLK1]=8MHz,f[PCLK2]=8MHz,f[ADCCLK]=4MHz。读出的TIM2->SC值为99(即TIM2分频系数为100) 这个问题找得我头大了。各位帮忙看看。下面是相关部分程序: void RCC_config(void) { RCC_HSEConfig(RCC_HSE_ON); //HES开启; if(SUCCESS==RCC_WaitForHSEStartUp()); //等待时钟准备好; { // while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); //使用HSE时钟; while(RCC_GetSYSCLKSource()!= 0x04); //检查时钟源是否已是HSE; RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB时钟分频系数为1; RCC_PCLK2Config(RCC_HCLK_Div1); //APB2时钟分频系数为1; RCC_PCLK1Config(RCC_HCLK_Div1); //APB1时钟分频系数为1; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //开启GPIOB时钟; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //开启TIM2时钟; } } void TIM2_config(void) { TIM_InternalClockConfig(TIM2); //TIM2使用内部时钟; TIM_SetAutoreload(TIM2,4000); //设置自动重装载寄存器,定时50ms; TIM_CounterModeConfig(TIM2,TIM_CounterMode_Up); //TIM2向上计数, 即从0到TIM2_ARR; TIM_PrescalerConfig(TIM2,99,TIM_PSCReloadMode_Immediate); //f[TIM2]= f[CLK_APB1]/(99+1),即100分频,并立即产生更新; TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //此次更新不产生中断; TIM_Cmd(TIM2,ENABLE); //开启计数器; TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //开启TIM2的更新中断; } //中断配置; void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; //开TIM2全局中断; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //选择TIM2通道; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void device_init(void) { RCC_config(); GPIO_config(); TIM2_config(); NVIC_Configuration(); } //TIM2 50ms中断函数; void TIM2_IRQHandler(void) { static vu8 t500ms_for_PCB_shine=0; if(++t500ms_for_PCB_shine>=10) { LED1_SHINE(); t500ms_for_PCB_shine=0; } TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志; } int main(void) { device_init(); while(1); } |
RE:STM32代码优化后的问题