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 的相关文章

  • 使用可加载内核模块修改帧缓冲区(/dev/graphics/fb0)参数

    Problem 我必须配置 Android 平台使用的各种 LCD 显示器 几乎在所有情况下 都没有针对感兴趣的 LCD 显示器免费提供的电气规格 但通过经验和逆向工程 可以很好地猜测参数 我正在尝试使用可加载内核模块来微调显示参数 也欢迎
  • 抢占和上下文切换的区别

    一点介绍 我目前正在编写一个小型 读微型 RTOS 内核 它应该与内核中的大多数内容是一体的 然而 我找不到关于下面列出的一些事情的太多信息 这会很有帮助 除此之外 它实际上不是某种大学项目 而是我按照自己的意愿做的事情 回答所有问题的一个
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 为什么无符号类型在arm cpu中效率更高?

    我正在阅读手臂手册并提出这个建议 但没有提到原因 为什么无符号类型更快 在 ARMv4 之前 ARM 没有对加载半字和有符号字节的本机支持 要加载有符号的字节 你必须LDRB然后对值进行符号扩展 LSL那就起来吧ASR它回落 这很痛苦所以c
  • 通用 ELF 中的重定位(EM:40)

    我尝试从 Ubuntu 交叉编译到Friendly arm 但出现了奇怪的错误 root kevin VirtualBox home kevin Desktop makef make ARCH arm CROSS COMPILE arm n
  • Android 上原生的自修改代码

    我正在尝试在 Android 上制作一些自修改本机代码并在模拟器中运行它 我的示例基于 android ndk 中的 Hello JNI 示例 它看起来像这样 define NOPE LENGTH 4 typedef void FUNC v
  • 理解这部分手臂的汇编代码

    syntax unified thumb cpu cortex m4 arch armv7e m fpu fpv4 sp d16 Changes from unprivileged to privileged mode thumb func
  • ARM 汇编 SOS 中的 64 位除法

    我正在计算 16 个 64 位数字相加的平均值 我认为我已经正确完成了所有加法 但现在我需要弄清楚如何将 64 位数字除以 16 但我被困住了 任何帮助都会非常感谢你 到目前为止 这是我的代码 tableSize EQU 16 sum EQ
  • Python使用sudo启动时找不到模块

    我有一个使用 Google Assistant 库的脚本 并且必须从那里导入一些模块 我发现这只适用于 Python 虚拟环境 这真的很奇怪 在同一个文件夹中 我有一个使用 GPIO 引脚并且必须使用 root 的脚本 它们相互交互 因此当
  • glBufferSubData什么时候返回? [复制]

    这个问题在这里已经有答案了 我想将一个非常大的内存块的内容传输到足够大的 GPU 缓冲区 然后立即更改 CPU 上的内存内容 伪代码是这样的 glBindBuffer very large buffer glBufferSubData ve
  • 如何在 ARM 架构上从 RAM 运行代码

    我正在对 ARM Cortex R4 进行编程 并且有一些二进制文件 我想从 TCRAM 执行它们 只是为了看看性能的提升是否足够好 我知道我必须编写一个函数来将二进制文件复制到 RAM 这可以通过链接器脚本来完成 并且知道二进制文件的大小
  • 嵌入式 C++ (ARM9) 单元测试

    我来自 Java 和 JUnit 的世界 我演示了 Hudson 以及我使用 JUnit 取得的所有成果 我想在嵌入式设备上对 C 代码执行相同的操作 但找不到从哪里开始 该项目使用 iccarm exe IAR 编译器 进行编译 现在使用
  • 如何修改内核DTB文件

    Summary 我目前正在为定制板编译 Linux 内核 内核 模块和 DTB 以及一些定制驱动程序 有时 我会编译内核并意识到 DTB 文件中的兼容性字符串不是自定义驱动程序正在寻找的内容 现在 我可以解决此问题的唯一方法是修改 DTS
  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • C 嵌入式应用程序中 time() 函数的问题

    我在用time 在 ARM 微控制器上 处理器一到达此函数就会重新启动 奇怪的是 当我处于调试模式时 代码运行得很好 但一旦我想将其应用到独立模式 我就会遇到重置 我是否忽略了什么 这个功能有替代品吗 代码部分是这样的 include
  • ARM 中只有两个操作数的 ADD 或 SUB

    我正在学习ARM汇编语言 我读过 ADD 应该有 3 个操作数 然而 我见过很多案例 现实中只有两种 例如 STR R1 SP 0x20 var 1C LDR R1 a lua 0x1DE4E6 MOVS R0 R4 haystack AD
  • 为 ARM 交叉编译 zlib

    我尝试为arm poky linux gnueabi交叉编译zlib 但启动 make 时出现错误 zlib 1 2 11 AR HOST ar CC HOST gcc RANLIB HOST ranlib configure prefix
  • 尝试使用 qemu-arm 运行arm二进制文件时如何解决“加载共享库时出错”?

    我正在运行 Linux Mint 14 并安装了 qemu qemu user 和 gnueabi 工具链 我编译了 test carm linux gnueabi gcc test c o test 当我尝试跑步时qemu arm usr
  • 如何使用 Neon SIMD 将无符号字符转换为有符号整数

    如何转换变量的数据类型uint8 t to int32 t使用霓虹灯 我找不到执行此操作的任何内在因素 假设您想要将 16 x 8 位整数的向量转换为 4 个 4 x 32 位整数的向量 您可以通过首先解压缩为 16 位 然后再次解压缩为
  • 基于 Windows 8 ARM 的平板电脑上的 VB6

    随着 Windows 8 将支持 VB6 我的问题是 Microsoft 是否在任何地方表示 是或否 VB6 应用程序将在基于 ARM 的平板电脑上运行 如果没有 是否有任何 ARM 模拟器 以便我们可以在 Windows 8 ARM 平板

随机推荐

  • 对象化 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 然后