Урок 46
Часть 7
I2S AUDIO
В предыдущей части урока мы написали функцию воспроизведения звука, а также написали функцию остановки воспроизведения.
Напишем ещё две функции для обработки прерываний от I2S в этот же файл audioplay.c
void AudioPlay_HalfTransfer_CallBack(void)
{
buffer_offset = BUFFER_OFFSET_HALF;
}
void AudioPlay_TransferComplete_CallBack(void)
{
buffer_offset = BUFFER_OFFSET_FULL;
if(!Is_cs43l22_Stop)
{
HAL_I2S_Transmit_DMA(&hi2s3, (uint16_t*)&Audio_Buffer[0], AUDIO_BUFFER_SIZE / 2);
}
else
{
cs43l22_SetVolume(AUDIO_I2C_ADDRESS, 0);
}
}
Ну так как это не официальные обработчики, то надо сюда как-то ещё обработку направить
Для этого, во-первых, для них добавим прототипы в хедер-файл audioplay.h
void AudioPlay_Start(uint32_t AudioFreq);
void AudioPlay_TransferComplete_CallBack(void);
void AudioPlay_HalfTransfer_CallBack(void);
//————————————————
Напишем вызов двух функций прерываний от I2S в main.c и тем самым перенаправим обработчик в свои функции
/* USER CODE BEGIN 4 */
void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s3)
{
if(hi2s3->Instance == I2S3)
{
/* Call the user function which will manage directly transfer complete */
AudioPlay_TransferComplete_CallBack();
}
}
//—————————————————————————
void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s)
{
if(hi2s->Instance == I2S3)
{
/* Manage the remaining file size and new address offset: This function should
be coded by user (its prototype is already declared in stm32f4_discovery_audio.h) */
AudioPlay_HalfTransfer_CallBack();
}
}
/* USER CODE END 4 */
Проверяем, прошиваем, должно всё заиграть (нажмите на картинку для увеличения изображения)
Предыдущая часть Программирование МК STM32 Следующий урок
Техническая документация на Аудио ЦАП CS43L22
Отладочную плату и дисплей можно приобрести здесь:
Смотреть ВИДЕОУРОК
Сделайте пожалуйста урок про микрофон, который на stm32f4discovery