diff --git a/stereo_mix/drivers/leds.h b/stereo_mix/drivers/leds.h new file mode 100644 index 0000000..21f0082 --- /dev/null +++ b/stereo_mix/drivers/leds.h @@ -0,0 +1,46 @@ +#pragma once + +#include "stm32f0xx_hal_gpio.h" +#include + +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 }; + +class Leds { + public: + Leds() + { + GPIO_InitTypeDef gpioInit; + for (size_t i = 0; i < kNumChannels; i++) { + gpioInit.Mode = GPIO_MODE_OUTPUT_PP; + gpioInit.Pin = kGpioPins[i]; + gpioInit.Pull = GPIO_NOPULL; + gpioInit.Speed = GPIO_SPEED_FREQ_MEDIUM; + HAL_GPIO_Init(kGpioPorts[i], &gpioInit); + } + } + void Write() + { + pwm_counter += 2; + + for (size_t i = 0; i < kNumChannels; i++) { + if (intensities[0] && intensities[i] >= pwm_counter) { + HAL_GPIO_WritePin(kGpioPorts[i], kGpioPins[i], GPIO_PIN_SET); + } else { + HAL_GPIO_WritePin(kGpioPorts[i], kGpioPins[i], GPIO_PIN_RESET); + } + } + } + void set_intensity(uint8_t channel, uint8_t intensity) + { + if (channel >= kNumChannels) + return; + intensities[channel] = intensity; + } + + private: + uint8_t pwm_counter; + uint8_t intensities[kNumChannels]; +}; diff --git a/stereo_mix/drivers/peripherals.c b/stereo_mix/drivers/peripherals.c index 38c43e9..3379a21 100644 --- a/stereo_mix/drivers/peripherals.c +++ b/stereo_mix/drivers/peripherals.c @@ -3,6 +3,7 @@ ADC_HandleTypeDef hadc1 = { .Instance = ADC1 }; DMA_HandleTypeDef hdma1_channel1 = { .Instance = DMA1_Channel1 }; SPI_HandleTypeDef hspi1 = { .Instance = SPI1 }; +TIM_HandleTypeDef htim3 = { .Instance = TIM3 }; void DMA1_Channel1_IRQHandler(void) { @@ -12,3 +13,7 @@ void ADC1_IRQHandler(void) { HAL_ADC_IRQHandler(&hadc1); } +void TIM3_IRQHandler() +{ + HAL_TIM_IRQHandler(&htim3); +} diff --git a/stereo_mix/drivers/peripherals.h b/stereo_mix/drivers/peripherals.h index b762322..12aca5e 100644 --- a/stereo_mix/drivers/peripherals.h +++ b/stereo_mix/drivers/peripherals.h @@ -5,3 +5,5 @@ extern ADC_HandleTypeDef hadc1; extern DMA_HandleTypeDef hdma1_channel1; extern SPI_HandleTypeDef hspi1; +extern TIM_HandleTypeDef htim3; + diff --git a/stereo_mix/stereo_mix.cc b/stereo_mix/stereo_mix.cc index e3bf74d..4f5003f 100644 --- a/stereo_mix/stereo_mix.cc +++ b/stereo_mix/stereo_mix.cc @@ -1,7 +1,9 @@ #include "drivers/adc.h" #include "drivers/dac.h" +#include "drivers/leds.h" #include "drivers/peripherals.h" #include "resources.h" +#include "stm32f0xx_hal_rcc.h" #include using namespace stereo_mix; @@ -11,10 +13,11 @@ Dac dacs[8] = { { GPIOA, GPIO_PIN_8 }, { GPIOA, GPIO_PIN_9 }, { GPIOA, GPIO_PIN_10 }, { GPIOA, GPIO_PIN_11 } }; Adc adc; +Leds leds; // Default interrupt handlers. extern "C" { -void NMI_Handler() {} +void NMI_Handler() { } void Error_Handler() { while (1) @@ -40,9 +43,9 @@ void UsageFault_Handler() while (1) ; } -void SVC_Handler() {} -void DebugMon_Handler() {} -void PendSV_Handler() {} +void SVC_Handler() { } +void DebugMon_Handler() { } +void PendSV_Handler() { } // called every 1ms void SysTick_Handler() @@ -85,6 +88,27 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { adc.OnDMATransferComplete(); } +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) // called with 1kHz (OPTIMIZE!) the display should get its own spi bus +{ + if (htim != &htim3) { + return; + } + leds.Write(); +} +} + +void Init(void) +{ + HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM3_IRQn); + __HAL_RCC_TIM3_CLK_ENABLE(); + htim3.Init.Prescaler = 24; + htim3.Init.CounterMode = TIM_COUNTERMODE_UP; + htim3.Init.Period = 128; // 8kHz + htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim3.Init.RepetitionCounter = 0; + HAL_TIM_Base_Init(&htim3); + HAL_TIM_Base_Start_IT(&htim3); } int main(void) @@ -93,6 +117,10 @@ int main(void) SystemClock_Config(); __HAL_RCC_SYSCFG_CLK_ENABLE(); __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + + Init(); while (true) { for (int i = 0; i < 4; i++) { @@ -108,7 +136,7 @@ int main(void) CONSTRAIN(pan, 0, (1 << 12) - 1); CONSTRAIN(vol, 0, (1 << 12) - 1); - + leds.set_intensity(i, vol >> 4); value_l = (lut_left_sin_pan[pan] * lut_linear_to_exp[vol]) >> 16; value_r = (lut_right_cos_pan[pan] * lut_linear_to_exp[vol]) >> 16; diff --git a/stmlib b/stmlib index 027f064..0c9129a 160000 --- a/stmlib +++ b/stmlib @@ -1 +1 @@ -Subproject commit 027f064b70c6fd3d137ea530c446609a1da5a564 +Subproject commit 0c9129ad08236a1987b0d81d1019b947a247a9ff