Update stmlib, implement LED softpwm with TIM3

This commit is contained in:
Jan-Henrik 2020-04-23 22:06:40 +02:00
parent 9f54545f7a
commit a15d6d449e
5 changed files with 87 additions and 6 deletions

46
stereo_mix/drivers/leds.h Normal file
View 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];
};

View file

@ -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);
}

View file

@ -5,3 +5,5 @@
extern ADC_HandleTypeDef hadc1;
extern DMA_HandleTypeDef hdma1_channel1;
extern SPI_HandleTypeDef hspi1;
extern TIM_HandleTypeDef htim3;

View file

@ -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

@ -1 +1 @@
Subproject commit 027f064b70c6fd3d137ea530c446609a1da5a564
Subproject commit 0c9129ad08236a1987b0d81d1019b947a247a9ff