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

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 关于#极限编程#的问题,请各位专家解答!
  • ¥20 win11账户锁定时间设为0无法登录
  • ¥45 C#学生成绩管理系统
  • ¥15 VB.NET2022如何生成发布成exe文件
  • ¥30 matlab appdesigner私有函数嵌套整合
  • ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!