PWM DMA 到整个 GPIO

2024-03-20

我有一个 STM32F4,我想对一个已与掩码进行“或”运算的 GPIO 端口进行 PWM 处理。

所以,也许我们想要 PWM0b00100010一段时间为 200khz,但随后,10khz 后,我们现在想要 PWM0b00010001...然后,10kHz 后,我们想要在同一 GPIO 上对其他一些掩码进行 PWM 调制。

我的问题是,如何使用 DMA 做到这一点?我正在尝试触发一个 DMA 传输,该传输将在上升沿设置所有位,然后触发另一个 DMA 传输,该传输将在下降沿清除所有位。

我还没有找到一个好的方法来做到这一点(至少使用 CubeMX 以及我对 C 和 STM32 的有限经验),因为看起来我只有机会在上升沿做一些事情。

我主要关心的问题之一是 CPU 时间,因为尽管我在上面的示例中提到了数百千赫兹,但我想让这个框架非常强大,因为它不会浪费 CPU 资源。这就是为什么我喜欢 DMA 的想法,因为它是专用硬件,可以无意识地将这里的一个单词提升到那里的一个单词之类的东西,而 CPU 可以做其他事情,比如处理 PID 的数字或其他东西。

Edit为了清楚起见:我有一组 6 个值,可以写入 GPIO。它们存储在一个数组中。 我想要做的是设置一个 PWM 定时器来在 PWM 的正宽度期间设置 GPIO,然后我希望在低周期宽度期间将 GPIO 设置为 0b00000000(如果 pwm. 因此,我需要查看上升沿何时,快速写入GPIO,然后查看下降沿何时,并向GPIO写入0。


有限的解决方案无 DMA

STM32F4 控制器有 12 个定时器,每个定时器最多有 4 个 PWM 通道,总共 32 个。其中一些可以同步启动,例如你可以有TIM1开始TIM2, TIM3, TIM4 and TIM8同时地。这是 20 个同步 PWM 输出。如果这还不够,您可以形成一个从属计时器是另一个计时器的主计时器的链,但要保持所有计时器完全同步是相当棘手的。如果几个时钟周期的偏移是可以接受的,那么就不那么棘手了。

STM32CubeF4 库示例项目部分中有几个示例,您可以从中拼凑您的设置,请查看Projects/*_EVAL/Examples/TIM/*Synchro*.

通用解决方案

通用或高级定时器(除了TIM6 and TIM7) 当计数器达到重载值(更新事件)时可以触发DMA传输and当计数器等于任何比较值时(捕获/比较事件)。

这个想法是让 DMA 将所需的位模式写入到低(设置)一半BSRR在比较事件上,以及相同的位到高(复位)一半BSRR在更新事件上。

不过有一个问题,那就是DMA1根本无法访问 GPIO 寄存器所连接的 AHB 总线(参见参考手册中的图 1 或图 2)。因此我们必须使用DMA2,这给我们留下了高级计时器TIM1 or TIM8。事情变得更加复杂,因为这些定时器的更新和比较事件引起的 DMA 请求最终会出现在不同的 DMA 流上(请参见 RM 中的表 43)。为了使其更简单,我们可以使用 DMA 2、Stream 6 或 Stream 2、Channel 0,它们组合了来自 3 个定时器通道的事件。我们可以将一个定时器通道上的比较寄存器设置为 0,而不是使用更新事件。

设置所选定时器的 DMA 流

  • 频道0
  • 单次传输(无突发)
  • 内存数据大小 16 位
  • 外设数据大小 16 位
  • no内存增量
  • 外设地址增量
  • 循环模式
  • 内存到外设
  • 外围流量控制器:我不知道,实验
  • 数据项数量 2
  • 外设地址GPIOx->BSRR
  • 内存地址指向输出位模式
  • 直接模式
  • 最后,启用通道。

现在,设置计时器

  • 设置预分频器并根据需要生成更新事件
  • 设置自动重载值以达到所需的频率
  • 将通道1的比较值设置为0
  • 将通道2的比较值设置为所需的占空比
  • 启用两个通道的 DMA 请求
  • 在两个通道上启用比较输出
  • 启用计数器

这样,每个定时器可以控制 16 个引脚,如果在主从模式下使用它们,则可以控制 32 个引脚。

要同时控制更多引脚(最多 64 个),请为通道 4 比较和定时器更新事件配置附加 DMA 流,将数据项数量设置为 1,然后使用((uint32_t)&GPIOx->BSRR)+2作为更新流的外设地址。

通道 2 和 4 可用作常规 PWM 输出,从而为您提供了 4 个以上的引脚。也许第三频道也是如此。

您仍然可以使用TIM2, TIM3, TIM4, and TIM5(每个人都可以被奴役TIM1 or TIM8)用于另外 16 个 PWM 输出,如我的文章第一部分所述。或许TIM9 and TIM12如果您能找到合适的主从设置,也可以再添加 4 个。

即有 90 个引脚同时切换。注意总电流限制。

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

PWM DMA 到整个 GPIO 的相关文章

  • 尝试使用 qemu-arm 运行arm二进制文件时如何解决“加载共享库时出错”?

    我正在运行 Linux Mint 14 并安装了 qemu qemu user 和 gnueabi 工具链 我编译了 test carm linux gnueabi gcc test c o test 当我尝试跑步时qemu arm usr
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • 为什么 GCC 交叉编译不构建“crti.o”?

    在尝试为arm构建gcc 4 x x交叉编译器时 我陷入了缺失的困境crti o文件在 BUILD DIR gcc子目录 An strace在顶层Makefile表明编译后的xgcc正在调用交联器ld with crti o 作为一个论点
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 如何将 boost::asio 与 Linux GPIO 结合使用

    我有一个单线程 Linux 应用程序 使用 boost asio 进行异步输入 输出 现在我需要扩展此应用程序以读取 GPIO 输入 sys class gpio gpioXX value 可以在边沿触发的 GPIO 输入上使用 boost
  • 让 TensorFlow 在 ARM Mac 上使用 GPU

    我已经安装了TensorFlow在 M1 上 ARM Mac 根据这些说明 https github com apple tensorflow macos issues 153 一切正常 然而 模型训练正在进行CPU 如何将培训切换到GPU
  • A64 Neon SIMD - 256 位比较

    我想将两个小端 256 位值与 A64 Neon 指令 asm 进行有效比较 平等 为了平等 我已经有了解决方案 bool eq256 const UInt256 lhs const UInt256 rhs bool result 首先 将
  • 你好世界,裸机 Beagleboard

    我正在尝试在我的 Beagleboard xm rev 上运行 hello world 类型的程序 C 通过调用 Cputs功能来自装配 到目前为止 我一直使用这个作为参考 http wiki osdev org ARM Beagleboa
  • 已编译 LKM 的互换性

    是否可以使用可加载内核模块 编译为3 0 8 mod unload ARMv5 我自制的内核 在具有版本的内核中3 0 31 gd5a18e0 SMP preempt mod unload ARMv7 安卓股票内核 该模块本身几乎不包含任何
  • 了解带有 pc 偏移的 Cortex-M 组件 LDR

    我正在查看这段 C 代码的反汇编代码 define GPIO PORTF DATA R volatile unsigned long 0x400253FC int main void Initialization code while 1
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公
  • 通过单个 GPIO 引脚转储闪存

    我正在使用 Infineon 的 XMC4500 Relax Kit 并尝试通过单个 GPIO 引脚提取固件 我非常天真的想法是通过 GPIO 引脚一次转储一位 然后用逻辑分析仪以某种方式 嗅探 数据 伪代码 while word by w

随机推荐

  • 对象化 NoClassDefFoundError

    所以我刚刚使用 Google Eclipse 插件在 Eclipse Indigo 中创建了一个新的 GAME 项目 并且我只有以下 servlet public class TestServlet extends HttpServlet
  • Git 和 Visual Studio 项目参考

    好吧 我的问题的简短版本是 当您的项目在多个解决方案之间共享时 在 Git 中处理项目引用的最佳方法是什么 我的 Git 存储库应该如何组织 长版本是 我们是一个小型开发团队 5 名开发人员 目前我们使用 TFS 作为我们的源代码控制和构建
  • 当页面的数据上下文用于其他绑定时,如何绑定到 WPF 依赖属性?

    当页面的数据上下文用于其他绑定时 如何绑定到 WPF 依赖属性 简单的问题 需要设置元素的数据上下文 XAML
  • UITableView 自动尺寸无法正常工作

    我有一个表格视图 其中填充了来自 Firebase 的数据 但是 当使用自动尺寸调整表格视图大小时 某些文本会被截断 这是我的故事板 约束设置为顶部 底部 右侧和左侧 当没有大量文本时 它工作正常 如此处所示 但是 当我用大量文本填充单元格
  • 谷歌地图 API v3 - 最近的街景

    当某个地点无法使用街景时 我想找到最近的有街景的地点 我能想到的唯一办法就是 radius 0 noOfPoints 3 while radius lt 10 miles radius radius 0 2 miles points cal
  • Prism,用Unity连接Views和ViewModels,试图理解它

    使用 Unity 创建视图和视图模型 使用 Unity 作为依赖项注入容器类似于使用 MEF 基于属性的注入和基于构造函数的注入都是 支持的 主要区别在于这些类型通常是 在运行时没有隐式发现 相反 他们必须是 已向容器注册 通常 您在视图模
  • 如何让 QFileDialog 选择并返回多个文件夹[重复]

    这个问题在这里已经有答案了 我希望用户能够选择多个文件夹 然后将这些文件夹的路径存储在列表中 我怎样才能做到这一点 我当前的 QFileDialog 如下所示 str QtGui QFileDialog getExistingDirecto
  • C++ CLI 集合初始值设定项语法

    C CLI 支持此功能吗 我想在 C CLI 中执行类似以下 C 示例的操作 var dictionary new Dictionary
  • 适用于 Java 的最佳 CLI 解析器 [重复]

    这个问题在这里已经有答案了 哪种 Java CLI 解析器比其他解析器更易于使用且可扩展性更好 以下是一些最受欢迎的 它们的功能都很齐全 使用过前两个后我可以推荐它们 公共命令行界面 http commons apache org cli
  • 使用 FOS 用户捆绑包编辑用户配置文件

    我将 symfony 2 与 FOSUserBundle 一起使用 问题是当添加用户时 当前登录的用户配置文件将被当前添加的用户替换 然后当我尝试编辑其他用户配置文件时 唯一可编辑的是当前登录的用户配置文件用户 FOSUserBundle
  • 如何在数据库中存储目录/层次/树结构?

    如何在数据库中存储目录 层次结构 树结构 即MSSQL服务器 olavk 看起来你没有看到我自己的答案 我使用的方式比递归查询好得多 p p s This is http www developerfusion co uk show 463
  • 一次附加多个 pandas 数据框[重复]

    这个问题在这里已经有答案了 我试图找到某种方法一次附加多个 pandas 数据帧 而不是使用它们一一附加 df append df 假设有 5 个 pandas 数据框t1 t2 t3 t4 t5 我如何立即附加它们 相当于 df rbin
  • 您需要从工作树的顶层运行此命令

    我正在尝试安装多蒂斯尼普斯 http www vim org scripts script php script id 2715 当我输入 cd vim git submodule add https github com SirVer u
  • 在 Windows 中生成随机文件

    有谁有办法在 Windows 中生成随机数据文件吗 我想生成 50 000 个小 2K 文件作为示例 您可以在批处理循环中运行 fsutil 以创建任意大小的文件 fsutil file createnew filename extensi
  • 如何找到所有未选中的复选框?

    在 jQuery 中 如何找到所有 未选中 的复选框 checkbox checked 似乎我所有的复选框都是选中的 但我需要的是所有未选中的复选框 您使用 not http docs jquery com Selectors not se
  • 如何在 Node JS 中编写非阻塞 if 语句?

    我在 php 中有一个 if 语句 if isTrue db record exists id else 第一个条件是真 假布尔检查 第二个条件调用一个函数来查看数据库表中是否存在一行并返回 true 或 false 我想在 Node JS
  • “exec:”python“:在$ PATH中找不到可执行文件

    我在跑步Arduino 集成开发环境 1 8 12 on Ubuntu 18 04 4 LTS 我正在尝试编译 ESP32 相机模块的示例代码 Arduino IDE 上带有默认示例的标准相机模块 但出现此错误 我认为这不是 Arduino
  • 在 C# 中将字符串转换为泛型类型(基本类型或数组)

    我想将字符串转换为给定的泛型类型T 它可以是基本类型或字符串 例如int or string 或基本类型或字符串的数组 例如int or string 我有以下功能 T Str2Val
  • 使用 PHP 中的 REST API 在 SalesForce 中创建潜在客户

    在过去的几天里 我一直在尝试通过 SalesForce 的 REST API 创建潜在客户 但我一生都无法让它发挥作用 我能够毫无问题地获得访问令牌 但从那时起 就创建潜在客户而言 我绝对没有运气 我在所有文档中不断看到 curl http
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后