mirror of
https://github.com/jhbruhn/eurorack.git
synced 2025-03-14 18:55:48 +00:00
Update stmlib, implement LED softpwm with TIM3
This commit is contained in:
parent
9f54545f7a
commit
a15d6d449e
5 changed files with 87 additions and 6 deletions
46
stereo_mix/drivers/leds.h
Normal file
46
stereo_mix/drivers/leds.h
Normal file
|
@ -0,0 +1,46 @@
|
|||
#pragma once
|
||||
|
||||
#include "stm32f0xx_hal_gpio.h"
|
||||
#include <stm32f0xx_hal.h>
|
||||
|
||||
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];
|
||||
};
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -5,3 +5,5 @@
|
|||
extern ADC_HandleTypeDef hadc1;
|
||||
extern DMA_HandleTypeDef hdma1_channel1;
|
||||
extern SPI_HandleTypeDef hspi1;
|
||||
extern TIM_HandleTypeDef htim3;
|
||||
|
||||
|
|
|
@ -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 <stm32f0xx_hal.h>
|
||||
|
||||
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;
|
||||
|
||||
|
|
2
stmlib
2
stmlib
|
@ -1 +1 @@
|
|||
Subproject commit 027f064b70c6fd3d137ea530c446609a1da5a564
|
||||
Subproject commit 0c9129ad08236a1987b0d81d1019b947a247a9ff
|
Loading…
Reference in a new issue