OpenEdv-开源电子网

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

TIM2_Init(71,999);//1ms中断一次 问下大家,1ms定时器中断应该咋理解啊?是每经过1ms就进入一次中断吗?

[复制链接]

43

主题

109

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1163
金钱
1163
注册时间
2019-10-22
在线时间
226 小时
发表于 2023-2-28 12:36:43 | 显示全部楼层 |阅读模式
1金钱
如果程序多1ms之内不能完成任务会怎样呢



int main()
{
        SystemInit();                                            //系统时钟72MHz
        SysTick_Config(SystemCoreClock/1000);        /* SysTick 1 msec interrupts */
        TIM2_Init(71,999);//1ms中断一次
        USARTInit(9600);//波特率为9600
        while(1)
        {
                USART1Hanndle();
        }
}
void USART1Hanndle(void)
{
        if(!UartFlagStC.UART1Flag) return;
       
        printf("%s\r\n",UartFlagStC.UART1String);

        memset(UartFlagStC.UART1String,0,160);
        UartFlagStC.UART1Counter = 0;
        UartFlagStC.UART1Flag = 0;
}

void TIM3_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
                {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志

                        USART1InsetTimer();
                }
}

void USART1InsetTimer(void)
{
        if(UartFlagStC.usart1_start == 1)
        {
                UartFlagStC.usart1_counter++;
                if(UartFlagStC.usart1_counter >USART_COUNTER_9600)
                {
                        UartFlagStC.UART1Flag = 1;
                        UartFlagStC.usart1_counter = 0;
                        UartFlagStC.usart1_start = 0;
                }
        }
}


最佳答案

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

按照你现在的代码,每1ms进入TIM3中断,在中断中执行USART1InsetTimer();函数,如果UartFlagStC.usart1_start为1的话,会执行UartFlagStC.usart1_counter++;操作。不过建议你在TIM3中断中仅进行标志位赋值的操作,设一个标志位flag,进入中断后flag=1,主循环中检测flag,flag=1时再执行USART1InsetTimer();函数,USART1InsetTimer()里面清除flag。 中断函数内部的处理是需要快进快出的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

94

帖子

0

精华

高级会员

Rank: 4

积分
934
金钱
934
注册时间
2017-4-8
在线时间
111 小时
发表于 2023-2-28 12:36:44 | 显示全部楼层
Xiuer666 发表于 2023-2-28 15:44
那我的这个  USART1InsetTimer();函数放在void TIM3_IRQHandler(void)  这个定时器中断函数里面了,定时 ...

按照你现在的代码,每1ms进入TIM3中断,在中断中执行USART1InsetTimer();函数,如果UartFlagStC.usart1_start为1的话,会执行UartFlagStC.usart1_counter++;操作。不过建议你在TIM3中断中仅进行标志位赋值的操作,设一个标志位flag,进入中断后flag=1,主循环中检测flag,flag=1时再执行USART1InsetTimer();函数,USART1InsetTimer()里面清除flag。 中断函数内部的处理是需要快进快出的。
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2676
金钱
2676
注册时间
2018-11-8
在线时间
431 小时
发表于 2023-2-28 13:32:03 | 显示全部楼层
1ms进一次中断 如果中断里再执行1ms以上的内容 退出时应该是立刻进入下一次中断 也就是永远在中断服务这里 出不去了
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2023-2-28 15:04:35 | 显示全部楼层
中断内的任务尽量短,不行就置标志,在主循环处理
回复

使用道具 举报

43

主题

109

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1163
金钱
1163
注册时间
2019-10-22
在线时间
226 小时
 楼主| 发表于 2023-2-28 15:44:24 | 显示全部楼层
  那我的这个  USART1InsetTimer();函数放在void TIM3_IRQHandler(void)  这个定时器中断函数里面了,定时器1ms中断一次,那UartFlagStC.usart1_counter++是每过1ms加一吗
回复

使用道具 举报

43

主题

109

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1163
金钱
1163
注册时间
2019-10-22
在线时间
226 小时
 楼主| 发表于 2023-2-28 16:57:06 | 显示全部楼层
Mascreda 发表于 2023-2-28 15:58
按照你现在的代码,每1ms进入TIM3中断,在中断中执行USART1InsetTimer();函数,如果UartFlagStC.usart1_s ...

快进快出的意思是中断里面不到1ms就办完事儿了,假如0.5ms就办完事儿了,就会迅速跳出
中断执行其他任务,然后又过了0.5ms再次进入中断里面吗
回复

使用道具 举报

5

主题

94

帖子

0

精华

高级会员

Rank: 4

积分
934
金钱
934
注册时间
2017-4-8
在线时间
111 小时
发表于 2023-2-28 17:38:54 | 显示全部楼层
Xiuer666 发表于 2023-2-28 16:57
快进快出的意思是中断里面不到1ms就办完事儿了,假如0.5ms就办完事儿了,就会迅速跳出
中断执行其他任务 ...

看看这个帖子能不能解决你的疑惑   https://blog.csdn.net/weixin_459 ... 64355-null-null.142^v73^wechat_v2,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%AD%E6%96%AD%E8%A6%81%E5%BF%AB%E8%BF%9B%E5%BF%AB%E5%87%BA&spm=1018.2226.3001.4187
回复

使用道具 举报

5

主题

94

帖子

0

精华

高级会员

Rank: 4

积分
934
金钱
934
注册时间
2017-4-8
在线时间
111 小时
发表于 2023-2-28 17:41:36 | 显示全部楼层
Xiuer666 发表于 2023-2-28 16:57
快进快出的意思是中断里面不到1ms就办完事儿了,假如0.5ms就办完事儿了,就会迅速跳出
中断执行其他任务 ...

一次中断仅执行1次,中断处理函数中需要将本次中断标志清除 TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志,下一次中断出触发才会再次进入中断函数。
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2676
金钱
2676
注册时间
2018-11-8
在线时间
431 小时
发表于 2023-2-28 18:32:25 | 显示全部楼层
Xiuer666 发表于 2023-2-28 16:57
快进快出的意思是中断里面不到1ms就办完事儿了,假如0.5ms就办完事儿了,就会迅速跳出
中断执行其他任务 ...

是 如果中断耽误0.5ms 那下次进中断就只剩0.5ms了 所以中断里要快嘛
如果想让两次中断中间稳定1ms 可以关掉定时器的自动重装载 计满一次数就进中断停下来 等中断处理完以后再开定时器 这样下次又是等1ms才进中断
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 17:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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