STM32 HAL FreeRTOS 硬件I2C 使用

这篇具有很好参考价值的文章主要介绍了STM32 HAL FreeRTOS 硬件I2C 使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 任务(模拟其他需要运行的任务)。

STM32 HAL FreeRTOS 硬件I2C 使用,stm32,单片机

amazing啊!I2C没有报错了。ErrorCode没了。就是数据不更新,库函数也没有报错。

STM32 HAL FreeRTOS 硬件I2C 使用,stm32,单片机

然后我看了一圈下来都没问题,还记得上一篇提到的博客,作者的他的 FreeRTOS 说是添加了延时,原文是这样的:发现是由于循环执行太快,数据堵塞导致的问题。于是我就修改了一下任务延时,果然数据就出来了。然后我把统计了一下任务的FPS,测试出了临界帧率(个人视情况不同

参考:解决STM32 I2C接口死锁在BUSY状态的另一种原因和方法_i2c时钟使能后busy

STM32 HAL FreeRTOS 硬件I2C 使用,stm32,单片机

自己测出来的 FPS 不能超过62,否则会造成数据堵塞后来我满心欢喜把这个移到正在使用代码里面,数据又没了, I2C 还报错,ErrorCode 变回了 HAL_I2C_ERROR_AF。然后我就知道我原来里面的代码有东西在底层影响了 I2C 。后来排查到是这个冲突了。

 __HAL_TIM_SetCompare(&htim10, TIM_CHANNEL_1, pwm);

一个是 PWM,一个是 I2C,真的是没理由啊。随后我看了这两的引脚。是不是这两在同一组GPIO就相互影响了?反正我这是暂时排除不了。大佬救救我!

STM32 HAL FreeRTOS 硬件I2C 使用,stm32,单片机

这是我把 __HAL_TIM_SetCompare 注释掉之后的效果,没有问题。

STM32 HAL FreeRTOS 硬件I2C 使用,stm32,单片机

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)文章来源地址https://www.toymoban.com/news/detail-830130.html

到了这里,关于STM32 HAL FreeRTOS 硬件I2C 使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于STM32硬件I2C HAL_I2C_Mem_Read,在I2C_WaitOnTXISFlagUntilTimeout返回HAL_ERROR

    在使用NUCLEO-L452RE开发版的IIC总线作为主机和其他设备从机通信时主机IIC在以下代码处返回HAL_ERROR. /* Wait until TXIS flag is set */   if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)   {     return HAL_ERROR;   } 在调试中发现如果使用模拟IIC,可以与从机正常通信,但是使用硬件

    2024年04月28日
    浏览(16)
  • STM32 SHT40驱动源码(使用硬件I2C)

    目录 简介: SHT40.c: SHT40.h 测试结果:         SHT40是瑞士Sensirion公司推出的第四代温湿度传感器,内部集成加热器用于去除表面微小液滴。集成I2C接口,典型的相对湿度精度1.8%RH,典型温度精度0.2℃,运行在0-100%RH和-40-125℃的环境中。 主控:STM32H7B0VBT6 平台:STM32CubeIDE SHT4

    2024年03月19日
    浏览(36)
  • STM32硬件I2C通信外设

    本文主要介绍stm32自带的I2C通信外设,对比与软件模拟I2C,硬件I2C可以自动生成时序,时序的操作更加及时规范,可以实现更加高性能的IIC通信。 本文内容与I2C软件通信有诸多类似之处,I2C软件通信可见:https://blog.csdn.net/qq_53922901/article/details/136662006?spm=1001.2014.3001.5501 在8位指

    2024年04月08日
    浏览(56)
  • STM32 HAL库 STM32CubeMX -- I2C(IIC)

    I2C 通讯协议(Inter - Integrated Circuit) 也就是IIC; 由Phiilps 公司开发的,它引脚少,硬件实现简单,可扩展性强,不需要USART、CAN 等通讯协议的外部收发设备。 I2C协议分为物理层和协议层。 物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输

    2023年04月16日
    浏览(18)
  • STM32 HAL库函数学习 I2C篇

    本篇内容讲述STM32的硬件IIC功能。硬件IIC的使用在F1系列上可能会有问题。本次使用的测试平台是H7,用于AT24C02芯片的读写正常,暂不清楚在其他芯片上使用是否正常。 1、HAL_StatusTypeDef HAL_I2C_Init (I2C_HandleTypeDef * hi2c) I2C初始化函数,使用CubeMx生成。需要选中I2C硬件指定的IO口。

    2023年04月08日
    浏览(13)
  • 【STM32】入门(七):I2C硬件控制方式

    之所以叫“I2C硬件控制方式”是与“软件控制方式”相对。I2C软件控制,就是写程序直接操作两个GPIO引脚,分别作为时钟线SCL和数据线SDA,按照I2C协议的时序要求,操作GPIO输入、输出、高电平、低电平。 听着就很复杂,好在STM32中有I2C的硬件实现,即通过简单的操作寄存器

    2023年04月08日
    浏览(19)
  • 4针0.96寸OLED的HAL库代码(硬件I2C/全代码/stm32f1/CubeMX配置/包含有正负浮点数/100%一次点亮)

    一、HC-SR04超声波模块的使用 二、4针OLED的HAL库代码介绍及使用(本篇) 三、7针OLED的HAL库代码介绍及使用 四、编码电机以及双电机驱动 更多有意思的文章点击“我的主页” --------😐 更多有意思的视频 ----- B站 @想要亿只独角兽 --------😐 之前在做一些小项目时用到了OLED,到

    2024年02月10日
    浏览(14)
  • 【STM32】STM32学习笔记-硬件I2C读写MPU6050(35)

    I2C(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 串行的 8 位双向数据传输位速率在标准模式下可

    2024年01月25日
    浏览(22)
  • STM32之I2C总线知识和HAL库函数

    一、 I2C总线知识 I2C总线物理拓扑结构 I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来 产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接

    2024年02月21日
    浏览(19)
  • STM32基于CubeMX与HAL库的I2C应用

    1.1 物理层         I2C协议和摩托罗拉公司的SPI协议一样,是一种通讯协议。串行外围设备接口,是一种高速全双工的通信总线,是由 Phiilps 公司开发的。由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内

    2024年02月21日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包