OpenEdv-开源电子网

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

定时器中断的问题

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-8-16
在线时间
0 小时
发表于 2011-8-16 15:13:50 | 显示全部楼层 |阅读模式
楼主的定时器中断实验的例程.在中断服务程序中有
//定时器3中断服务程序
//2ms中断1次
void TIM3_IRQHandler(void)
{                 
 if(TIM3->SR&0X0001)//溢出中断
 {
  LED1=!LED1;                             
 }      
 TIM3->SR&=~(1<<0);//清除中断标志位     
}
其中if(TIM3->SR&0X0001)是为了判断是不是溢出中断,
而运行时连同4个捕捉/比较中断都有中断请求,这样会导致非溢出的中断也会进入此服务程序中,浪费了大量的(无效)的响应时间.
可否有方法来禁止4个捕捉/比较提出中断
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-8-16 15:32:42 | 显示全部楼层
"运行时连同4个捕捉/比较中断都有中断请求,这样会导致非溢出的中断也会进入此服务程序中"
此话如何得来的?
依据在哪里?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-8-16
在线时间
0 小时
 楼主| 发表于 2011-8-16 15:45:21 | 显示全部楼层
 进入中断服务程序时 ,状态寄存器(TIMx_SR) 变成了0X1F,
也就是(TIMx_SR) 的CC4IF: CC3IF: CC2IF: CC1IF 位都变成了1

回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-8-16
在线时间
0 小时
 楼主| 发表于 2011-8-16 15:49:29 | 显示全部楼层
 如果没有其他的(无效)中断,这句if(TIM3->SR&0X0001)删掉也无妨了!!
但删掉后实际运行LED不会翻转了!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-8-16 16:41:21 | 显示全部楼层
回复【3楼】上帝之声:
---------------------------------
0X1F是初始化之后,默认设置的,应该属于硬件设计上的问题。
删除if(TIM3->SR&0X0001),我认为也是可以的,但是实际情况是:
不用JTAG仿真时不能进入中断!!
而一旦用JTAG仿真,并且在中断函数内设断点,则可以进入中断程序。

另外,加入printf等语句,则可以再次进入中断(无需JTAG设置中断,现象完全正常)。比如:
void TIM3_IRQHandler(void)
{                
//if(TIM3->SR&0X0001)//溢出中断
{
LED1=!LED1;
printf("int\r\n");                    
}    
TIM3->SR&=~(1<<0);//清除中断标志位      
}
这段代码,也是正常的。此时去掉了if(TIM3->SR&0X0001)。
又比如:
void TIM3_IRQHandler(void)

u16 t;
t=TIM3->SR;               
//if(TIM3->SR&0X0001)//溢出中断
{
LED1=!LED1;
//printf("int\r\n");                    
}
t&=~(1<<0);//清除中断标志位
   
TIM3->SR&=~(1<<0);//清除中断标志位 
TIM3->SR=t;     
}
也是能正常工作的,此时也没有if(TIM3->SR&0X0001)。

至于为什么,我也不清楚,可能与编译器或者ST的硬件设计有关。
 这个问题,可以问问ST或者MDK的人。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-8-16
在线时间
0 小时
 楼主| 发表于 2011-8-16 19:01:19 | 显示全部楼层

;定时器溢出中断-------------------------------------------------
TIM3_IRQHandler PROC
     PUSH {LR}
     LDR R2,=GPIOE_              ;GPIOE端口E基址 
     LDR R3,[R2,#0X0C]          ;GPIOA_ODR端口输出数据寄存器
     EOR R3,#0X00000001       ;LED翻转 
     STR R3,[R2,#0X0C]
     LDR R0,=TIM3_
     LDR R1,=0
     STR R1,[R0,#0X10]         ;(TIMx_SR)状态寄存器
     OP {PC}
     ENDP
用汇编这样就是不行,但断点能进入中断服务程序!!

回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-8-16
在线时间
0 小时
 楼主| 发表于 2011-8-16 19:02:45 | 显示全部楼层
 ;定时器溢出中断-------------------------------------------------
TIM3_IRQHandler PROC
     PUSH {LR}
     LDR R2,=GPIOE_              ;GPIOE端口E基址 
     LDR R3,[R2,#0X0C]          ;GPIOA_ODR端口输出数据寄存器
     EOR R3,#0X00000001       ;LED翻转 
     STR R3,[R2,#0X0C]
     LDR R0,=TIM3_
     LDR R1,=0
     STR R1,[R0,#0X10]         ;(TIMx_SR)状态寄存器
     STR R1,[R0,#0X10]         ;(TIMx_SR)状态寄存器
     OP {PC}
     ENDP
重复再插一句STR R1,[R0,#0X10]就OK了!!

回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2013-5-13
在线时间
0 小时
发表于 2013-5-27 17:43:11 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原子哥,我发现如果不清除标志位,好像也行啊,是不是置1后,硬件自己清除??
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-28 00:20:21 | 显示全部楼层
回复【8楼】luxiaojian:
---------------------------------
什么意思?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2013-5-13
在线时间
0 小时
发表于 2013-5-28 08:38:42 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
就是使用定时器进入中断,不清除中断标志位,程序也会照常进行,也会第二次再进入中断程序,我刚试了!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-28 10:17:31 | 显示全部楼层
不清楚当然会重复进入了!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 12:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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