STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

2024-04-30

我想问一下,在以下情况下,STM32 中的 DMA SPI rx 会如何表现? 我有一个指定的(例如)96 字节数组,名为 A,用于存储从 SPI 接收到的数据。我打开循环 SPI DMA,它对每个字节进行操作,配置为 96 字节。 是否有可能,当 DMA 填充我的 96 字节数组时,传输完成中断将关闭,以快速将 96 字节数组复制到另一个 - B,然后循环 DMA 开始写入 A(并销毁 B 中保存的数据) ? 我想通过 USB 快速将 B 中的数据传输到 PC(每次我从 A 获取新数据到 B 时)。

我只是在想如何通过 USB 将连续的数据流 SPI 从 STM32 传输到 PC,因为我认为每一定时间通过 USB 传输一次 96 字节的数据块比通过 STM32 将实时 SPI 流传输到 USB 更容易?我不知道这是否可能


为此,您必须能够保证在接收下一个 SPI 字节并将其传输到缓冲区开头之前复制所有数据。这是否可行取决于处理器的时钟速度和 SPI 的速度,并且能够保证不会发生可能延迟传输的更高优先级中断。为了安全起见,它需要非常慢的 SPI 速度,在这种情况下可能根本不需要使用 DMA。

总而言之,这是一个坏主意,而且完全没有必要。 DMA 控制器有一个“半传输”中断正是用于此目的。当传输前 48 个字节时,您将收到 HT 中断,并且在复制时 DMA 将继续传输剩余的 48 个字节下半部分缓冲。当您完成转移后,您将转移上半部分。这将传输数据的时间从单个字节的接收时间延长到 48 个字节的接收时间。

如果每次传输实际上需要 96 个字节,那么只需将缓冲区设置为 192 个字节长 (2 x 96)。

在伪代码中:

#define BUFFER_LENGTH 96
char DMA_Buffer[2][BUFFER_LENGTH] ;

void DMA_IRQHandler()
{
    if( DMA_IT_Flag(DMA_HT) == SET )
    {
        memcpy( B, DMA_Buffer[0], BUFFER_LENGTH ) ;
        Clear_IT_Flag(DMA_HT) ;
    }
    else if( DMA_IT_Flag(DMA_TC) == SET )
    {
        memcpy( B, DMA_Buffer[1], BUFFER_LENGTH ) ;
        Clear_IT_Flag(DMA_TC) ;
    }
}

