OpenEdv-开源电子网

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

定时器中断问题:这个程序按道理是不能进入中断服务函数的的,但实际却能进入,到底为什么呢?

[复制链接]

3

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-4-27
在线时间
0 小时
发表于 2015-6-7 21:48:29 | 显示全部楼层 |阅读模式
5金钱
这个程序是别人的一个项目里的,程序的定时器部分里使能的是输出比较中断,并没有使能更新事件中断
在Keil的调试模式看了下TIM3的ARR寄存器的值为0x0063,CCR1寄存器的值为0x0064,DIER寄存器的值为0x0002,也就是并没有开启更新事件中断,按道里TIM3计数到了99后就会自动变成0重新计数,那么就永远无法计数到100,即永远不能触发中断函数,但是实际上他的板子跑起来中断函数是正常运行的,这让我十分疑惑,他的中断是怎么触发的呢?难道输出比较那里设置的100指的是计数了100次就触发中断而不是计数值为100时才触发?
希望原子哥或者各位解疑老师帮忙看下这个程序,解答下我的疑问,先在此谢谢了!

void TIM3_init(void)
{
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef  TIM_OCInitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
 
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);

 TIM_TimeBaseStructure.TIM_Period = 99;       
 TIM_TimeBaseStructure.TIM_Prescaler = 7199;     
 TIM_TimeBaseStructure.TIM_ClockDivision = 0x00;   
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
 
 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;        
 TIM_OCInitStructure.TIM_Pulse =100;  
 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    
 TIM_OC1Init(TIM3, &TIM_OCInitStructure);
 
 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);   //禁止预装载寄存器

 TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );

 TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
 
 TIM_Cmd(TIM3, ENABLE);
}

void TIM3_IRQHandler(void) /*timer interupt:time=((1+TIM_Prescaler )/72M)*(1+TIM_Period )*/ 
{
     if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
    {
   
     }
}

最佳答案

查看完整内容[请看2#楼]

TIM_TimeBaseStructure.TIM_Period = 99;  0~99 = 100次 至於為什麼沒進中斷 會不會是你編譯器把他優化掉了 看你裡面都沒寫函數
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-6-7 21:48:30 | 显示全部楼层
TIM_TimeBaseStructure.TIM_Period = 99; 
0~99 = 100次

至於為什麼沒進中斷 會不會是你編譯器把他優化掉了
看你裡面都沒寫函數
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-8 00:11:42 | 显示全部楼层
进入中断,你查看下SR寄存器,就知道是哪个触发了中断了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-4-27
在线时间
0 小时
 楼主| 发表于 2015-6-8 19:27:42 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
在timer.c的中断服务函数TIM3_IRQHandler里设置断点后,为啥程序运行不进去呢,要怎么设置才能在debug下进入中断啊?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-8 22:35:26 | 显示全部楼层
回复【3楼】yungealong:
---------------------------------
说明没中断发生。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-4-27
在线时间
0 小时
 楼主| 发表于 2015-6-9 07:54:33 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
但是我在中断函数里设置了每1s刷新OLED的显示,实际程序跑起来能进入中断啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-9 23:30:11 | 显示全部楼层
回复【5楼】yungealong:
---------------------------------
可能你的定时时间没到。所以没进入中断。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 18:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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