久芯网

IIC通信超时函数无法正常跳出

avatar 772984087@qq.co 提问时间: 2023-07-08 16:08:04 / 未解决

程序运行到I2C_WaitOnFlagUntilTimeout时卡死,多次暂停读取HAL_GetTick()值没有变化;当把HAL_I2C_Mem_Read(size = 0),则会造成不知名问题,导致再次运行后HAL_I2C_Mem_Read(size = 2)也会停留在I2C_WaitOnFlagUntilTimeout()中,目前具体原因不详

6个回答
  • avatar 废鱼
    回答时间: 2023-07-08 16:37:11

    尝试先关闭I2C的代码,看看系统运行后,tick是否正常。如果可以,把工程上传一下,大家有相同资源的可以帮你测试一下。

  • avatar xmshao
    回答时间: 2023-07-08 17:00:15

    你总是卡死在超时处理函数,你看看是否产生了其它中断,该中断可能没有得到处理或者过于频繁产生中断,导致systick中断不能正常 进入溢出中断,尤其当systick中断优先级设置得并不高于该中断时。 这就可能发生一方面systick中断没法得到响应,另一方面超时函数又需要systick动态提供计时值,最后超时函数就在哪里死等。

  • avatar 772984087@qq.co
    回答时间: 2023-07-08 17:31:12
    xmshao 发表于 2023-2-9 11:15
    你总是卡死在超时处理函数,你看看是否产生了其它中断,该中断可能没有得到处理或者过于频繁产生中断,导致 ...

    我只保留了iic通讯任务,也会出现这种情况,很难理解当我对这个函数HAL_I2C_Mem_Read()中的size参数赋值为0后,程序跑着跑着就会卡死,systick没有输出计时(systick的抢占优先级设置为15,iic为0)。 HAL_I2C_Mem_Read()函数中有比较多的关闭/开启中断的操作,我在HAL_GetTick(void)中添加__enable_irq()也没有效果

  • avatar 772984087@qq.co
    回答时间: 2023-07-08 18:01:03
    废鱼 发表于 2023-2-8 15:32
    [md]尝试先关闭I2C的代码,看看系统运行后,tick是否正常。如果可以,把工程上传一下,大家有相同资源的可 ...

    [md]关闭IIC代码,tick工作正常,工作原因,工程不能上传

  • avatar 废鱼
    回答时间: 2023-07-08 18:33:17
    772984087@qq.co 发表于 2023-2-9 15:51
    关闭IIC代码,tick工作正常,工作原因,工程不能上传

    [md]说明是I2C错误导致的这个问题,I2C中断中是否有其他的代码?尽量优先开启tick的工作,看一下tick中断的状态,是否能够正常产生?tick中断的配置是否比I2C优先执行?

  • avatar butterflyspring
    回答时间: 2023-07-08 19:01:18
    废鱼 发表于 2023-2-9 16:17
    说明是I2C错误导致的这个问题,I2C中断中是否有其他的代码?尽量优先开启tick的工作,看一下tick中断 ...

    [md]看看I2C的代码中是否有对系统时钟的改配置的代码,或者中断优先级的代码从而影响到SYSTICK 的运行。

会员中心 微信客服
客服
回到顶部