if(TIM3->SR&0X0001)

2019-07-20 05:49发布

在定时器中断中,我的中断处理函数如下:
=================================
void TIM3_IRQHandler(void){

/*
中断处理函数:
*/

/*思考:为何加了这条语句才行?不加不行?*/
// if(TIM3->SR&0X0001){
PFout(8) = !PFout(8);
// }


/*
在中断里边最后记得清中断标志:
*/
TIM3->SR &= ~(1 << 0);


====================================

在上述中断函数中,若没有加if(TIM3->SR&0X0001)这条语句,
那么蜂鸣器始终不会响,若加了if(TIM3->SR&0X0001)这条语句,
那么蜂鸣器才会如程序中所示,正常工作;理论上,不加这条if语句,
蜂鸣器也会隔一段时间响一次的,但看到的 事实是蜂鸣器根本不会响;
各位,有遇到过这种情况么?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
烟酒不沾
1楼-- · 2019-07-20 07:13
 精彩回答 2  元偷偷看……
willsmith
2楼-- · 2019-07-20 10:31
回复【2楼】烟酒不沾:
---------------------------------
今天搞了我大半个中午,哈哈,之后加上这条语句,就行得通了,这个程序理论上不加这条if语句也是可以的,
难道这是STM32的一个Bug么?
Watmin
3楼-- · 2019-07-20 11:04
我记得好像是:因为产生中断会使标志位置位,因此进入中断后要清除该标志位,否则一直中断。
 sr&0x0001应该可以清除标志位
willsmith
4楼-- · 2019-07-20 14:15
 精彩回答 2  元偷偷看……
正点原子
5楼-- · 2019-07-20 15:26
用delay代替if判断试试。
yuwezyu
6楼-- · 2019-07-20 16:09
正点原子 发表于 2015-12-14 23:48
用delay代替if判断试试。

我换成延迟10ms也行,应该是硬件上的问题

一周热门 更多>