如何用for循环生成可灵活调整平坦段长度的DAC波形数组?
解决方案
核心思路
原波形结构可拆解为:起始平坦段 → 峰值 → N个中间平坦段 → 谷值,其中N就是输入参数x。我们需要根据x动态生成对应长度的波形数组,再通过DAC_DMA输出。
示例代码
// 定义中间平坦段的最大数量,根据实际需求调整 #define MAX_FLAT_SEGMENTS 100 // 计算波形数组的最大长度:起始1 + 峰值1 + 最大平坦段数 + 谷值1 #define MAX_WAVE_LENGTH (3 + MAX_FLAT_SEGMENTS) // 预先分配足够大的静态数组(嵌入式环境推荐用静态数组,避免动态内存分配风险) uint32_t Wave_LUT[MAX_WAVE_LENGTH]; void GenerateAdjustableWave(uint32_t x) { // 确保x不超过最大限制,避免数组越界 if (x > MAX_FLAT_SEGMENTS) { x = MAX_FLAT_SEGMENTS; } uint32_t waveLength = 3 + x; // 填充起始平坦段 Wave_LUT[0] = 2048; // 填充峰值 Wave_LUT[1] = 4026; // 填充x个中间平坦段 for (uint32_t i = 0; i < x; i++) { Wave_LUT[2 + i] = 2048; } // 填充谷值 Wave_LUT[2 + x] = 0; // 启动DAC_DMA和定时器(先停止之前的传输避免冲突) HAL_DAC_Stop_DMA(&hdac, DAC_CHANNEL_1); HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, Wave_LUT, waveLength, DAC_ALIGN_12B_R); HAL_TIM_Base_Start(&htim4); }
使用方式
调用GenerateAdjustableWave(x)即可生成对应波形:
- 当
x=1时,数组为{2048,4026,2048,0}(与原数组一致) - 当
x=3时,数组为{2048,4026,2048,2048,2048,0}
关键修改点
- 将固定长度数组改为预分配的静态大数组,适配不同x的需求,嵌入式环境下优先用静态内存,避免动态内存分配的碎片化或异常风险
- 通过
for循环批量填充中间平坦段,无需手动逐个添加元素 - 每次生成波形前停止之前的DMA传输,防止资源冲突
- 增加x的范围检查,避免数组越界
内容的提问来源于stack exchange,提问作者Meria Rajagukguk
相关产品推荐
相关产品推荐

