基于STM32F405的硬件IIC+DMA操作分享

早就听说STM32的硬件IIC不好用,我个人接触到的很多项目中也都是用模拟IIC来实现对应的操作,但是最近接触到的一个项目中的OLED是IIC接口,当然原本也是用的模拟IIC来实现的刷屏操作,因此效率真的是惨不忍睹。于是就萌生了改用硬件IIC的想法。

在改用硬件IIC的时候确实领略到了STM32硬件IIC的难啃,实际上最主要就是以下一个问题:

使用硬件STM32硬件IIC经常会遇到IIC驱动死掉的情况

注意这里是IIC驱动死掉,调用发送函数会返回失败,CPU是正常运行的。抓波形可以发现一开始有正常的IIC波形,但是马上就没有了。此时STM32的硬件IIC处于busy状态,导致其放弃了后续的IIC操作。我尝试下来只能通过对IIC外设复位来解决。

在调试好IIC外设后发现IIC的DMA也不是直接就能使用。主要问题在于最后的STOP信号丢失,抓波形发现主机最后没有发送STOP信号,该问题在我调用DMA发送函数发送成功后强制控制IIC的寄存器使其发送一个STOP信号后即可解决。

由于调试时间有限并没有研究太深入,欢迎大家来讨论。若有错误的地方也希望大家进行指正。

下面附上基于STM32F405的硬件IIC与DMA操作例程:

Github
Gitee

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
STM32F405串口可以通过DMA(Direct Memory Access,直接存储器访问)来发送数据。DMA是一种硬件模块,用于在不占用CPU的情况下,实现数据在外设和内存间的直接传输。 使用DMA发送串口数据的步骤如下: 1. 配置串口的硬件参数:首先,需要设置串口的波特率、数据位、停止位、校验位等参数,并使能串口的发送功能。 2. 配置DMA通道:选择一个可用的DMA通道,并设置传输数据的方向。在本例中,我们需要发送数据,因此选择DMA通道的传输方向为从内存到外设。 3. 配置DMA传输参数:设置DMA传输的起始地址和目的地址,以及数据长度。起始地址为要发送的数据存储在内存的地址,目的地址为串口数据寄存器的地址,数据长度则表示要发送的数据的字节数。 4. 启动DMA传输:使能DMA通道进行数据传输。一旦DMA传输开始,它将自动将内存中的数据发送到串口数据寄存器中,而无需CPU的干预。 通过以上步骤,我们就可以使用DMA来发送串口数据。 需要注意的是,在使用DMA传输数据时,我们还需要确保内存中的数据在DMA传输完成之前,不会被修改。因此,可以使用信号量或其他同步机制来保证数据的完整性。 总结起来,STM32F405串口发送数据可通过配置串口硬件参数、配置DMA通道、配置DMA传输参数和启动DMA传输的步骤来完成。使用DMA可以提高数据传输效率,并减少CPU的负载。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WKJay_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值