我只想简单的测试一下STM32103RBT6的TIM4定时器溢出中断,根据设置,定时器周期居然不对,下面是我的具体设置,请教各位,问题在哪里?
时钟的设置:晶体8MHZ,SYSCLK = 72MHZ,PCLK1 = 36MHZ,下面的设置对吗? /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2);
/* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//使能USART2 ,TIM4 时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM4, ENABLE);
定时器4 寄存器的设置 TIM_TimeBaseStructure.TIM_Period = 0x00ff; //周期,重装载数值 TIM_TimeBaseStructure.TIM_Prescaler = 0; //预分频器 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //定时器输入滤波器对时钟输入的采样频率,1,2,4倍 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_CounterModeConfig(TIM4, TIM_CounterMode_Up); TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); // TIM4 中断使能 TIM_Cmd(TIM4, ENABLE);
中断函数:GPIOC输出脉宽为定时周期,按照计算应该是 (1/36)*256 = 7.1us 但是实际脉冲宽度是3.55US,查阅了很久的手册,看到《STM32F10xxx参考手册》P37时钟章节的图7 时钟树,有一个“TIM 2,3,4 ×1,2 multiplier”是不是这个乘法器的影响?但是我并没有在手册里面看到这个的说明,
void TIM4_IRQHandler(void) { static u16 temp = 0x0000; if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) { temp = ~temp; GPIO_Write(GPIOC,temp); TIM_ClearITPendingBit(TIM4, TIM_IT_Update); } } F: .jpg
|