打印

请大家帮我看看定时器的程序

[复制链接]
2488|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
neuq521|  楼主 | 2009-10-21 08:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想用STM32F103ZE的TIM2定时器做基本的定时器用,产生4ms左右的中断。定时器的初始化程序如下:
void TIM2_Configuration(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 33333;//4.165ms
  TIM_TimeBaseStructure.TIM_Prescaler = 8;//72/(8+1)=8M
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  /* TIM IT enable */
  TIM_ITConfig(TIM2, TIM_IT_Trigger, ENABLE);
  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);
}

NVIC的配置如下:
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif
  /* Enable the TIM2 gloabal Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

这样配置后程序执行时却进不了void TIM2_IRQHandler(void)中断函数,在调试器中查看TIM2发现显示时钟禁止,是怎么回事呢?

还需要设置什么地方才能进入中断呢?
沙发
香水城| | 2009-10-21 08:50 | 只看该作者
打开定时器的时钟了吗?

使用特权

评论回复
板凳
neuq521|  楼主 | 2009-10-21 09:06 | 只看该作者
如何打开定时器的时钟呢?
我在技术手册、例程中都没有找到相关的说明和语句,STM32的各个外围模块的时钟默认是关闭的吗?

使用特权

评论回复
地板
neuq521|  楼主 | 2009-10-21 09:36 | 只看该作者
TIM2的时钟已经打开,在调试器中也看到能开始循环计时,但是不能进入中断。
TIM_ITConfig(TIM2, TIM_IT_Trigger, ENABLE);这个语句不就是开启中断的吗?为什么不能进入中断呢?

使用特权

评论回复
5
lxyppc| | 2009-10-21 10:02 | 只看该作者
TIM2的时钟已经打开,在调试器中也看到能开始循环计时,但是不能进入中断。
TIM_ITConfig(TIM2, TIM_IT_Trigger, ENABLE);这个语句不就是开启中断的吗?为什么不能进入中断呢? ...
neuq521 发表于 2009-10-21 09:36

你改成TIM_IT_Update试试

使用特权

评论回复
6
neuq521|  楼主 | 2009-10-21 10:36 | 只看该作者
谢谢大家帮忙!
现在虽然已经可以进入和退出中断,但是中断程序的入口处设置断点,在调试器中观察每次刚进入中断时TIM2_CNT的值都不固定,而且大多数是0x7000以上的很大的数值,TIM2_ARR中的值为0x8235。
这是不是说明每次进入中断的时候有延时呢?怎么解释这个现象呢?
定时器是设置的向上计数模式,当TIM2_CNT计数到0x8235时溢出,然后产生更新中断,CPU转入中断服务程序,这个时间应该很短啊,为什么刚进入中断的时候TIM2_CNT就已经是个很大的值了呢?

使用特权

评论回复
7
neuq521|  楼主 | 2009-10-21 16:22 | 只看该作者
这个算不算是进入中断的时候延时了呢?
是正常的情况吗?

使用特权

评论回复
8
香水城| | 2009-10-21 16:51 | 只看该作者
调试软件需要花很长时间刷新界面显示的数据。

你可以在中断开始用程序语句读出CNT的数值,再保存到全局变量中,然后在这个语句之后设置断点,这样才能看到真实的情况。

使用特权

评论回复
9
neuq521|  楼主 | 2009-10-22 08:36 | 只看该作者
哦,好的,谢谢香主!

使用特权

评论回复
10
火箭球迷| | 2009-10-22 21:59 | 只看该作者
不太明白

使用特权

评论回复
11
gxgclg| | 2009-10-23 08:00 | 只看该作者
定时器时钟肯能有个使能位啊

使用特权

评论回复
12
xsgy123| | 2009-10-23 08:29 | 只看该作者
看不到打开定时器时钟的语句

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

97

帖子

1

粉丝