近日在将一使用hal库硬件IIC工程移植到rtt操作系统中时,出现了一些错误,分享如下。
在使用hal库IIC的读函数HAL_I2C_Mem_Read时,发现程序一直卡在I2C_WaitOnFlagUntilTimeout函数里,原因是I2C_WaitOnFlagUntilTimeout函数里有这样一句
if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)),如下图所示:
而调用HAL_GetTick函数返回值是uwTick,而uwTick的增加需要调用HAL_IncTick函数。
原来HAL_IncTick函数在滴答定时器中断中被调用,而在操作系统接管了滴答定时器后,uwTick的值便不再增加。这也导致了一些使用了hal库延时函数HAL_Delay的程序不能正常运行。
解决办法:1找到rtt文件夹下board.c文件中被接管的SysTick_Handler函数,将HAL_IncTick函数手动添加进去:
2:重新创建一个定时器,作为hal库的滴答定时器用。
如使用stm32cubemx直接勾选下列选项,这里选择了定时器7:
或者手动初始化一个定时器,将HAL_IncTick函数添加进它的中断服务函数里。
另外如果程序可以运行但就是无法读出数据,可以参考以下文章:
https://blog.csdn.net/zhanglifu3601881/article/details/82462519