OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4422|回复: 2

STM32F429IGT6定时器2更新中断问题

[复制链接]

2

主题

3

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2022-3-21
在线时间
5 小时
发表于 2022-8-4 17:05:18 | 显示全部楼层 |阅读模式
1金钱
我通过寄存器初始化了定时器2,代码如下
SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);
WRITE_REG(TIMx->PSC, 9000);
WRITE_REG(TIMx->ARR, 10000);

MODIFY_REG(TIMx->CR1, TIM_CR1_CEN, (0x1 & TIM_CR1_CEN));
NVIC_SetPriorityGrouping(0x5);
NVIC_EnableIRQ(TIM2_IRQn);
NVIC_SetPriority(TIM2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 3, 3));
SET_BIT(TIMx->DIER, TIM_DIER_UIE);
经测试可以进入中断函数,在中断函数中实现LED取反操作,发现LED状态没有改变。中断函数如下
void TIM2_IRQHandler(void)
{

  red_Led = ~red_Led;
  CLEAR_BIT(TIM2->SR, TIM_SR_UIF);
}
而后在中断函数中加入串口输出,代码如下
void TIM2_IRQHandler(void)
{
  red_Led = ~red_Led;
  printf("1\r\n");
  CLEAR_BIT(TIM2->SR, TIM_SR_UIF);
}

可以看到串口助手输出了两次1。
后来查询数据手册发现有一个叫重复计数器的寄存器也会产生更新中断,所以尝试将代码改成如下
void TIM2_IRQHandler(void)
{
  red_Led = ~red_Led;
  printf("1\r\n");
  CLEAR_BIT(TIM2->SR, TIM_SR_UIF);
  TIM2->RCR = 0;
}


发现现像正常,后改成原子例程的形式
void TIM2_IRQHandler(void)
{
  if(READ_BIT(TIM2->SR, TIM_SR_UIF) == TIM_SR_UIF){
    red_Led = ~red_Led;
    CLEAR_BIT(TIM2->SR, TIM_SR_UIF);
  }
  printf("1\r\n");
}


发现现像也是正常的。
那么问题就出现了
  第一,定时器2并没有RCR这个寄存器,为什么每次清中断后将这个寄存器写0就没有问题了。
  第二,按原子例程中的,判断一下标志位现象就正常了,也没有连续两次进入中断的现象。
不理解是为什么,希望有知道的大神帮着解答一下,谢谢。

最佳答案

查看完整内容[请看2#楼]

清中断标志位放在最后可能导致进两次中断. 因为中断清理这个动作需要时间 可能你退出之后中断还没清完 导致又进了中断. 把clearbit放在一进中断就好了. 给它一点时间完成.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

89

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2020-6-12
在线时间
303 小时
发表于 2022-8-4 17:05:19 | 显示全部楼层
清中断标志位放在最后可能导致进两次中断.  因为中断清理这个动作需要时间 可能你退出之后中断还没清完 导致又进了中断.   把clearbit放在一进中断就好了. 给它一点时间完成.
回复

使用道具 举报

2

主题

3

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2022-3-21
在线时间
5 小时
 楼主| 发表于 2022-8-5 08:28:12 | 显示全部楼层
rektito 发表于 2022-8-4 19:53
清中断标志位放在最后可能导致进两次中断.  因为中断清理这个动作需要时间 可能你退出之后中断还没清完 导 ...

谢谢,按照你说的,果然可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-8 15:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表