本帖最后由 摩天轮1111 于 2015-8-11 14:26 编辑
最近练习使用TIM定时器作为延时的时钟来使用,但是发现TIM定时器好像是有bug呢?还是怎么搞的,我先说下我的思路,
main函数里面while(1)死循环,一直等待,
开启了外部触发中断,EXTI1, 其中EXTI1中断服务函数里面有个delay(ms),
然后这个ms就是和TIM关联的,也就是ARR的值,然后delay里面是while(flag)(flag初值为1,且delay函数最后一句话会重置flag为1)
在TIM的中断服务函数里面去把flag清0达到退出delay延时函数的目的,这样的思路
下面就是比较奇葩的问题了,首先把几个关键函数列上来
下面说说情况,
1.如果设置的TIM中断的优先级高于EXTI1的话,显然在EXTI 的中断服务函数里面的delay(2000)会延时2秒,我看串口显示的话,先看到ok,然后过了2秒看到you have already ,,,,,就知道这个delay(2000)执行了,实际的情况也是这样。
2.但是如果我设置的TIM的抢占优先级低于EXTI的话,实际运行的效果是,ok之后瞬间就输出you have ,,,,,,这串代码,这说明程序肯定经历了delay(2000)也肯定进去了TIM的中断服务函数,因为flag只有在那里才能变成0,然后也就是说TIM没有等2000ms,应该是立马就进入了中断服务函数,但是问题是优先级在这呢,为什么能进得去?
3.如果我设置的TIM中断服务函数里面,进入中断就关闭计数器,然后在delay里面开启计数器,那么这个时候,TIM的优先级低的话,delay(2000)是过不去的,也就是没法进入TIM的中断服务函数,如果TIM抢占优先级高的话,那是可以进入的,delay(2000)可以执行过去
4.TIM的中断,好像是一开计数,就会立马进入中断,如我TIM配置的程序里面,首先对TIM的SR的第0位清除了,也就是清除了更新标志位,这样的时候全速跑的话,配置完TIM应该是没有进入TIM中断服务函数的,不然flag为0,那个delay(4000)不会等4s,如果没有那个清除位,那么一全速跑,完全是第一步就进入TIM中断了,而且还发现这个第一部进中断的问题,他是不执行完TIM的中断服务函数里面的所有的内容,只执行到flag等于0这一句(看现象判断出来的因为它不打印TIM中断服务里面的数,jlink单步调试完全没有逻辑)
5.但是问题又来了,全速运行是不会配置完就近TIM的中断服务函数,而我进行jlink单步运行,它还是会配置完TIM之后,就立马进入TIM的中断服务函数,很奇葩,基本可以说在TIM的定时器的debug中,单步运行和全速跑都没有一样的情况,很不相符,
15 外部触发中断 timer中断嵌套实验.rar
(288.98 KB)
|