我正在尝试将 stm32fxxx 的 16 位录音机应用程序调整为 24 位,但我偶然发现了一个#define
让我感到困惑的问题。
uint16_t
我已经将 16 位 DMA 更改为32 位 DMA 以及一些缓冲区uint32_t
等等。不知道为什么uint32_t
并且没有签名 int 但我稍后会看。没有办法通过 DMA 传递 24 位,所以我将发送 32 位并稍后丢弃一个字节。
的第三个输入HAL_SAI_Transmit_DMA()
实际上期望uint16_t
.
#define AUDIO_OUT_BUFFER_SIZE 16384
#define AUDIODATA_SIZE 2
#define DMA_MAX_SZE 0xFFFF
#define DMA_MAX(x) (((x) <= DMA_MAX_SZE)? (x):DMA_MAX_SZE)
uint8_t BSP_AUDIO_OUT_Play(uint16_t* pBuffer, uint16_t Size)
{
// send audio samples over DMA from buffer to audio port
HAL_SAI_Transmit_DMA(&haudio_out_sai, (uint8_t*) pBuffer,
DMA_MAX(AUDIO_OUT_BUFFER_SIZE / AUDIODATA_SIZE));
return AUDIO_OK;
}
我猜我需要更改为
AUDIODATA_SIZE 4
#define DMA_MAX_SZE 0xFFFFFFFF // 32bit
但我想知道#define DMA_MAX(x) (((x) <= DMA_MAX_SZE)? (x):DMA_MAX_SZE)
应该做什么以及它是如何工作的!它几乎写成好像它是一个函数?x
IO值在哪里?
AUDIODATA_SIZE
是每个样本中的字节数:
作为 C 语言的初学者,我深表歉意,但我从未见过这样的事情,只能假设它掩盖了缓冲区的大小。但为什么?
pBuffer
是uint16_t*
指向传递给函数的指针的指针,并根据需要强制转换(uint8_t*)pBuffer
为HAL_SAI_Transmit_DMA
。我也从未见过这样的指针,但它确实有效。