Следующий код воспроизводит звуки с более чем 65535 семплами через i2s через DMA:
#define LONG_PLAY_CHUNK 30000
static uint16_t *long_play_wav;
static int long_play_remaining;
// push a another LONG_PLAY_CHUNK samples out through I2S DMA
static void long_play_continue() {
int chunk_size = long_play_remaining > LONG_PLAY_CHUNK ? LONG_PLAY_CHUNK : long_play_remaining;
int status = HAL_I2S_Transmit_DMA(&hi2s2, long_play_wav, chunk_size);
if (status != HAL_OK) {
HAL_Delay(0);// add a breakpoint here to see errors
}
long_play_remaining -= chunk_size;
long_play_wav += chunk_size;
}
// this is called when the DMA completes
void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s) {
if (long_play_remaining > 0) {
long_play_continue();
}
}
// use this to play more than 65535 samples
void long_play(uint16_t *wav, int samples) {
long_play_wav = wav;
long_play_remaining = samples;
long_play_continue();
}
На stm32f303 это работает нормально, я могу вызвать long_play()
несколько раз (до тех пор, пока предыдущий звук закончилась).
На stm32h743 этот код воспроизводит все части первого звука. то есть он успешно соединяет несколько DMA.
Когда я пытаюсь воспроизвести второй семпл, HAL_I2S_Transmit_DMA()
терпит неудачу.
Если я изменяю код на:
if (long_play_remaining > 0) {
long_play_continue();
} else {
// this really shouldn't be needed here, and isn't needed on the f303
MX_I2S2_Init();
}
, это работает.
Вызов MX_I2S2_Init()
- это значительный объем кода.
Должен ли я действительно вызывать MX_I2S2_Init()
после завершения каждого примера, или это ошибка генерации кода CubeMX на h743?