Я пытаюсь адаптировать 16-битное приложение для записи звука для stm32fxxx к 24-битному, и я наткнулся на #define
, что меня смущает.
Я изменил 16-битный DMA на 32-битный DMA вместе с некоторыми буферами uint16_t
до uint32_t
и т. Д., Не знаю, почему uint32_t
и не подписано int, но об этом я расскажу позже.Невозможно передать 24 бита через DMA, поэтому я отправлю 32 бита и сбрасываю один байт позже.
3-й вход 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
, как это требуется.Я никогда не видел, чтобы указатели так же использовались, но это работает.