Implement timer for output writing, implement CV input

This commit is contained in:
Jan-Henrik 2020-04-26 18:29:22 +02:00
parent d86b472820
commit 90fb81270c
7 changed files with 38 additions and 9 deletions

View file

@ -9,12 +9,14 @@ using namespace stereo_mix;
const uint8_t kNumChannels = 4; const uint8_t kNumChannels = 4;
static const uint16_t kGpioPins[] = { GPIO_PIN_7, GPIO_PIN_15, GPIO_PIN_13, GPIO_PIN_14 }; 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 { class Leds {
public: public:
Leds() Leds()
{ {
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitTypeDef gpioInit; GPIO_InitTypeDef gpioInit;
for (size_t i = 0; i < kNumChannels; i++) { for (size_t i = 0; i < kNumChannels; i++) {
gpioInit.Mode = GPIO_MODE_OUTPUT_PP; gpioInit.Mode = GPIO_MODE_OUTPUT_PP;

View file

@ -4,6 +4,7 @@ ADC_HandleTypeDef hadc1 = { .Instance = ADC1 };
DMA_HandleTypeDef hdma1_channel1 = { .Instance = DMA1_Channel1 }; DMA_HandleTypeDef hdma1_channel1 = { .Instance = DMA1_Channel1 };
SPI_HandleTypeDef hspi1 = { .Instance = SPI1 }; SPI_HandleTypeDef hspi1 = { .Instance = SPI1 };
TIM_HandleTypeDef htim3 = { .Instance = TIM3 }; TIM_HandleTypeDef htim3 = { .Instance = TIM3 };
TIM_HandleTypeDef htim6 = { .Instance = TIM6 };
void DMA1_Channel1_IRQHandler(void) void DMA1_Channel1_IRQHandler(void)
{ {
@ -17,3 +18,7 @@ void TIM3_IRQHandler()
{ {
HAL_TIM_IRQHandler(&htim3); HAL_TIM_IRQHandler(&htim3);
} }
void TIM6_IRQHandler()
{
HAL_TIM_IRQHandler(&htim6);
}

View file

@ -6,4 +6,5 @@ extern ADC_HandleTypeDef hadc1;
extern DMA_HandleTypeDef hdma1_channel1; extern DMA_HandleTypeDef hdma1_channel1;
extern SPI_HandleTypeDef hspi1; extern SPI_HandleTypeDef hspi1;
extern TIM_HandleTypeDef htim3; extern TIM_HandleTypeDef htim3;
extern TIM_HandleTypeDef htim6;

View file

@ -31,7 +31,7 @@ FAMILY = f0xx
# USB = enabled # USB = enabled
#APPLICATION = true #APPLICATION = true
#BOOTLOADER = midi2cv_bootloader #BOOTLOADER = midi2cv_bootloader
OPTIMIZE = TRUE
# Preferred upload command # Preferred upload command
UPLOAD_COMMAND = upload_jtag UPLOAD_COMMAND = upload_jtag

View file

@ -22,9 +22,13 @@ class Processor {
mute = m; mute = m;
} }
uint16_t previous_volume() {
return previous_vol;
}
private: private:
uint16_t volume_offset = 0; uint16_t volume_offset = 0;
int16_t pan_offset = 0; int16_t pan_offset = 0;
int32_t previous_vol; uint16_t previous_vol;
bool mute = false; bool mute = false;
}; };

View file

@ -25,6 +25,8 @@ UI ui(&adc, &switches, &leds, processors);
bool mute[4]; bool mute[4];
void WriteOutputs(void);
// Default interrupt handlers. // Default interrupt handlers.
extern "C" { extern "C" {
void NMI_Handler() { } void NMI_Handler() { }
@ -106,10 +108,13 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim)
{ {
if (htim != &htim3) { if (htim == &htim3) {
leds.Write();
return; return;
} }
leds.Write(); if (htim == &htim6) {
WriteOutputs();
}
} }
} }
@ -119,8 +124,10 @@ void Init(void)
__HAL_RCC_PWR_CLK_ENABLE(); __HAL_RCC_PWR_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_TIM3_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE();
__HAL_RCC_TIM6_CLK_ENABLE();
__HAL_RCC_SPI1_CLK_ENABLE(); __HAL_RCC_SPI1_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
@ -133,6 +140,16 @@ void Init(void)
HAL_TIM_Base_Init(&htim3); HAL_TIM_Base_Init(&htim3);
HAL_TIM_Base_Start_IT(&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(); system_clock.Init();
} }
@ -141,8 +158,8 @@ void WriteOutputs(void)
for (int i = 0; i < kNumChannels; i++) { for (int i = 0; i < kNumChannels; i++) {
uint16_t out[2]; uint16_t out[2];
int16_t cvs[2]; int16_t cvs[2];
cvs[0] = 0; cvs[0] = 65535 - adc.cv_value(AdcChannel(ADC_CHANNEL_PAN_1 + i));
cvs[1] = 0; cvs[1] = adc.cv_value(AdcChannel(ADC_CHANNEL_VOL_1 + i));
processors[i].Process(cvs, out); processors[i].Process(cvs, out);
dacs[i].Write16(0, out[0]); dacs[i].Write16(0, out[0]);
dacs[i + 4].Write16(0, out[0]); dacs[i + 4].Write16(0, out[0]);
@ -162,6 +179,6 @@ int main(void)
ui.DoEvents(); ui.DoEvents();
WriteOutputs(); // WriteOutputs();
} }
} }

View file

@ -113,7 +113,7 @@ void UI::TaskDrawLeds()
leds->set_blinking(i, pan_pots[i] - 32767 < 0); leds->set_blinking(i, pan_pots[i] - 32767 < 0);
} else { } else {
// show volume if not muted // 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); leds->set_blinking(i, false);
} }
} }