blob: 099ae0311bdd4e889cbff316aa6dfaea1e11df49 [file] [log] [blame] [edit]
#include "stm32h7xx_hal.h"
#include "32blit.hpp"
#include "engine/api_private.hpp"
#include "gpio.hpp"
#include "sound.hpp"
TIM_HandleTypeDef htim6;
DAC_HandleTypeDef hdac1;
void TIM6_DAC_IRQHandler(void) {
if (__HAL_TIM_GET_FLAG(&htim6, TIM_FLAG_UPDATE) != RESET)
{
if (__HAL_TIM_GET_IT_SOURCE(&htim6, TIM_IT_UPDATE) != RESET)
{
__HAL_TIM_CLEAR_IT(&htim6, TIM_IT_UPDATE);
static bool was_amp_enabled = true;
bool enable_amp = sound::enabled && is_audio_playing();
if(enable_amp != was_amp_enabled) {
HAL_GPIO_WritePin(AMP_SHUTDOWN_GPIO_Port, AMP_SHUTDOWN_Pin, enable_amp ? GPIO_PIN_SET : GPIO_PIN_RESET);
was_amp_enabled = enable_amp;
}
// timer period elapsed, update audio sample
hdac1.Instance->DHR12R2 = sound::enabled ? blit::get_audio_frame() >> 4 : 0x800;
}
}
}
namespace sound {
AudioChannel channels[CHANNEL_COUNT];
bool enabled = true;
void init() {
blit::api.channels = channels;
// setup the 22,010Hz audio timer
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
__TIM6_CLK_ENABLE();
htim6.Instance = TIM6;
htim6.Init.Prescaler = 310;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = 34;
if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
{
// TODO: fail
}
__HAL_RCC_DAC12_CLK_ENABLE();
DAC_ChannelConfTypeDef sConfig = {0};
// setup the dac output
hdac1.Instance = DAC1;
if (HAL_DAC_Init(&hdac1) != HAL_OK)
{
// TODO: fail
}
sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
//sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;
sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_2) != HAL_OK)
{
// TODO: fail
}
HAL_TIM_Base_Start_IT(&htim6);
HAL_DAC_Start(&hdac1, DAC_CHANNEL_2);
}
}