请教定时器中断中更新中断和计数器中断的区别问题

2019-07-21 07:21发布

            
书上给的例子是500ms的计时,每次传入的形参是4999(arr),那意思是不是就是每次从4999开始递减,减到0便进入中断,可是也没见设置计数器的计数方向是向下计数,还有这个更新中断和计数器中断有什么区别,为啥这里面还要弄一个允许更新中断。比喻51里面,我给一个重装值,使能定时器中断允许位,那么当这个数加到了65536就可以触发定时器中断。类比STM32,对于那个计数方向的设置和其他相关使能位还能理解,但是对于冒出这么一个更新中断很是不理解,不知道他放在这里有啥优点,又能解决啥问题。


上面这个图是不是也说明计数器溢出自己就会触发中断,不需要弄个更新事件中断?拜托学懂了的人帮忙提点一下。谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
33条回答
shuidi_wangdan
1楼-- · 2019-07-22 03:37
回复【7楼】正点原子:
---------------------------------
谢谢原子哥,原来是这样!
BULELJ
2楼-- · 2019-07-22 08:42
回复【7楼】正点原子:
---------------------------------
原子哥,我这想用定时器1作为定时器3的主定时器,并且在定时器3的终端里完成相应的功能,
RCC->APB1ENR|=1<<1;     // TIM3时钟使能    
TIM3->ARR=40000; // 设定计数器自动重装值, 是40000个MCLK时钟
TIM3->SC=0;
TIM3->SMCR=0x0007; // Timer1的OC1的更新事件来触发 
TIM3->DIER|=0X41;   //允许触发中断,更新中断
 MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占2,子优先级2,组2
中断函数
void TIM3_IRQHandler(void)
{              
if(TIM3->SR&0x00001) //更新中断UIF
{
biaoji=1;
}
 TIM3->CR1&=~(0x01); //停止定时器3
 TIM3->SR&=~(1<<0);//清除中断标志位
}
这样设置对吗?而且我的程序里面USB的中断返回不了,USB_istr()这个函数一直在执行。不知什么情况。
正点原子
3楼-- · 2019-07-22 12:39
 精彩回答 2  元偷偷看……
BULELJ
4楼-- · 2019-07-22 14:01
回复【10楼】正点原子:
---------------------------------
原子哥,例程里面有两句
TIM3->DIER|=1<<0;   //允许更新中断
TIM3->DIER|=1<<6;   //允许触发中断 
不能随便同时开启,比如主从模式,如果同时开启了,会一直进触发中断。我在这个问题上困了好长时间。
正点原子
5楼-- · 2019-07-22 14:22
回复【11楼】BULELJ:
---------------------------------
这里不需要开2个了。。。
开启更新中断即可。
超酷小子
6楼-- · 2019-07-22 16:25
原子哥,我有个问题问你一下,我现在需要两个定时器,一个是整个系统要用的,另外一个是给ADC转换用的,两个会不会冲突,而且两个时间也不一样

一周热门 更多>