将中断转换为 DMA

Posted

技术标签:

【中文标题】将中断转换为 DMA【英文标题】:Convert interrupts to DMA 【发布时间】:2021-06-09 22:44:57 【问题描述】:

我正在尝试通过我的董事会扬声器播放一个音符。目前,我有一个中断如下:

void sampleISR(void) 
  static uint32_t phaseAcc = 0;
  phaseAcc += a; //this `a` is modified outside
  analogWrite(OUTR_PIN, phaseAcc);

setup()函数中附加如下:

  TIM_TypeDef *Instance = TIM1;
  HardwareTimer *sampleTimer = new HardwareTimer(Instance);
  sampleTimer->setOverflow(22000, HERTZ_FORMAT);
  sampleTimer->attachInterrupt(sampleISR);
  sampleTimer->resume();

我正在尝试使用 DMA 来减轻 CPU 的压力并提高采样率(使 22000 更大)。我正在尝试使用this,因为我的董事会支持它,但是,我在概念上对转换需要什么感到困惑。目前,我有一个中断,它每 22000 个样本将analogWrite 值修改为 pin OUTR_PIN。我目前的理解是,DMA 是一种将内存连接到外围设备或内存到内存的工具,这样就可以在不需要 CPU 的情况下传输数据。但是,我不确定这在当前情况下意味着什么。我是否需要创建一个内存到外围设备的 DMA,其中源是内存(我的 phaseAcc 变量和输出是外围设备(我的 OUTR_PIN?)。我不确定我会如何去做,或者如果我上面描述的是正确的。我试图直接模仿上面描述的功能。

我使用的是 stm32 系列的板子。

【问题讨论】:

DMA 在将大量数据从一个内存位置复制到另一个位置时非常有用。 DMA 是您的硬件必须支持的东西。除非有其他硬件可以接管,否则它对 CPU 毫无帮助。您的扬声器可能无法进行 DMA。如果在 ~22KHz 下做某事对你的 CPU 来说是一种“压力”,那么这是什么类型的 CPU?它是否运行 “” 没有意义。请参阅***.com/questions/25318145/… 将“带中断的编程 I/O”简单地称为“中断”是不准确且具有误导性的。 “我目前的理解是 DMA 是一种工具……” -- DMA 是一种方法。您需要系统(或 SoC)中的 DMA 控制器(即硬件设备)来执行 DMA 传输。 “我是否需要创建一个内存到外围设备的 DMA,其中源是内存(我的 phaseAcc 变量,输出是外围设备(我的 OUTR_PIN?)。” -- 您需要设置 DMA 传输,其中源是内存缓冲区(即要传输的值数组),目标是 DAC 外设的输入端口(不是扬声器或模拟输出引脚)。需要其他参数,例如传输大小、传输计数和每次传输的触发机制。 为什么会同时标记 Arduino 和 STM32?现在是否也有一些用于 STM32 的 Arduino 衍生产品?如果您使用的是 STM32 DMA,为什么还要链接 Infineon/Cypress? 【参考方案1】:

要驱动扬声器,您通常使用带有 PWM 信号(脉冲宽度调制)的 DAC(数模转换器)在 STM32 上,DAC / PWM 可以与 DMA(直接内存访问)链接,请参见 HAL_TIM_PWM_Start_DMA from https://deepbluembedded.com/stm32-dac-sine-wave-generation-stm32-dac-dma-timer-example/ 和 https://community.st.com/s/question/0D50X0000AAJMUVSQ5/start-pwm-with-dma-haltimpwmstartdma-results-in-hardfault 中的 HAL 库是示例代码,但您不应使用纯正弦波驱动扬声器

有关详细信息,另请参阅此应用说明:https://www.st.com/resource/en/application_note/cd00259245-audio-and-waveform-generation-using-the-dac-in-stm32-products-stmicroelectronics.pdf

要生成所需的波形,您必须调整https://deepbluembedded.com/stm32-dac-sine-wave-generation-stm32-dac-dma-timer-example/中描述的波形查找表

【讨论】:

以上是关于将中断转换为 DMA的主要内容,如果未能解决你的问题,请参考以下文章

使用HAL库开发STM32:ADC基础使用

接口电路的主要作用是啥?它的基本结构如何?

STM32串口发送中断

007_STM32程序移植之_多通道ADC转换

如何使用硬件定时器通过 DMA 触发一定数量的 ADC 转换?

关于Stm32定时器+ADC+DMA进行AD采样的实现