From 90fb81270c44d52536a2639575b0982d7685c523 Mon Sep 17 00:00:00 2001 From: Jan-Henrik Bruhn Date: Sun, 26 Apr 2020 18:29:22 +0200 Subject: [PATCH] Implement timer for output writing, implement CV input --- stereo_mix/drivers/leds.h | 4 +++- stereo_mix/drivers/peripherals.c | 5 +++++ stereo_mix/drivers/peripherals.h | 1 + stereo_mix/makefile | 2 +- stereo_mix/processor.h | 6 +++++- stereo_mix/stereo_mix.cc | 27 ++++++++++++++++++++++----- stereo_mix/ui.cc | 2 +- 7 files changed, 38 insertions(+), 9 deletions(-) diff --git a/stereo_mix/drivers/leds.h b/stereo_mix/drivers/leds.h index 3dab23e..fb4ed2b 100644 --- a/stereo_mix/drivers/leds.h +++ b/stereo_mix/drivers/leds.h @@ -9,12 +9,14 @@ using namespace stereo_mix; const uint8_t kNumChannels = 4; static const uint16_t kGpioPins[] = { GPIO_PIN_7, GPIO_PIN_15, GPIO_PIN_13, GPIO_PIN_14 }; -static GPIO_TypeDef* kGpioPorts[] = { GPIOB, GPIOB, GPIOF, GPIOF }; +static GPIO_TypeDef* kGpioPorts[] = { GPIOB, GPIOB, GPIOC, GPIOC }; class Leds { public: Leds() { + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitTypeDef gpioInit; for (size_t i = 0; i < kNumChannels; i++) { gpioInit.Mode = GPIO_MODE_OUTPUT_PP; diff --git a/stereo_mix/drivers/peripherals.c b/stereo_mix/drivers/peripherals.c index 3379a21..4444e0a 100644 --- a/stereo_mix/drivers/peripherals.c +++ b/stereo_mix/drivers/peripherals.c @@ -4,6 +4,7 @@ ADC_HandleTypeDef hadc1 = { .Instance = ADC1 }; DMA_HandleTypeDef hdma1_channel1 = { .Instance = DMA1_Channel1 }; SPI_HandleTypeDef hspi1 = { .Instance = SPI1 }; TIM_HandleTypeDef htim3 = { .Instance = TIM3 }; +TIM_HandleTypeDef htim6 = { .Instance = TIM6 }; void DMA1_Channel1_IRQHandler(void) { @@ -17,3 +18,7 @@ void TIM3_IRQHandler() { HAL_TIM_IRQHandler(&htim3); } +void TIM6_IRQHandler() +{ + HAL_TIM_IRQHandler(&htim6); +} diff --git a/stereo_mix/drivers/peripherals.h b/stereo_mix/drivers/peripherals.h index 12aca5e..35b9d8c 100644 --- a/stereo_mix/drivers/peripherals.h +++ b/stereo_mix/drivers/peripherals.h @@ -6,4 +6,5 @@ extern ADC_HandleTypeDef hadc1; extern DMA_HandleTypeDef hdma1_channel1; extern SPI_HandleTypeDef hspi1; extern TIM_HandleTypeDef htim3; +extern TIM_HandleTypeDef htim6; diff --git a/stereo_mix/makefile b/stereo_mix/makefile index 490a737..5cd351c 100644 --- a/stereo_mix/makefile +++ b/stereo_mix/makefile @@ -31,7 +31,7 @@ FAMILY = f0xx # USB = enabled #APPLICATION = true #BOOTLOADER = midi2cv_bootloader - +OPTIMIZE = TRUE # Preferred upload command UPLOAD_COMMAND = upload_jtag diff --git a/stereo_mix/processor.h b/stereo_mix/processor.h index 3efae8d..65da964 100644 --- a/stereo_mix/processor.h +++ b/stereo_mix/processor.h @@ -22,9 +22,13 @@ class Processor { mute = m; } + uint16_t previous_volume() { + return previous_vol; + } + private: uint16_t volume_offset = 0; int16_t pan_offset = 0; - int32_t previous_vol; + uint16_t previous_vol; bool mute = false; }; diff --git a/stereo_mix/stereo_mix.cc b/stereo_mix/stereo_mix.cc index a1dd703..df914d9 100644 --- a/stereo_mix/stereo_mix.cc +++ b/stereo_mix/stereo_mix.cc @@ -25,6 +25,8 @@ UI ui(&adc, &switches, &leds, processors); bool mute[4]; +void WriteOutputs(void); + // Default interrupt handlers. extern "C" { void NMI_Handler() { } @@ -106,10 +108,13 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) { - if (htim != &htim3) { + if (htim == &htim3) { + leds.Write(); return; } - leds.Write(); + if (htim == &htim6) { + WriteOutputs(); + } } } @@ -119,8 +124,10 @@ void Init(void) __HAL_RCC_PWR_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE(); + __HAL_RCC_TIM6_CLK_ENABLE(); __HAL_RCC_SPI1_CLK_ENABLE(); HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); @@ -133,6 +140,16 @@ void Init(void) HAL_TIM_Base_Init(&htim3); HAL_TIM_Base_Start_IT(&htim3); + HAL_NVIC_SetPriority(TIM6_IRQn, 1, 0); + HAL_NVIC_EnableIRQ(TIM6_IRQn); + htim6.Init.Prescaler = 192; + htim6.Init.CounterMode = TIM_COUNTERMODE_UP; + htim6.Init.Period = 512; + htim6.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim6.Init.RepetitionCounter = 0; + HAL_TIM_Base_Init(&htim6); + HAL_TIM_Base_Start_IT(&htim6); + system_clock.Init(); } @@ -141,8 +158,8 @@ void WriteOutputs(void) for (int i = 0; i < kNumChannels; i++) { uint16_t out[2]; int16_t cvs[2]; - cvs[0] = 0; - cvs[1] = 0; + cvs[0] = 65535 - adc.cv_value(AdcChannel(ADC_CHANNEL_PAN_1 + i)); + cvs[1] = adc.cv_value(AdcChannel(ADC_CHANNEL_VOL_1 + i)); processors[i].Process(cvs, out); dacs[i].Write16(0, out[0]); dacs[i + 4].Write16(0, out[0]); @@ -162,6 +179,6 @@ int main(void) ui.DoEvents(); - WriteOutputs(); +// WriteOutputs(); } } diff --git a/stereo_mix/ui.cc b/stereo_mix/ui.cc index b2d501c..b0d7a81 100644 --- a/stereo_mix/ui.cc +++ b/stereo_mix/ui.cc @@ -113,7 +113,7 @@ void UI::TaskDrawLeds() leds->set_blinking(i, pan_pots[i] - 32767 < 0); } else { // show volume if not muted - leds->set_intensity(i, mute[i] ? 0 : volume_pots[i] >> 8); + leds->set_intensity(i, processors[i].previous_volume() >> (4)); leds->set_blinking(i, false); } }