OpenEdv-开源电子网

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

通用定时器检查中断标志位

[复制链接]

22

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
416
金钱
416
注册时间
2014-2-27
在线时间
71 小时
发表于 2014-4-15 16:50:57 | 显示全部楼层 |阅读模式
请教一个问题。
在通用定时器实验的定时器中断中,寄存器操作的时候    if(TIM2->SR&0x01)  把这个判断注释掉,就会出问题。
而库函数操作的时候把    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) 注释掉就没事。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-15 18:01:36 | 显示全部楼层
回复 支持 反对

使用道具 举报

22

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
416
金钱
416
注册时间
2014-2-27
在线时间
71 小时
 楼主| 发表于 2014-4-15 18:09:40 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
定时500ms,中断中让led灯翻转,库函数的时候灯正常闪,也就是500ms进一次中断。而寄存器的时候不是每500ms一进中断,所以加检测中断标志位才行。
这个是寄存器的中断函数
[mw_shl_code=c,true]void TIM2_IRQHandler() { // if(TIM2->SR&0x01) led=~led; TIM2->SR&=~(1); } [/mw_shl_code]
这个是库函数的中断函数
[mw_shl_code=c,true]void TIM2_IRQHandler() { // if(TIM_GetITStatus(TIM2,TIM_FLAG_Update)==SET) led=~led; TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update); }[/mw_shl_code]
后者可以正常1s1闪,前者不行
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-16 00:31:56 | 显示全部楼层
回复【3楼】xgzxgyf:
---------------------------------
在TIM2->SR&=~(1);
后面添加:delay_us(1);应该就好了。
这是由于清除SR寄存器,需要一点时间去完成,如果还没清除,就执行退出中断服务函数的指令,则会导致清除失败,库函数采用的函数调用来清除,时间明显比:TIM2->SR&=~(1);来的久,所以库函数可以正常,寄存器不行。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
416
金钱
416
注册时间
2014-2-27
在线时间
71 小时
 楼主| 发表于 2014-4-16 08:53:22 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
嗯,加个延时果然可以了。也就是说它执行TIM2->SR&=~(1);的时候就退出中断了,而不是执行完了才退出中断,不知道可不可以这样理解。
可是我还是有一点不清楚,如果中断标志位清除失败会怎么样啊,会再次进入中断吗?那么上面那个标志位判断的语句不注释为什么就可以啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-16 14:45:46 | 显示全部楼层
回复【5楼】xgzxgyf:
---------------------------------
是会再次进入中断。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
416
金钱
416
注册时间
2014-2-27
在线时间
71 小时
 楼主| 发表于 2014-4-16 21:19:06 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
可是我还是不理解,如果不加延时而是加一句 if(TIM2->SR&0x01) 判断的话也是可以正常运行的。总觉得这句话对程序没有影响。可能是我想多了,嘿嘿。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-16 23:14:45 | 显示全部楼层
回复【7楼】xgzxgyf:
---------------------------------
你可以看看刚进入中断的时候,SR的值。
就明白了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
416
金钱
416
注册时间
2014-2-27
在线时间
71 小时
 楼主| 发表于 2014-4-17 13:29:46 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
软件仿真刚进入中断是0x01,j-link仿真刚进入中断是0x1f。软件仿真清除标志位后出了中断SR就是0了。而j-link仿真清除标志位后出了中断SR就又变成0x1f了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-17 21:49:14 | 显示全部楼层
回复【9楼】xgzxgyf:
---------------------------------
恩,我仿真也是这个情况,比较怪异,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
416
金钱
416
注册时间
2014-2-27
在线时间
71 小时
 楼主| 发表于 2014-4-18 09:53:19 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
嗯,那就不纠结了,知道怎么用就好了。谢谢原子哥。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-10 03:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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