From 18f405aa46c699929f1ecc67cf7a6a89a4c81850 Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Tue, 2 Mar 2021 20:21:18 +0100 Subject: [PATCH] Configure LEDs --- firmware/adc.c | 13 +++++++++++-- firmware/adc.h | 1 + firmware/lib/systems.c | 4 +++- firmware/lib/systems.h | 12 +++++++----- firmware/main.c | 44 ++++++++++++++++++++++++++++++------------ 5 files changed, 54 insertions(+), 20 deletions(-) diff --git a/firmware/adc.c b/firmware/adc.c index 319a7f8..21e81f5 100644 --- a/firmware/adc.c +++ b/firmware/adc.c @@ -44,7 +44,7 @@ void adc_init() TIM_OC1Init (TIM5, &TIM_OCInitStructure); TIM_SetCompare1(TIM5, 0xFFFF); - TIM_ITConfig(TIM5, TIM_IT_CC1, ENABLE); + // Let's leave the interrupt disabled until we are done configuring everything TIM_CCxCmd(TIM5, TIM_Channel_1, TIM_CCx_Enable); TIM_CCxNCmd(TIM5, TIM_Channel_1, TIM_CCx_Enable); @@ -127,14 +127,23 @@ void adc_init() ADC_DMACmd(ADC1, ENABLE); } +void adc_start() +{ + TIM_ITConfig(TIM5, TIM_IT_CC1, ENABLE); +} + void DMA2_Stream0_IRQHandler() { int sample; + int peaking; + DMA_ClearFlag(ADC_RX_DMA_STREAM, DMA_FLAG_TCIF0); sample = ((adc_buffer[0] + adc_buffer[1]) / 2) - 2048; + peaking = (adc_buffer[0] < -640+2048) || (adc_buffer[0] > 520+2048); + peaking |= (adc_buffer[1] < -640+2048) || (adc_buffer[1] > 520+2048); - GotSample(sample); + GotSample(sample, peaking); } // Only for debugging. Currently disabled. diff --git a/firmware/adc.h b/firmware/adc.h index beb68e3..aa4a9c3 100644 --- a/firmware/adc.h +++ b/firmware/adc.h @@ -11,5 +11,6 @@ // TODO: Update the IRQ handler in adc.c when updating the stream / channel. void adc_init(); +void adc_start(); #endif diff --git a/firmware/lib/systems.c b/firmware/lib/systems.c index a7390f0..34de2d3 100644 --- a/firmware/lib/systems.c +++ b/firmware/lib/systems.c @@ -168,7 +168,9 @@ void ConfigureUART() void ConfigureLED() { - ConfigureGPIO( LEDPIN, INOUT_OUT ); + ConfigureGPIO(LED_RED, INOUT_OUT); + ConfigureGPIO(LED_GREEN, INOUT_OUT); + ConfigureGPIO(LED_BLUE, INOUT_OUT); } uint8_t GetGPIOFromString( const char * str ) diff --git a/firmware/lib/systems.h b/firmware/lib/systems.h index 3c17f6c..7346391 100644 --- a/firmware/lib/systems.h +++ b/firmware/lib/systems.h @@ -50,18 +50,20 @@ void ConfigureGPIO( gpio gpio, int parameters ); #ifdef STM32F30X #define LEDPIN 0x18 #elif defined( STM32F40_41xxx ) -#define LEDPIN (16+14) +#define LEDPIN (16+13) #endif +#define LED_GREEN (LEDPIN+0) +#define LED_BLUE (LEDPIN+1) +#define LED_RED (LEDPIN+2) + void ConfigureUART(); void ConfigureLED(); void JumpToBootloader(void); -#define LED_TOGGLE {GPIOOf(LEDPIN)->ODR^=(1<<((LEDPIN)&0x0f));} -#define LED_ON GPIOOn(LEDPIN) -#define LED_OFF GPIOOff(LEDPIN) - +#define LED_ON(p) GPIOOn(p) +#define LED_OFF(p) GPIOOff(p) #endif diff --git a/firmware/main.c b/firmware/main.c index 9be3980..c5d5cac 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -25,12 +25,21 @@ int16_t sampbuff[CIRCBUFSIZE]; volatile int samples; //This gets called by the ADC/Microphone -void GotSample( int samp ) +void GotSample(int samp, int peaking) { //printf("[GOT-SMP] %d\r\n", samp); sampbuff[last_samp_pos] = samp; last_samp_pos = ((last_samp_pos+1)%CIRCBUFSIZE); samples++; + + if (peaking) { + LED_ON(LED_RED); + } else if (samp > 128) { + LED_ON(LED_BLUE); + } else { + LED_OFF(LED_BLUE); + // Red LED reset in main loop + } } //Call this once we've stacked together one full colorchord frame. @@ -107,10 +116,8 @@ int main(void) uint32_t i = 0; RCC_GetClocksFreq( &RCC_Clocks ); - - ConfigureLED(); - LED_OFF; + ConfigureLED(); // SysTick end of count event each 10ms SysTick_Config( RCC_Clocks.HCLK_Frequency / 100); @@ -129,10 +136,8 @@ int main(void) int this_samp = 0; int wf = 0; - - LED_ON; - int c = 1; + LED_ON(LED_RED); while (1) { for (int a=0; a < NUM_LIN_LEDS; a++) { ledOut[a*3 + 0] = c/2; @@ -143,17 +148,31 @@ int main(void) SendSPI2812(ledOut, NUM_LIN_LEDS); _delay_us(10*1000); c++; - if (c==64) + if (c==16) { + LED_OFF(LED_RED); + LED_ON(LED_BLUE); + } else if (c==32) { + LED_OFF(LED_BLUE); + LED_ON(LED_GREEN); + } else if (c==48) { + LED_OFF(LED_GREEN); + } else if (c==64) { break; + } } - + + LED_OFF(LED_RED); + LED_OFF(LED_GREEN); + LED_OFF(LED_BLUE); SendSPI2812(ledOut, NUM_LIN_LEDS); + adc_start(); + while(1) { if( this_samp != last_samp_pos ) { - LED_OFF; //Use led on the board to show us how much CPU we're using. (You can also probe PB15) + LED_OFF(LED_GREEN); //Use led on the board to show us how much CPU we're using. (You can also probe PB15) PushSample32( sampbuff[this_samp] ); //Can't put in full volume. (here was /2) @@ -164,10 +183,11 @@ int main(void) { NewFrame(); wf = 0; + LED_OFF(LED_RED); } - LED_ON; + LED_ON(LED_GREEN); } - LED_ON; //Take up a little more time to make sure we don't miss this. + LED_ON(LED_GREEN); //Take up a little more time to make sure we don't miss this. } }