mirror of
https://github.com/jhbruhn/eurorack.git
synced 2025-03-15 02:55:49 +00:00
Implement timer for output writing, implement CV input
This commit is contained in:
parent
d86b472820
commit
90fb81270c
7 changed files with 38 additions and 9 deletions
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue