STM32中使用TIM中断会影响GIPIO端口吗?

STM32中使用TIM中断会影响GIPIO端口吗?
一开始没有TIM中断时正常运行:
    SYSTICK_DelayInit();
    SYSTICK_Cmd(true);
    ds1302_init();
    lcd_Init();
//    Timer_Init();

    while(1){
        ds1302_read_realTime();
        lcd_write_word(0x01,10,DS1302_data_1);
        lcd_write_word(0x40,11,DS1302_data_2);
    }

img

增加TIM中断后,lcd不显示,直接甚至用GPIO进行输出都无结果

如:


    SYSTICK_DelayInit();
    SYSTICK_Cmd(true);
    ds1302_init();
    lcd_Init();
    Timer_Init();

    while(1){
//        ds1302_read_realTime();
//        lcd_write_word(0x01,10,DS1302_data_1);
//        lcd_write_word(0x40,11,DS1302_data_2);
        PAout(6)=1;
    }
}

img

PA6仍为低电平

void Timer_Init(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    
    TIM_InternalClockConfig(TIM3);
    
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period = 1999;     
    TIM_TimeBaseInitStructure.TIM_Prescaler = 8999;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
    
    TIM_ClearFlag(TIM3, TIM_FLAG_Update);
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
    
    TIM_Cmd(TIM3, ENABLE);
}
不知道原因是什么,求解答

STM32中使用TIM中断可能会影响GPIO端口,具体原因可能是TIM中断优先级较高,导致代码执行顺序发生变化,导致GPIO端口不正常输出。你可以尝试调整TIM中断的优先级,或者在TIM中断函数中加入保护代码,以防止中断函数对主函数的影响。在TIM中断函数中使用信号量或者互斥量来防止中断函数对主函数的影响。

例如:

void TIM3_IRQHandler(void)
{
//检测TIM3更新中断标志
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
//清除TIM3更新中断标志
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//加入保护代码
    osSemaphoreWait(Semaphore_TIM, osWaitForever);

    //在此处写入TIM中断函数的代码
    ...

    //释放保护代码
    osSemaphoreRelease(Semaphore_TIM);
}

另外,你也可以通过调整TIM中断的优先级来避免与主函数的冲突。可以在TIM中断初始化函数中修改NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 和 NVIC_InitStructure.NVIC_IRQChannelSubPriority的值,使TIM中断的优先级比主函数的低一些。