单片机定时器中断后计数器和中断再进入

本文详细探讨了单片机定时器中断的工作机制,包括中断后计数器的行为,中断嵌套处理,以及如何在中断服务例程中正确处理时间敏感任务,避免中断丢失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、单片机定时器中断后计数器是否还会计数

解决:单片机定时器中断后计数器还是会计数的,如果重新赋值,会按照设置的时间进行计时。如果没有,则从0开始。

2、单片机在执行定时器中断时,是否在没执行当前中断情况再次执行定时器中断(中断嵌套?)

解决:中断在执行时,如果又有一个中断产生,将不会进入中断函数,知道当前中断执行结束后,才允许下一个新的中断进入。

总结:定时器中断在执行中断过程中,计数器一直计数,但是产生的中断不能进入中断函数。只有上一个中断结束后,才会发生新的中断进入。

测试:

单片机:stc12c5a60s2

软件:keil

串口软件:stc-isp

思路:在定时中断执行函数中使用串口打印0-9,采用两次打印,它们之间间隔1s,定时中断时间是10ms。通过查看串口发送的数据,如果是相同的数字两两相邻,表示延迟1s过程中中断没有再次进入;如果数字是连续而且很快显示出来的,表示在延迟1s的过程中多次进入了中断。

代码:

void time0_inter() interrupt 1{
	//2msʱ¼ä
	TF0 = 0;
	TH0 = 0xF8;
  TL0 = 0x30;
	adc.transFlag++;
	if(adc.transFlag>=10){
		adc.transFlag=0;
	}
	uart0_send_byte('0'+adc.transFlag);
	//²âÊÔ¶¨Ê±ÖжÏʱÊÇ·ñ»á¼ÌÐø¼ÆÊ±
	delay1s();
	uart0_send_byte('0'+adc.transFlag);
	
	//´ò¿ªADC
	adc_switch(ADC_OPEN);
}

结果:

                                     

由结果可以看出:定时器在延迟1s的过程中没有多次进行定时中断函数执行。

可以得出的结论是:

如果在定时中断执行函数中处理的时间超过定时时间,那么会出现中断丢失的问题,即需要进行中断处理时,由于上一个中断还未结束,失去这个时间点需要处理执行指令的机会。

如果中断函数执行处理的时间小于定时中断时间,那么就能够在下一次中断到来之前结束本次中断,这样新来的中断就能够执行需要的处理指令。

### 滴答定时器中断函数不执行的原因分析 滴答定时器(SysTick Timer)是一种简单易用的计时工具,在嵌入式开发中常用于实现周期性的任务调度或延迟功能。如果发现滴打定时器中断函数未能正常执行,可能涉及以下几个原因: #### 1. **未正确配置系统时钟** 如果系统时钟未被正确初始化,则可能导致滴答定时器无法按照预期频率运行。通常情况下,滴答定时器时间基准依赖于 `SystemCoreClock` 的值[^3]。因此,需确认以下几点: - 是否调用了 `SystemInit()` 函数来初始化系统时钟。 - 是否通过 `SysTick_Config(SystemCoreClock / freq)` 正确设置了滴答定时器的重装载值。 #### 2. **中断优先级设置不当** STM32 的 NVIC(Nested Vectored Interrupt Controller)负责管理中断优先级。如果其他高优先级中断持续占用 CPU 资源,可能会导致滴答定时器中断得不到及时响应。这种现象尤其常见于多中断场景下[^2]。可以通过调整中断优先级解决该问题,例如降低其他外设中断的抢占优先级。 #### 3. **未使能滴答定时器中断** 配置完成后,还需确保启用了滴答定时器中断请求。这一步骤可通过如下代码完成: ```c SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; ``` #### 4. **未挂载中断服务程序** 即便硬件层面已启用中断,但如果未注册对应的中断处理函数,仍然不会有任何实际效果。对于滴答定时器而言,默认的服务例程名称为 `SysTick_Handler`,需要开发者自行编写逻辑并将其链接至向量表中。例如: ```c void SysTick_Handler(void) { // 用户自定义逻辑 } ``` --- ### 解决方案 针对上述提到的各种可能性,可以采取以下措施逐一排查并修复问题: #### 方法一:验证时钟配置 重新检查项目中的时钟树结构以及相关寄存器状态,确保核心时钟频率与期望一致。可借助调试工具观察实时数据流变化情况。 #### 方法二:优化中断优先级分配策略 合理规划各模块之间的相对重要程度,并据此设定不同的抢占级别子优先级组合参数。具体操作方法参见官方手册关于 NVIC 寄存器组描述部分的内容说明。 #### 方法三:强制开启 Systick 中断允许位 即使某些条件下默认状态下也可能自动打开这一选项,但从稳健角度出发建议显式指定命令行语句以增强可靠性。 #### 方法四:绑定正确的 ISR 处理入口地址 最后也是最容易忽略的一环就是忘记关联特定事件所对应的动作序列集合体——即所谓的“回调机制”。务必保证两者之间建立起清晰无误的关系链路关系。 --- ### 示例代码片段 以下是基于 HAL 库的一个典型应用案例展示如何正确启动并利用 Systick 定时特性达成毫秒级精度延时目标的功能实现方式之一: ```c #include "stm32f1xx_hal.h" void SystemClock_Config(void); uint32_t uwTicks; int main(void){ HAL_Init(); SystemClock_Config(); if (SysTick_Config(HAL_RCC_GetHCLKFreq()/1000)){ Error_Handler(); } while(1){ Delay_ms(500); /* Call custom delay function */ } } // Custom delay implementation leveraging global variable tracking remaining time slices. void Delay_ms(uint32_t ms){ uint32_t start_time = uwTicks; while ((uwTicks - start_time) < ms); } /* Hook into the default handler provided by CMSIS core files to update tick count periodically.*/ void SysTick_Handler(void){ HAL_IncTick(); } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值