本帖最后由 ff8zgs 于 2013-2-21 19:26 编辑
最近在用Tim1 做定时中断,发现了一个奇怪的问题,我计算5mS中断一次但实际上却是0.5s 中断一次。
代码如下,我从MCO输出sysclk时钟看是正确的50Mhz,然后PLL/2时钟也是正确25Mhz,查看寄存器RCC_CFGR 0x0001 040A Tim1_CR1=0x0000 0001 都是正确 但是在最终的板子上LED灯 闪烁情况 却相差了100倍,不明白哪里出错了,补充下,MCU是STM32F107.- void RCC_cfg(void)
- {
- //定义错误状态变量
- ErrorStatus HSEStartUpStatus;
- //将RCC寄存器重新设置为默认值
- RCC_DeInit();
- /* //打开外部高速时钟晶振25Mhz*/
- RCC_HSEConfig(RCC_HSE_ON);
- // RCC_GetSYSCLKSource();
- //等待外部高速时钟晶振工作
- HSEStartUpStatus = RCC_WaitForHSEStartUp();
- if(HSEStartUpStatus == SUCCESS)
- {
- // RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
- /*使用PLL时钟时钟源为HSE,PLL时钟频率50MHZ HSE x2*/
- RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_2);
- RCC_PLLCmd(ENABLE);
- /*设置AHB时钟为HCLK时钟 未分频=50Mhz*/
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
- /*设置高速AHB时钟(APB2)为HCLK时钟 =50Mhz*/
- RCC_PCLK2Config(RCC_HCLK_Div1);
- /*设置低速AHB时钟(APB1)为HCLK时钟 =25Mhz*/
- RCC_PCLK1Config(RCC_HCLK_Div2);
-
- while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
-
- //设置PLL为系统时钟源
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- //判断PLL是否是系统时钟
- while(RCC_GetSYSCLKSource() != 0x08);
-
- }
- //打开GPIO时钟,复用功能,串口1的时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);
- }
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- uint32_t a,b;
- /* TIM5 clock enable */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
-
- /* ---------------------------------------------------------------
- TIM4 Configuration: Output Compare Timing Mode:
- TIM2CLK = 36 MHz, Prescaler = 7200, TIM2 counter clock = 7.2 MHz
- --------------------------------------------------------------- */
- /* Time base configuration */
- //这个就是自动装载的计数值,由于计数是从0开始的,计数10000次后为9999
- TIM_TimeBaseStructure.TIM_Period = (100 - 1);
- // 这个就是预分频系数,当由于为0时表示不分频所以要减1
- TIM_TimeBaseStructure.TIM_Prescaler = (2500 - 1);
- // 高级应用本次不涉及。定义在定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)
- // 使用的采样频率之间的分频比例
- TIM_TimeBaseStructure.TIM_ClockDivision = 0;
- //向上计数
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- //初始化定时器5
- TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
- /* Clear TIM5 update pending flag[清除TIM5溢出中断标志] */
- TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
- /* TIM IT enable */ //打开溢出中断
- TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
- /* TIM5 enable counter */
- TIM_Cmd(TIM1, ENABLE); //计数器使能,开始工作
-
- a=TIM1->CR1;
- b=a+b;
- }
|