黄心禹 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 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。