如果我使用指针,为什么我的代码不起作用?

问题描述 投票:0回答:1

我正在使用 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 有什么问题可以解释吗?

c pointers stm32
1个回答
0
投票

两个参数

(uint32_t*)waveForm, 1000
表示您告诉函数发送一千个
uint32_t
值。这是数组
waveForm
大小(以字节为单位)的两倍,该数组仅包含一千个
uint16_t
值。

如果参数

1000
表示
uint32_t
元素的数量,那么您需要将其减半为 500。

© www.soinside.com 2019 - 2024. All rights reserved.