最近,在学习STM32单片机,选用的型号是通用型STM32F103,在学习定时器应用时,遇到了一个很头疼的问题,怀疑STM32 高级定时器TIM1“计时不准”。 事情的来龙去脉是这样的,之前写了一个通过tim1定时器中断实现led闪烁的程序,测试时led闪烁频率和我设置的频率一致,当我后面继续这个程序上添加ad采样程序后,调试时,偶然发现led闪烁频率变慢,RCC时钟配置和原来一样,为什么加个ad采样程序,会影响定时器工作,这让我觉得非常奇怪。
led闪烁频率变慢,可以肯定与RCC配置和定时器配置有关,当时写的程序如下:
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus=RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9); //16M外部晶振,16/2M*9=72
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() !=0x08);
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
}
void TIM1_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_DeInit(TIM1);
TIM_InternalClockConfig(TIM1);
TIM_TimeBaseStructure.TIM_Period = 2000; //计数2000次,每2000/2K=1s产生一次中断
TIM_TimeBaseStructure.TIM_Prescaler = 35999; //进行预分频35999+1,72M/36K=2K Hz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM_PrescalerConfig(TIM1,35999,TIM_PSCReloadMode_Immediate);
TIM_ClearFlag(TIM1,TIM_FLAG_Update);
TIM_ARRPreloadConfig(TIM1, DISABLE);
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
}
从程序上看Tim1每一秒产生一次中断,在中断函数中实现led亮一秒暗一秒,但是实际led闪烁频率会变慢,而当我改变ad采集口时,led闪烁频率会变得更慢,配置io会影响时钟,很无厘头,这芯片还敢用吗?实在没办法,我配置了一下Tim2,用Tim2定时中断,结果一切都工作正常。这是什么逻辑,高级定时器tim1反而没普通定时器tim2靠谱,无语。。。。。
最近又查了下资料,终于发现tim1定时器有一些特有的配置功能,它可以控制溢出中断的周期,它是由寄存器TIM1_RCR控制,如下图所示,库函数中是由TIM_TimeBaseStructure.TIM_RepetitionCounter 来控制 |