- 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/
我有一个关于 Arduino 的一般性问题,如何每秒使用 AnalogRead() 读取一定次数的传感器值。每秒说 10 次,并且还不断地向电机输出 PWM。 如果我尝试延迟循环(),它会影响我与 A
我正在使用 iMX6Q SD 板。而且我必须访问背光驱动程序来控制背光对比度。如何从用户空间或内核空间访问? (背光PWM驱动路径为drivers/video/backlight/pwm_bl.c)。
这应该是一个简单的公式,但我无法理解。 我有一个 16mHZ AVR 芯片。 我需要运行一个 24kHZ 的 PWM 信号.. 决定最佳预分频器的公式是什么。 我正在使用 16 位定时器。 最佳答案
我试图将PWM用于端口B的任何引脚上的ATmega8上的LED。设置计时器一直很烦人,我不知道该如何处理OCR1A。这是我的代码,我希望收到一些反馈。 我只是想弄清楚如何使用PWM。我知道这个概念,O
我一直在 ATMega328P 上试验 PWM 波形生成模式。我得到了一些奇怪的结果,我无法确定是我编写固件的方式有问题还是我解释 datasheet 的方式有问题。 . 这是我为模拟 analogW
我想测量 PWM 信号的频率。为此,我使用了 STM-F401RE 及其 Timer_Input_Capture 函数。 问题是: 输入信号具有相当高的频率(大约 2MHz),并且, STM-F401
我正在使用 MPC 7555 Controller 。它有一个 16 位 Σ-Δ ADC。称为麦克风输入的信号被馈送到该 ADC 引脚。根据该电压,产生与ADC信号采样频率相同的PWM信号。 For
我想创建一个 PWM 信号。我希望频率接近 38 kHz。我的理论计算周期是 26.3 微秒。所以我选择26微秒。我可以观察我的信号。 但我不明白我的代码如何正常工作:) (我的时钟频率是1MHz,所
我正在尝试编写一个程序来生成正弦波,我将通过被动夏季输出这些正弦波,从而在我按下按钮时让微 Controller 播放声音。 我已经让 PWM 正常工作,并且可以使用常量值演奏音符,但我想使用正弦波而
我可能只是在使用这些寄存器之一时遇到了一个看不见森林的时刻,但我无法让 PWM 在 dsPIC33FJ32MC102 上工作微 Controller (警告:大 PDF)我正在玩。我已经遵循了数据表和
如何将字符串输出为列表? (可能很简单,我知道) 我查看了所有 google,NONE 的解决方案有效。 我的代码:(有点意译) import Pmw from tkinter import * ro
我正在尝试为每个对角线(在我的例子中为 PWM1 和 PWM4)使用一个 PWM 发生器来控制 H 桥转换器。 我希望能够同时控制频率和占空比。为此,我在 PWM4 周期开始时生成触发中断,然后更新两
在 Atmel ATmega328P (datasheet) 上,有三个定时器可用于 PWM 生成(定时器 0、定时器 1 和定时器 2)。 我已经有了使用 8 位 timer2 所需的东西,我只关心
我正在尝试用蜂鸣器和 Arduino 制作和弦音乐播放器。我在关注 this教程作为指南,但我无法弄清楚。代码就像: void playTone() { long elapsed_time =
我有一个 STM32F4,我想对一个已与掩码进行“或”运算的 GPIO 端口进行 PWM 处理。 所以,也许我们想要以 200khz 的频率 PWM 0b00100010 一段时间,但是,10khz
我建了this motor shield基于L298N芯片控制坦克的两个电机。一个电机使用引脚 5 和 6,另一个电机使用引脚 10 和 11。 尝试添加TSOP 4838时为了用红外 Remote
我有一个 STM32F4,我想对一个已与掩码进行“或”运算的 GPIO 端口进行 PWM 处理。 所以,也许我们想要以 200khz 的频率 PWM 0b00100010 一段时间,但是,10khz
我是 ARM MCU (STM32F411) 的新手,我一直在尝试使用 STM 的 HAL 库和 STM32Cube 寻找外围设备的方法。 为了使用一些外围设备,我已经配置了我的开发板: Timer
Raspberry pi B+ 有四个硬件 PWM。如何在 C/C++ 中使用它们。解决方案越简单越好。 我用 WiringPi 找到了一个可行的解决方案 gpio mode 1 pwm gpio
我一直在尝试在 PIC16F877 MCU 上使用 PWM 模块,但我得到的只是 CCP1/CCP2 引脚上的平坦低电平。 配置和启动 PWM 模块的代码如下。 // Configure PWM //
我是一名优秀的程序员,十分优秀!