黄心禹 2023-02-02 01:51 采纳率: 100%
浏览 39
已结题

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);
}
不知道原因是什么,求解答
  • 写回答

1条回答 默认 最新

  • m0_54204465 2023-02-02 07:48
    关注

    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中断的优先级比主函数的低一些。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月10日
  • 已采纳回答 2月2日
  • 创建了问题 2月2日

悬赏问题

  • ¥15 FIR滤波器算法设计与实现(利用库函数firdec()
  • ¥15 利用单片机产生正弦信号,来测量差分放大电路放大倍数和共模放大倍数的思路和仿真
  • ¥60 关于mavlink的论文咨询
  • ¥66 定制开发肯德基自动化网站下单软件
  • ¥15 中科院研发的TextMind(文心)
  • ¥20 vscode虚拟环境依赖包未安装
  • ¥15 odoo17关于owl开发js代码问题
  • ¥15 光纤中多普勒频移公式的推导
  • ¥15 怎么制作一个人脸识别门禁系统
  • ¥20 大华dss监控平台网络关闭登不进去