求原子哥和各位论坛大虾帮忙看看,问题出在哪里。。。。。。(这个问题在我另一篇帖子里面提到了,若原子哥在这里看到,那里就先不管了吧)
tim1本设置为1ms的更新中断,可是时间拉的好长,用tim2对比一下,tim2快好多,当tim2的计数值是tim1的200倍时,其响应频率才基本一致。。。。。。。
void TIM1_Init(void) //实现1ms定时后输出
{
// TIM1_GPIO_Init(); //不接通外部通道,所以不用初始化引脚
TIM1_TimeBase_Init();
// TIM1_OC_Init(); //不接通外部通道,所以不用初始化输出通道
TIM1_NVIC_Init();
TIM1_Start();
}
void TIM1_TimeBase_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_DeInit(TIM1);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 1; //当定时器从0计数到1,实现1ms的定时
TIM_TimeBaseStructure.TIM_Prescaler = 35999; //设置预分频:不预分频,即为72MHz 转为 2KHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
}
void TIM1_NVIC_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
//中断分组初始化
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM1更新中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6; //先占优先级6
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_ARRPreloadConfig(TIM1, ENABLE); // 使能TIM1重载寄存器
TIM_GenerateEvent(TIM1,TIM_EventSource_Update); // 产生软件更新事件,立即更新数据
TIM_ClearFlag(TIM1,TIM_FLAG_Update); //清除标志位。定时器一打开便产生更新事件,若不清除,将会进入中断
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);//允许更新中断
}
void TIM1_Start(void)
{
TIM_Cmd(TIM1, ENABLE); //使能定时器1
}
void TIM1_UP_IRQHandler(void)
{
printf("-->timer1<-------\r\n");
TIM_ClearITPendingBit(TIM1, TIM_IT_Update); //清除中断标志位
}
void TIM2_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_DeInit(TIM2);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 399;//999; //当定时器从0计数到999,实现0.5s的定时
TIM_TimeBaseStructure.TIM_Prescaler = 35999; //设置预分频:不预分频,即为72MHz 转为 2KHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//中断分组初始化
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_ARRPreloadConfig(TIM2, ENABLE); // 使能TIM2重载寄存器
TIM_GenerateEvent(TIM2,TIM_EventSource_Update); // 产生软件更新事件,立即更新数据
TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除标志位。定时器一打开便产生更新事件,若不清除,将会进入中断
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//允许更新中断
/* TIM2 enable counter */
TIM_Cmd(TIM2, ENABLE); //使能定时器2
}
void TIM2_IRQHandler(void)
{
printf("timer2\r\n");
}
这上面所看到的两组数值配置下,两个定时器的输出频率才基本一致。。。。。。。。。。
怀疑是RCC配置的问题,可是RCC配置如下,也没什么问题呀:
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus; /* 定义枚举类型变量 HSEStartUpStatus */
RCC_DeInit(); /* 复位系统时钟设置*/
RCC_HSEConfig(RCC_HSE_ON); /* 开启HSE 外部高速晶振*/
HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* 等待HSE起振并稳定*/
if(HSEStartUpStatus == SUCCESS) /* 判断HSE起是否振成功,是则进入if()内部 */
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
RCC_PCLK2Config(RCC_HCLK_Div1); /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
RCC_PCLK1Config(RCC_HCLK_Div2); /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
FLASH_SetLatency(FLASH_Latency_2); /* 设置FLASH延时周期数为2 */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 使能FLASH预取缓存 */
RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9); /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
RCC_PLLCmd(ENABLE); /* 使能PLL */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /* 等待PLL输出稳定 */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 选择SYSCLK时钟源为PLL */
while(RCC_GetSYSCLKSource() != 0x08); /* 等待PLL成为SYSCLK时钟源 */
}
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); /* 打开APB2总线上的GPIOA时钟*/
}
伤感了,不知道是什么原因,求各位大虾帮忙看看。。。。。。。。。。
|