打印
[应用相关]

高级定时器TIM1“计时不准”?

[复制链接]
859|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bbapple|  楼主 | 2016-8-27 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近,在学习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 来控制
沙发
huangcunxiake| | 2016-8-27 12:10 | 只看该作者
STM32的定时器如果用对了,还是可以的,反正就是不是十分好用。

使用特权

评论回复
板凳
天灵灵地灵灵| | 2016-8-27 15:03 | 只看该作者
不是不准应该是有什么语句占用了时间,你以为没有呢,结果汇编后就有了。

使用特权

评论回复
地板
wxqfhy| | 2019-5-28 11:35 | 只看该作者
你的问题是咋解决的?好像TIM_PRescaler和TIM_ClockDivision属性设置不起作用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

1811

帖子

1

粉丝