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
相关产品推荐
相关产品推荐

