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

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

[复制链接]
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

查看全部评分

toofree 回答时间: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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版