- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 STM32F4,我想对一个已与掩码进行“或”运算的 GPIO 端口进行 PWM 处理。
所以,也许我们想要以 200khz 的频率 PWM 0b00100010
一段时间,但是,10khz 后,我们现在想要 PWM 0b00010001
...然后,10kHz 后,我们想要在同一个 GPIO 上对其他一些掩码进行 PWM 调制。
我的问题是,如何使用 DMA 做到这一点?我正在尝试触发一个 DMA 传输,该传输将在上升沿设置所有位,然后触发另一个 DMA 传输,该传输将在下降沿清除所有位。
我还没有找到一个好的方法来做到这一点(至少使用 CubeMX 以及我在 C 和 STM32 方面的有限经验),因为看起来我只有机会在上升沿做一些事情。
我主要关心的问题之一是 CPU 时间,因为尽管我在上面的示例中提到了数百千赫兹,但我想让这个框架非常健壮,因为它不会浪费 CPU资源...这就是为什么我喜欢 DMA 的想法,因为它是专用硬件,可以无意识地将这里的一个单词提升到那里的一个单词之类的东西,而 CPU 可以做其他事情,比如处理 PID 的数字或其他东西。 p>
编辑为了清楚起见:我有一组 6 个值,可以写入 GPIO。它们存储在一个数组中。我想要做的是设置一个 PWM 定时器来在 PWM 的正宽度期间设置 GPIO,然后我希望在低周期宽度期间将 GPIO 设置为 0b00000000(如果 pwm.因此,我需要查看上升沿何时,快速写入GPIO,然后查看下降沿何时,并向GPIO写入0。
最佳答案
没有 DMA 的有限解决方案
STM32F4 Controller 有 12 个定时器,每个定时器最多有 4 个 PWM channel ,总共 32 个。其中一些可以同步启动,例如您可以让 TIM1
同时启动 TIM2
、TIM3
、TIM4
和 TIM8
。这是 20 个同步 PWM 输出。如果这还不够,您可以形成一个从属计时器是另一个计时器的主计时器的链,但要保持所有计时器完全同步是相当棘手的。如果几个时钟周期的偏移是可以接受的,那么就不那么棘手了。
STM32CubeF4 库示例项目部分中有多个示例,您可以从中拼凑您的设置,请查看 Projects/*_EVAL/Examples/TIM/*Synchro*
。
通用解决方案
当计数器达到重载值(更新事件)时,通用或高级定时器(除 TIM6
和 TIM7
之外的所有定时器)都可以触发 DMA 传输和当计数器等于任何比较值(捕获/比较事件)时。
这个想法是让 DMA 在比较事件上将所需的位模式写入 BSRR
的低(设置)一半,并将相同的位写入 的高(重置)一半更新事件上的 BSRR
。
但有一个问题,DMA1
根本无法访问 GPIO 寄存器所连接的 AHB 总线(参见引用手册中的图 1 或图 2)。因此,我们必须使用 DMA2
,这样我们就可以使用高级定时器 TIM1
或 TIM8
。事情变得更加复杂,因为由这些定时器的更新和比较事件引起的 DMA 请求最终会出现在不同的 DMA 流上(请参见 RM 中的表 43)。为了使其更简单,我们可以使用 DMA 2、Stream 6 或 Stream 2、Channel 0,它们组合了来自 3 个计时器 channel 的事件。我们可以将一个定时器 channel 上的比较寄存器设置为 0,而不是使用更新事件。
设置所选定时器的DMA流
GPIOx->BSRR
现在,设置计时器
这样,每个定时器可以控制 16 个引脚,如果在主从模式下使用它们,则可以控制 32 个引脚。
要同时控制更多引脚(最多 64 个),请为 channel 4 比较和定时器更新事件配置附加 DMA 流,将数据项数量设置为 1,并使用 ((uint32_t)&GPIOx->BSRR)+2
作为更新流的外设地址。
channel 2 和 4 可用作常规 PWM 输出,为您提供了 4 个以上的引脚。也许 channel 3 也是如此。
您仍然可以使用 TIM2
、TIM3
、TIM4
和 TIM5
(每个都可以从属于TIM1
或 TIM8
)用于另外 16 个 PWM 输出,如我的帖子第一部分所述。如果您能找到合适的主从设置,也许还有 TIM9
和 TIM12
,还有 4 个。
即同时切换 90 个引脚。注意总电流限制。
关于arm - PWM DMA 到整个 GPIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46613053/
虽然找到了许多关于如何使用 GPIO.BCM 模式设置 gpio 的示例(其中引脚编号等效于 RPI(参见图像和 nvidia/jetson-gpio),但我找不到在 GPIO.TEGRA_SOC 模
我一直在努力编写一个脚本,该脚本将 Pi 的 BCM 引脚 17、27 和 10 打开 1 秒,然后关闭 1 秒,连续 100 次。当我运行脚本时,LED1 会亮起然后熄灭,程序因以下错误而关闭: T
我想使用 linux GPIO 驱动程序来处理 mpc8308 处理器的 GPIO 引脚之一作为输出。所以我启用了 GPIO 驱动程序并在以下位置进行调试: Device Drivers ---> G
我正在开发一个项目,需要我配置 GPIO 引脚并向原子板添加传感器。内核已配置 gpio ... CONFIG_GPIO_SYSFS=y 是内核选项之一。 我使用的是fedora版本2.6.29-10
我真的很担心我的 GPIO 可能被烧坏了,因为即使是这个 super 简单的代码也会导致错误 import RPi.GPIO as io import time io.setmode(io.BCM)
我尝试将 RPi.GPIO 与 Python 3.6 一起使用。 我安装了 RPi.GPIO,它适用于 Python 3.4,但不适用于 Python 3.6 我得到这个错误: ModuleNotFo
默认情况下,/sys/class/gpio 只能作为 root 访问。所以我喜欢一个新组gpio可以使用/sys/class/gpio下的文件和目录。为此,我将以下行添加到 /etc/rc.local
我已经阅读了 RPi.GPIO 的文档,并在谷歌和 SO 上进行了搜索,但无法完全找到可能是一个非常愚蠢的问题的解决方案。我试图只检测按下按钮的边缘。但无论我是否指定寻找“下降”或“上升”边缘,Pi
我正在编写一个程序来读取 GPIO 引脚的温度。不幸的是,访问这些总是会抛出 ModuleNotFoundError:没有名为“RPi”的模块。 我尝试重新安装它们,但没有成功。 异常(excepti
我正在使用 Raspberry pi 和 java 来使用 pi4j 使 LED 闪烁,一切都已清除并且工作正常,LED 按照代码闪烁但是当我第二次运行时它会导致以下错误,我搜索了很多有很多相同的问题
所以我一直在尝试通过使用命令行和 sysfs 写入和读取 /sys/class/gpio/ 让我的 Raspberry Pi GPIO 正常运行。根据以下教程,我无法复制将 GPIO 设置为输出并将其
我正在使用 Q7 模块 (x86) 并尝试在 Linux 上使用 ACPI SSDT 覆盖配置我们的外围设备。但我与它斗争。我想我误解了 ACPI 的一些核心概念。 问题 CPU -> I2C ->
我正在尝试在 Raspberry PI 上使用 nodejs 从连接的光传感器读取值。我可以读取 python 程序的读数,并可以确认我的设置是正确的。 下面是程序 var gpio = requir
我正在从事密室逃脱项目。实际上,我试图创建的行为如下: 网络浏览器以通常的方式显示网络应用程序的一部分。从此时起,客户端上将不再有键盘/鼠标的输入。我已经使用 JS 解决了基于时间的更改,因此我可以加
我的代码在使用 raspberry pi 时遇到问题。我刚开始使用 Python,所以我需要一些帮助。 这是代码: import RPi.GPIO as GPIO import time GPIO.s
我遇到了和这个问题一样的问题, python import fails when called from PHP但现在是我的另一个导入。 脚本在命令行 (python uit.py) 和一个 test
现在使用旧方法 gpio-sunxi 如何在 OrangePi PC plus ( SoC H3 ) 上访问 Armbian 3.4.113 上的 GPIO并编辑 .fex -file 已过时(想分享
在 Android 和 Linux 下使用传统的 sysfs GPIO 过程的第一步是脚趾 export您要使用的特定 GPIO 引脚。当您完成 GPIO 引脚到 unexport它。 我一直在寻找关
PHYTEC 的内核版本 3.12.30-AM335x-PD15.1.1。 如果我使用/sys/class/gpio 方式,我可以看到按钮输入引脚(AM3359 的 gpio103)值从 0 变为 1
从以前已知的 sysfs 接口(interface),任何人都可以设置合理配置的 GPIO 线的输出,并且此输出将保持该值,直到 SoC 重置或有人更改线值。使用 GPIOlib,当消费者关闭 gpi
我是一名优秀的程序员,十分优秀!