1.情况介绍:
因为某个项目想要颜色识别,去识别球的颜色,但是又不想多来个摄像头,所以想尝试一下颜色传感器的方案。但是经过尝试,HAL库生成的 FreeRTOS 硬件 I2C 读写一直在报错。 刚好手头上有九轴陀螺仪的例程代码。最后用FreeRTOS 硬件 I2C 读取数据。
2.过程
这里提到了阻塞式 HAL 函数( HAL_I2C_Master_Transmit(带超时)对 RTOS 不友好,因为它们不会“告诉”RTOS 它们正忙于等待(MCU 使用)某个条件。如果您需要更高的效率,您可以使用非阻塞 IT或_DMA 函数,实现中断和完成回调。
参考:Solved: I2C implementation based on freeRTOS OS - STMicroelectronics Community
任务切换导致I2C出错 - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)
确实在我使用阻塞式(HAL_I2C_Master_Transmit)时,在第一次跑 I2C 任务时,它的接收是非常正常的,能够在正常接收20次左右,就来 HAL_I2C_ERROR_AF 报错了,然后一直死锁发不出去。我一开始还想偷懒,因为阻塞式函数的时候,数据正常接收,看看能不能对函数进行稍微的修改,让其跳过AF报错。但是读了上面的文章之后突然就想尝试 IT 和 DMA 。但是我手上有一份开发板的例程是使用阻塞式来读写的,我确认了一下,FreeRTOS确实是可以通过阻塞式来读写的。于是想着先继续研究阻塞式了。
这边例程中用的是:HAL_I2C_Mem_Read 我看了底层,跟 HAL_I2C_Master_Receive 是一样的
那我就开始大胆尝试,小心求证了。我之前是生成了一份没有 FreeRTOS 使用硬件 I2C 读取数据的。首先把代码先备份一份。然后将没有 FreeRTOS 的代码用 cubeMX 配置为使用 FreeRTOS 。仅创建了三个任务,一个是默认 defaultTask 任务,一个是 I2C_Test 任务,一个是 IDLE 任务(模拟其他需要运行的任务)。
amazing啊!I2C没有报错了。ErrorCode没了。就是数据不更新,库函数也没有报错。
然后我看了一圈下来都没问题,还记得上一篇提到的博客,作者的他的 FreeRTOS 说是添加了延时,原文是这样的:发现是由于循环执行太快,数据堵塞导致的问题。于是我就修改了一下任务延时,果然数据就出来了。然后我把统计了一下任务的FPS,测试出了临界帧率(个人视情况不同)
参考:解决STM32 I2C接口死锁在BUSY状态的另一种原因和方法_i2c时钟使能后busy
我自己测出来的 FPS 不能超过62,否则会造成数据堵塞。后来我满心欢喜把这个移到正在使用代码里面,数据又没了, I2C 还报错,ErrorCode 变回了 HAL_I2C_ERROR_AF。然后我就知道我原来里面的代码有东西在底层影响了 I2C 。后来排查到是这个冲突了。
__HAL_TIM_SetCompare(&htim10, TIM_CHANNEL_1, pwm);
一个是 PWM,一个是 I2C,真的是没理由啊。随后我看了这两的引脚。是不是这两在同一组GPIO就相互影响了?反正我这是暂时排除不了。大佬救救我!
这是我把 __HAL_TIM_SetCompare 注释掉之后的效果,没有问题。
3.结语
阻塞式已经能够正常接收发送了,那我的任务就已经结束,IT 和 DMA 我就没去尝试了。希望以上内容对你有帮助,有什么不对的地方还请多多指点。
还有 PWM 和 I2C 的问题,希望大佬救我!
参考:
STM32 I2C 从设备 DMA方式读写稳定工作,记录以下方法。_stm32 i2c dma-CSDN博客
STM32F103学习笔记(1)——FreeRTOS下模拟I2C_freertos i2c-CSDN博客
STM32 I2C调试过程心得记录_i2c_initstruct.i2c_analogfilter-CSDN博客文章来源:https://www.toymoban.com/news/detail-830130.html
微控制器 - 在 STM32 上使用 FreeRTOS 创建从属 I2C 的正确方法是什么?- 堆栈溢出 (stackoverflow.com)文章来源地址https://www.toymoban.com/news/detail-830130.html
到了这里,关于STM32 HAL FreeRTOS 硬件I2C 使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!