本帖最后由 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;
}
|