问题描述
- 通用定时器预分频问题
-
MCU是stm32f103zet6,采用TIM2,向上计数器模式,外部晶振8MHZ,RCC APB1=36MHZ,预分频:36000-1,目标是想得到在计数时,计数器每增加一,耗时是1ms
但是怎么都实现不了,时间增加0.1us,计数器增加一个远远大于1的不确定值。
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;/* RCC system reset(for debug purpose) */
RCC_DeInit();/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();if (HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/* Flash 2 wait state */ //FLASH_SetLatency(FLASH_Latency_2); /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {} /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08) {}
}
/* Enable GPIOC clock */
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);/* Enable TIM2 clock */
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);}
void Timer_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* Enable TIM2 clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_DeInit(TIM2);
TIM_InternalClockConfig(TIM2);TIM_TimeBaseStructure.TIM_Period=40000; TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); TIM_ClearFlag(TIM2,TIM_FLAG_Update); TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
//TIM_ARRPreloadConfig(TIM2, DISABLE); //????????????????????
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2,ENABLE);}
解决方案
0.1uS 你怎么测的呢?
如果我做,大概会每次定时中断反转一个I/O,然后用示波器看波形时间,调整计数分频