STM32_bug总结(TIM定时中断进不去和只进1次)
一、定时中断进不去
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC_Init();
MX_TIM3_Init();
MX_TIM16_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
Remote_Init();
void Remote_Init(void) {// 启动TIM3的10us定时中断(需确保TIM3已配置为10us周期)
// __HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE);HAL_TIM_Base_Start_IT(&htim3);}
当时的情况就是Remote_Init();在MX_TIM3_Init();前面了,导致就是先开启中断,然后再配置定时器,那肯定是不对的。
二、定时中断只进1次
自动重装一定要开,然后先前的配置是PSC:80-1 ,Period:1-1
我的定时是10us,系统总频率是8KHZ,相对精度要低一点。像上图那样配置,就是PSC不能太小。可以将period(也就是ARR)变大一点。
- Period=0 时,计数器从 0 开始计数,下一个时钟周期就会溢出(因为 0+1 超过 Period=0),导致 UIF 标志被瞬间置位。
- 此时计数频率是 100kHz(10us 一次溢出),但实际中断处理需要时间(即使是空函数,也需要执行清除标志位的指令)。如果 UIF 标志被置位的速度超过了 ISR 清除标志位的速度,就会出现:
- 第一个中断触发后,ISR 还没来得及清除 UIF 标志,下一次溢出又置位了 UIF,但此时 UIF 已经是 1,不会重复触发中断(STM32 定时器的 UIF 标志是 “电平触发”,需先清 0 才能再次触发)。
- 最终表现为 “只进一次中断”(第一次中断后,UIF 未被及时清除,后续溢出无法触发新中断)。