OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4469|回复: 4

tim1的定时更新中断比预期的要慢好多,RCC配置好像也没啥问题,麻烦大家帮忙看看,感激不尽!

[复制链接]

17

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2014-11-21
在线时间
11 小时
发表于 2015-1-22 18:17:06 | 显示全部楼层 |阅读模式
5金钱
求原子哥和各位论坛大虾帮忙看看,问题出在哪里。。。。。。(这个问题在我另一篇帖子里面提到了,若原子哥在这里看到,那里就先不管了吧)
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时钟*/
}
伤感了,不知道是什么原因,求各位大虾帮忙看看。。。。。。。。。。

水好深。。。。。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-22 21:35:47 | 显示全部楼层
楼主,你的串口波特率是多少?
一个printf,打印一个字节,要多少时间?
然后再去考虑你的问题吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2014-11-21
在线时间
11 小时
 楼主| 发表于 2015-1-23 10:12:27 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
同一个串口输出的,波特率都是115200
水好深。。。。。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-23 23:47:03 | 显示全部楼层
回复【3楼】woshiyunsk:
---------------------------------
输出1个字符要多久?
你在1ms中断里面,printf了多少个字符?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-3-19
在线时间
4 小时
发表于 2020-4-15 23:21:58 | 显示全部楼层
问题是因为在初始化定时器时,没有初始化TIM_ClockDivision分频因子以及没有将TIM_RepetitionCounter重复计数器的值赋值为0,会直接导致“定时器自动启动”、“重复计数”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 06:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表