我正在使用 STM32CubeIDE 对 STM32F446RE 进行编程。
DAC 应该使用 DMA 和 TIM6 输出数组。
我想输出 1000 个带符号的 16 位样本点。我需要将它们调整到正确的电压。
当我使用我在 Excel 中计算的
uint16_t waveform[1000] = { list of constants };
时,一切都很好。频率和幅度正确。信号看起来符合预期。
当我尝试像这样计算STM32上的值时,它不起作用。
void get_scaled_waveform(uint16_t* waveForm)
{
float scale = Sample.amplitude * 0.5;
int16_t max_16 = (1 << 15) - 1;
uint16_t max_12u = (1 << 12) - 1;
for (int i = 0; i < Sample.length; i++)
{
float normalized = Sample.data[i] / (float) max_16;
float voltage = Sample.offset + normalized * scale;
waveForm[i] = (uint16_t)(voltage / 3.3f * max_12u + 0.5);
}
}
uint16_t waveForm[1000];
get_scaled_waveform(waveForm);
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)waveForm, 1000, DAC_ALIGN_12B_R);
这是我的信号,中间有一些噪音。
当我在调试器中检查
waveForm
时,我看到所有值都是正确的,但不知何故 DMA 似乎从未初始化的内存中读取了最后几个值。
当我仅使用全局变量执行此操作时:
void get_scaled_waveform()
{
float scale = Sample.amplitude * 0.5;
int16_t max_16 = (1 << 15) - 1;
uint16_t max_12u = (1 << 12) - 1;
for (int i = 0; i < Sample.length; i++)
{
float normalized = Sample.data[i] / (float) max_16;
float voltage = Sample.offset + normalized * scale;
Sample.data[i] = (uint16_t)(voltage / 3.3f * max_12u + 0.5);
}
}
get_scaled_waveform(Sample.data);
它也有效。
所以我猜这是我使用指针造成的。
我的 C 有什么问题可以解释吗?
两个参数
(uint32_t*)waveForm, 1000
表示您告诉函数发送一千个uint32_t
值。这是数组 waveForm
大小(以字节为单位)的两倍,该数组仅包含一千个 uint16_t
值。
如果参数
1000
表示 uint32_t
元素的数量,那么您需要将其减半为 500。