关于通过 USB 将数据传输到 PC,首先您需要确保 USB 传输速率至少与 SPI 传输速率一样快或更快。 USB 传输可能不太确定(因为它是由 PC 主机控制的 - 也就是说,只有当主机明确要求时,您才能在 USB 上输出数据),因此即使average如果传输速率足够,则可能存在需要进一步缓冲的延迟,因此您可能需要一个循环缓冲区或 FIFO 队列来为 USB 提供数据,而不是简单地从 DMA 缓冲区 A 复制到 USB 缓冲区 B。另一方面,如果你已经有了缓冲区DMA_Buffer[0], DMA_Buffer[1] and B您已经有效地拥有了三个 96 字节块的 FIFO,这可能就足够了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 传输结束时,循环 DMA 外设到存储器的行为如何? 的相关文章

  • 处理嵌入式系统中的堆栈溢出

    在嵌入式软件中 如何以通用方式处理堆栈溢出 我遇到过一些确实以硬件方式提供保护的处理器 例如最近的 AMD 处理器 维基百科上有一些技术 但这些是真正实用的方法吗 任何人都可以给出一个在当今 32 位嵌入式处理器的所有情况下都适用的明确建议
  • Qt 的 sysroot 和前缀选项的实际示例是什么

    我正在查看可以运行的所有选项configureQt 提供的脚本 特别是 qt everywhere opensource src 5 2 0 经过大量搜索后 我确定这些东西充其量记录很少 所以我希望我能得到一些帮助 当我查看描述时prefi
  • Linux 源代码中的哪个位置会识别特定的 USB 设备?

    我有一个特定的 USB 设备 我想检查其 Linux 驱动程序源代码 我的理解是 USB 驱动程序执行的第一步是注册自己能够处理具有特定供应商 ID 和产品 ID 的设备 就我而言 供应商 ID 是0BDA产品 ID 是8187 有了这些信
  • libusb 和轮询/选择

    我正在使用 Linux 操作系统 想知道是否有任何文件描述符可以轮询 选择 当数据等待从 USB 设备读取时会触发这些文件描述符 我也在使用 libusb 库 但尚未找到可以使用的文件描述符 Use libusb 的轮询函数 http li
  • 如何随时暂停 pthread?

    最近我开始将 ucos ii 移植到 Ubuntu PC 上 我们知道 在pthread的回调函数中的 while 循环中简单地添加一个标志来执行暂停和恢复是不可能模拟ucos ii中的 进程 的 如下解决方案 因为ucos ii中的 进程
  • Delphi - 如何获取 USB 可移动硬盘和记忆棒的列表?

    在我的应用程序 Delphi 中 我需要列出所有 USB 存储设备 这些可以是闪存棒or外部存储驱动器 有一个Jvcl成分JvDriveCombo 并且它有DriveType属性 问题是我是否选择DriveType Fixed那么除了外部驱
  • 如何在 ADB 连接期间禁用电池充电?

    问题描述 每次我在电脑和手机之间连接 USB 线时 电池都会自动充电 我想使用 ADB 协议 但我不想在 ADB 连接期间为电池充电 是否可以关闭此充电功能 当然 我该怎么做呢 环境 Android 操作系统 4 及更高版本的手机 我只需要
  • 有没有办法通过 WiFi 部署/调试 Cordova Android Ionic 应用程序? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 这是一个双胞胎this https stackoverflow com questions 46596236 is there a w
  • 用于嵌入式系统的简约人类可读序列化格式解析器

    By 人类可读的序列化格式 I mean YAML JSON INI或喜欢 请注意 XML对于我的目的来说太冗长而且太不方便 所以让我们把它作为最后的手段 格式应将数据存储为 命名键 值 配对并允许嵌套和数组 不过 缺少数组并不重要 此外
  • 无法在 BeagleBone Green Wireless 上配置 SPI0

    注 所选答案为解决该问题的原始答案 更多详细信息请参阅下面的补充答案 我无法在 BeagleBone Green Wireless BBGW 上配置 SPI0 我试图在不使用覆盖层的情况下实现这一目标 仅使用纯 DeviceTree dev
  • 我可以将 SQL Server 安装在 USB 驱动器上吗?

    我是一名开发人员 如果可以的话 我经常远程工作 而不是通勤上班 我希望能够随身携带开发数据库环境 我知道我可以远程访问数据库 但速度很慢 我有时在没有无线连接的地方工作 有任何想法吗 是的 这是可能的 看this http social m
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • IntelliJ IDEA 中的 Android 开发导致电脑死机

    我使用 IntelliJ IDEA 10 5 进行 Android 开发 并使用最新的 Google USB 驱动程序 版本 4 进行调试 在 IntelliJ IDEA 中开发一段时间后 当通过 USB 连接 Android 设备 Nex
  • Swift 上的 USB 连接委托

    Swift 中是否有一个代表可以让我的班级知道何时通过计算机的 USB 插入新设备 我想知道我的程序何时可以使用新设备 Eric Aya 的答案已经相当不错了 但这里有一个 Swift 3 的改编 我把大部分丑陋的东西包裹在一个USBWat
  • 如何在没有竞争条件的情况下将两个 32 位计数器读取为 64 位整数

    内存 0x100 和 0x104 是两个 32 位计数器 它们代表一个 64 位定时器并且不断递增 如何正确读取两个内存地址并将时间存储为 64 位整数 一种错误的解决方案 x High y Low result x lt lt 32 y
  • 作为附件的 Android 设备

    我有 2 个 Android 设备 我想用 USB OTG 电缆连接它们 并在两个设备之间进行来回通信 据我了解 一台 Android 设备将充当 USB 主机 运行 4 4 的 Nexus 7 另一台 Android 设备将充当 USB
  • 是否“static/extern uint8_t array[2] = {0};”符合ANSI C规范吗?

    我对以下代码有疑问 include all needed h static uint8 t array 2 0 void main void 是否允许按上述方式初始化 模块 全局数组 以便在符合 ANSI C 的情况下将每个成员设置为零 我
  • GDB 脚本编写为 MOCK

    我正在尝试使用 GDB 模拟一个函数 用于单元测试父函数 一种方法是在您想要模拟和使用 GDB 的函数中设置一个断点return命令 但是当 GDB 时我无法做同样的事情call使用命令 gdb b secret check Breakpo
  • Android Honeycomb 3.2 通过 USB 检测 MTP 连接

    我看到其他关于检测 USB 连接的帖子 但他们没有具体讨论 MPT 只是更一般的检测 所以我想我应该具体询问 MTP 我通过 USB 将 Xoom 连接到计算机 并且希望我的应用程序在建立 MTP 连接时写出一个文件 当 USB 断开且 M
  • Linux中根据USB VID:PID获取设备路径

    如果我插入一个设备 比如说 dev ttyUSB0我想知道号码0基于其 VID PID 通过lsusb 我怎样才能在 C Linux 中做到这一点 我有这个代码来查找一台打印机设备 如果有帮助的话 int printer open void

随机推荐