You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32G474RE定时器-DMA-DAC查表实现三相120°相位偏移问询

STM32G474RE三相DAC输出:调整DMA起始索引实现120°相位差

问题描述

我正在使用STM32G474RE开发板,已通过STM32CubeMX和CubeIDE实现定时器触发DMA控制器从正弦波查表数组中取数并发送至DAC的功能。目前定时器会递增变量至数组长度后复位,DMA循环传输数据至DAC,运行正常。

我希望拓展出另外2路输出,实现三相输出间120°相位差:A相0°(数组索引从0开始)、B相120°(数组索引从100开始)、C相240°(数组索引从200开始)。现有两路输出已工作,但需调整DMA的起始索引,让其从数组指定位置取数。

请问是否可以预加载数组索引,使DAC从数组后续位置开始输出数据?

以下是主函数代码片段:

int main(void)
{
    /* USER CODE BEGIN 1 */

    /* USER CODE END 1 */

    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_DMA_Init();
    MX_DAC1_Init();
    MX_TIM2_Init();
    /* USER CODE BEGIN 2 */

    // The DAC,DMA and Look up table are defined here I think ,

    HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, (uint32_t*)Wave_LUT_BIG, 2500, DAC_ALIGN_12B_R); 
    HAL_TIM_Base_Start(&htim2);
    HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_2,    (uint32_t*)Wave_LUT_COS, 128, DAC_ALIGN_12B_R);
    HAL_TIM_Base_Start(&htim2);

    /* USER CODE END 2 */
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1) {
       /* USER CODE END WHILE */
       /* USER CODE BEGIN 3 */
    }
    /* USER CODE END 3 */
}

解决方案

完全可以通过指定DMA传输的起始地址实现从数组指定索引位置输出,无需额外预加载索引,具体实现如下:

核心原理

DMA的传输起始地址由你传入的数组指针决定,只需将指针偏移到目标索引对应的内存位置,就能让DMA从该位置开始取数。例如数组Wave_LUT_BIG的索引100对应的地址是&Wave_LUT_BIG[100],将这个地址传入HAL_DAC_Start_DMA即可让B相从该位置开始输出。

代码调整示例

假设三相正弦波都存储在同一个大数组Wave_LUT_BIG中(需保证数组长度足够覆盖起始索引+传输长度),调整主函数中的DAC启动代码:

/* USER CODE BEGIN 2 */
// 配置三相输出:A相0°(索引0)、B相120°(索引100)、C相240°(索引200)
HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, (uint32_t*)&Wave_LUT_BIG[0], 2500, DAC_ALIGN_12B_R); 
HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_2, (uint32_t*)&Wave_LUT_BIG[100], 2500, DAC_ALIGN_12B_R);
// 若启用第三路DAC通道(需提前在CubeMX完成配置)
HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_3, (uint32_t*)&Wave_LUT_BIG[200], 2500, DAC_ALIGN_12B_R);

// 启动定时器触发DMA
HAL_TIM_Base_Start(&htim2);
/* USER CODE END 2 */

关键注意事项

  • 数组长度检查:确保数组总长度大于「起始索引 + 传输长度」,避免越界访问内存引发异常。比如传输长度为2500,C相起始索引200,数组长度至少为2700。
  • 循环DMA模式:若CubeMX中配置了DMA循环模式,传输完指定长度后会自动回到起始地址重复传输,维持稳定的相位差输出。
  • 分数组场景适配:若三相波形存储在不同数组中,同样可以用指针偏移实现,例如B相数组Wave_LUT_B从索引X开始,传入&Wave_LUT_B[X]即可。

内容的提问来源于stack exchange,提问作者om_kcin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:30:41