关于STM32 HAL FreeRTOS 硬件I2C 遇到的问题解决

本文讲述了作者在使用STM32进行颜色识别项目中遇到的FreeRTOS与I2C通信问题,通过尝试非阻塞函数和分析任务延时,发现阻塞式HAL函数在FreeRTOS下存在冲突,特别是在与PWM等其他功能共用GPIO时。最终,通过注释掉可能引起冲突的PWM设置,I2C通信恢复正常。
摘要由CSDN通过智能技术生成

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博客

微控制器 - 在 STM32 上使用 FreeRTOS 创建从属 I2C 的正确方法是什么?- 堆栈溢出 (stackoverflo​​​​​​w.com)

  • 43
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32是一款由ST(意法半导体)公司开发的高性能32位单片机系列。它集成了丰富的外设,如串口、定时器、PWM、ADC等,同时支持多种通信接口如SPI、I2C和CAN等。STM32 HAL(Hardware Abstraction Layer)是ST公司为STM32系列开发的一套硬件抽象层,它提供了一套统一的编程接口,简化了在不同STM32芯片之间的移植工作。 FreeRTOS是一个流行的实时操作系统(RTOS),它在STM32上得到广泛的应用。它提供了多任务调度、信号量、消息队列等功能,可以帮助开发者实现复杂的任务并行处理。在STM32中使用FreeRTOS,可以充分利用STM32的多核处理能力和丰富的外设资源。 MQTT是一种轻量的消息传输协议,广泛应用于物联网领域。它通过发布和订阅模式实现消息的传输,具有简单、开销小、可靠性高的特点。在STM32中使用MQTT,可以实现与各种设备的通信,如传感器、控制器等。 综上所述,STM32 HAL是ST公司为STM32系列开发的硬件抽象层,可以方便地在不同芯片之间移植。FreeRTOS是一个实时操作系统,能够帮助开发者实现并行处理和任务调度。MQTT是一种轻量的消息传输协议,可以用于STM32与其他设备之间的通信。通过结合使用这三种技术,可以开发出高性能、可靠的物联网应用。 ### 回答2: STM32 HAL是ST公司提供的一套基于硬件抽象层的开发库,用于简化嵌入式系统的开发。HAL库提供了一系列功能丰富的函数接口,包括GPIO、UART、SPI、I2C等外设的控制接口,可以方便地对STM32单片机进行配置和控制。 FreeRTOS是一款广泛使用的开源实时操作系统(RTOS),适用于嵌入式系统的开发。FreeRTOS提供了任务管理、调度器、队列、信号量等功能,可以用于多任务的并发执行。它具有轻量、可移植、可靠等特点,广泛应用于各种嵌入式系统中。 MQTT(Message Queuing Telemetry Transport)是一种基于发布-订阅模式的轻量级通信协议,常用于物联网(IoT)应用中的设备间通信。MQTT协议使用简单、开销小,适用于带宽有限的场景。它通过客户端和代理服务器之间的消息传递实现通信,支持可靠传输和压缩技术,可以满足物联网应用对低功耗、低带宽的要求。 结合起来,使用STM32 HAL库和FreeRTOS可以实现在STM32单片机上运行MQTT协议。HAL库提供了对待控制的硬件外设的支持,可以与MQTT库进行配合,实现对设备的配置和控制。FreeRTOS提供了任务管理和调度功能,可以用于处理MQTT消息的异步接收和处理,以及与其他任务的并行执行。通过这些组件的结合使用,可以开发出功能强大、稳定可靠的物联网设备。 ### 回答3: STM32 HAL是指STM32微控制器的硬件抽象层(Hardware Abstraction Layer)。它提供了一个统一的接口,以便开发人员能够简化对STM32微控制器的底层硬件操作。通过使用HAL,开发人员可以更方便地编写可移植且易于维护的代码。 FreeRTOS是一个开源的嵌入式实时操作系统(RTOS)。它提供了任务调度、时间管理、内存管理、通信和同步机制等功能,使开发人员能够更方便地编写多任务并发的嵌入式应用程序。在STM32项目中,FreeRTOS通常与STM32 HAL一起使用,以实现高效的任务调度和资源管理。 MQTT是一种基于发布/订阅模式的轻量级消息传输协议。它被广泛应用于物联网等场景中,以实现设备之间的消息通信。MQTT具有低延迟、低能耗和网络带宽占用小等特点,非常适合在资源有限的嵌入式系统中使用。在STM32 HALFreeRTOS的基础上,使用MQTT可以实现STM32微控制器与其他设备之间的可靠、高效的通信。 总结来说,STM32 HAL提供了对STM32微控制器硬件的抽象接口,简化了底层编程;FreeRTOS是一个实时操作系统,提供了任务调度和资源管理;而MQTT是一种轻量级的消息传输协议,用于在嵌入式系统中实现设备之间的通信。这三个技术共同使用可以实现高效、可靠的嵌入式应用程序开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值