你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

为何中断服务会出现这样的情况

[复制链接]
bucker 提问时间:2019-3-19 20:34 /
先上代码        TIM2->DIER = TIM_DIER_UIE;
        TIM2->PSC = 8399;
        TIM2->ARR = 4999;
        TIM1->CR1 = TIM_CR1_CEN;
以上为定时器的初始化代码,84MHz的时钟,开启更新中断。


void TIM2_IRQHandler(void)
{
        GPIOB->ODR ^= 1;
        TIM2->SR &= ~TIM_SR_UIF;
}

401RC的工程,一个TIM2的更新中断执行上面代码会出现一次中断重复进入服务程序的问题。GPIOB.0控制一个LED,应该每0.5秒进入一次中断服务服务程序,LED闪烁。但实际上LED状态是不变的,要么恒亮,要么恒灭。中断服务中用断点调试再单步调试可以看到LED的状态反转,在程序中加一个计数器,发现连续运行时计数器总是偶数状态。后来,将语句顺序调整为:
void TIM2_IRQHandler(void)
{
        TIM2->SR &= ~TIM_SR_UIF;
        GPIOB->ODR ^= 1;
}

即先清除SR中的标志,中断响应就完全正常了。请问,语句顺序有那么大的作用吗。

收藏 评论6 发布时间:2019-3-19 20:34

举报

6个回答
tanic 回答时间:2019-3-22 09:14:32
本帖最后由 tanic 于 2019-3-22 09:16 编辑

void TIM2_IRQHandler(void)只是中断入口
内部需要判断发生的是啥中断   
需判断是否为updata中断建议用库

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

huangyanga 回答时间:2019-3-22 09:35:19
初始化时候怎么出现了TIM1?不是用TIM2么。就佩服现在还会用寄存器的

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

七哥 回答时间:2019-3-22 11:04:09
中断服务程序的正常执行套路:
1、先判断标志;2、在清标志;3、在干活
21.png

你可以在清标志后面,加一小点延时。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

bucker 回答时间:2019-3-22 19:03:08
toofree 发表于 2019-3-22 11:04
中断服务程序的正常执行套路:
1、先判断标志;2、在清标志;3、在干活

我也有这样的疑虑,就是担心清除表之后内核延迟,导致系统再次进入中断。
bucker 回答时间:2019-3-22 19:04:11
huangyanga 发表于 2019-3-22 09:35
初始化时候怎么出现了TIM1?不是用TIM2么。就佩服现在还会用寄存器的

这代码不是工作用的,是临时在网上输入的。
bucker 回答时间:2019-3-22 19:07:05
tanic 发表于 2019-3-22 09:14
void TIM2_IRQHandler(void)只是中断入口
内部需要判断发生的是啥中断   
需判断是否为updata中断建议用库: ...

习惯用寄存器方式。通过实验发现,用判断标志在进行相关操作,最后再清除标志也是不会错。但是,中断服务程序还是会重复进入,在判断执行区域内和外各设一个计数器,就会发现两个计数器的值不一样。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版