From 5c0d159ef9d352c0eab4539e4880b21393861f9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sat, 3 Sep 2016 11:13:42 +0200 Subject: [PATCH] better capturing code, untested fft code added --- .mxproject | 6 +- CMakeLists.txt | 3 + Src/stm32f1xx_it.c | 10 ++-- Src/tim.c | 2 +- Src/user_main.c | 135 +++++++++++++++++++++++++++++++++++++-------- 5 files changed, 123 insertions(+), 33 deletions(-) diff --git a/.mxproject b/.mxproject index d18b693..eb83849 100644 --- a/.mxproject +++ b/.mxproject @@ -1,12 +1,12 @@ +[PreviousLibFiles] +LibFiles=Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f100xb.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f102x6.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103x6.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f100xe.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xg.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f101xe.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f101x6.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xe.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f101xb.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f107xc.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f105xc.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f102xb.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f101xg.h; + [PreviousGenFiles] HeaderPath=/home/ondra/devel/f107-fft/Inc SourcePath=/home/ondra/devel/f107-fft/Src SourceFiles=gpio.h;adc.h;dma.h;spi.h;stm32f1xx_it.h;stm32f1xx_hal_conf.h;mxconstants.h;gpio.c;adc.c;dma.c;spi.c;stm32f1xx_it.c;stm32f1xx_hal_msp.c;main.c;tim.h;tim.c;usart.h;usart.c; HeaderFiles=gpio.h;adc.h;dma.h;spi.h;stm32f1xx_it.h;stm32f1xx_hal_conf.h;mxconstants.h;tim.h;usart.h; -[PreviousLibFiles] -LibFiles=Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f100xb.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f102x6.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103x6.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f100xe.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xg.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f101xe.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f101x6.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xe.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f101xb.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f107xc.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f105xc.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f102xb.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f101xg.h; - [PreviousUsedRideFiles] HeaderPath=../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Include;../Drivers/CMSIS/Device/ST/STM32F1xx/Include; SourceFiles=../Src/main.c;../Src/gpio.c;../Src/adc.c;../Src/dma.c;../Src/spi.c;../Src/tim.c;../Src/usart.c;../Src/stm32f1xx_it.c;../Src/stm32f1xx_hal_msp.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;../Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;../Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc/startup_stm32f107xc.s; diff --git a/CMakeLists.txt b/CMakeLists.txt index cf2c27b..dd0d3a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,9 @@ include_directories(/usr/lib/gcc/arm-none-eabi/6.1.1/include/) add_definitions(-DSTM32F107xC) +add_definitions(-DARM_MATH_CM3) +add_definitions(-DF_CPU=72000000UL) + add_definitions(-DUSE_FULL_ASSERT) add_executable(${PROJECT_NAME}.elf ${USER_SOURCES} ${LINKER_SCRIPT}) diff --git a/Src/stm32f1xx_it.c b/Src/stm32f1xx_it.c index 55b4251..25ec695 100644 --- a/Src/stm32f1xx_it.c +++ b/Src/stm32f1xx_it.c @@ -31,12 +31,12 @@ ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ -#include #include "stm32f1xx_hal.h" #include "stm32f1xx.h" #include "stm32f1xx_it.h" /* USER CODE BEGIN 0 */ +#include "utils.h" /* USER CODE END 0 */ @@ -66,7 +66,7 @@ void NMI_Handler(void) void HardFault_Handler(void) { /* USER CODE BEGIN HardFault_IRQn 0 */ - uart_print("Hard fault.\n"); + uart_print("Hard fault.\n"); /* USER CODE END HardFault_IRQn 0 */ while (1) @@ -83,7 +83,7 @@ void HardFault_Handler(void) void MemManage_Handler(void) { /* USER CODE BEGIN MemoryManagement_IRQn 0 */ - uart_print("MemManage fault.\n"); + uart_print("MemManage fault.\n"); /* USER CODE END MemoryManagement_IRQn 0 */ while (1) @@ -100,7 +100,7 @@ void MemManage_Handler(void) void BusFault_Handler(void) { /* USER CODE BEGIN BusFault_IRQn 0 */ - uart_print("Bus fault.\n"); + uart_print("Bus fault.\n"); /* USER CODE END BusFault_IRQn 0 */ while (1) @@ -117,7 +117,7 @@ void BusFault_Handler(void) void UsageFault_Handler(void) { /* USER CODE BEGIN UsageFault_IRQn 0 */ - uart_print("Usage fault.\n"); + uart_print("Usage fault.\n"); /* USER CODE END UsageFault_IRQn 0 */ while (1) diff --git a/Src/tim.c b/Src/tim.c index fce6ce9..2d7f21a 100644 --- a/Src/tim.c +++ b/Src/tim.c @@ -50,7 +50,7 @@ void MX_TIM3_Init(void) htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; - htim3.Init.Period = 6000;//1800 + htim3.Init.Period = 1800; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_OC_Init(&htim3) != HAL_OK) { diff --git a/Src/user_main.c b/Src/user_main.c index e50ae25..787790b 100644 --- a/Src/user_main.c +++ b/Src/user_main.c @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include "mxconstants.h" #include "stm32f1xx_hal.h" #include "utils.h" @@ -12,37 +14,116 @@ #include "tim.h" #include "user_main.h" -static uint32_t audio_samples[256]; +#define SAMPLE_COUNT 256 +#define BIN_COUNT (SAMPLE_COUNT/2) + +#define SCREEN_W 32 +#define SCREEN_H 16 + +static uint32_t audio_samples[SAMPLE_COUNT * 2]; // 2x size needed for complex FFT +static float *audio_samples_f = (float *) audio_samples; static DotMatrix_Cfg *disp; -void start_DMA() { +static volatile bool capture_pending = false; + +static void display_wave(); +static void display_fft(); + +void capture_start() +{ + if (capture_pending) return; + capture_pending = true; + //uart_print("- Starting ADC DMA\n"); - HAL_ADC_Start_DMA(&hadc1, audio_samples, 32); + HAL_ADC_Start_DMA(&hadc1, audio_samples, SAMPLE_COUNT); HAL_TIM_Base_Start(&htim3); } /** This callback is called by HAL after the transfer is complete */ -void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) { -// uart_print("- DMA complete.\n"); +void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) +{ + display_wave(); + capture_pending = false; +} -// char x[100]; -// -// for (int i = 0; i < 256; i++) { -// sprintf(x, "%"PRIu32" ", audio_samples[i]); -// uart_print(x); -// } -// uart_print("\n"); +/** + * Convert audio samples to float. + * NOTE: This trashes the original array of ints, they share the same memory location. + */ +void samples_to_float() +{ + // Convert to float + for (int i = 0; i < SAMPLE_COUNT; i++) { + audio_samples_f[i] = (float) audio_samples[i]; + } + + // Obtain mean value + float mean; + arm_mean_f32(audio_samples_f, SAMPLE_COUNT, &mean); + // Subtract mean from all samples + for (int i = 0; i < SAMPLE_COUNT; i++) { + audio_samples_f[i] -= mean; + } +} + +/** Spread numbers in the samples array so that they are interleaved by zeros (imaginary part) */ +void spread_samples_for_fft() +{ + for (int i = SAMPLE_COUNT - 1; i >= 0; i--) { + audio_samples_f[i * 2 + 1] = 0; // imaginary + audio_samples_f[i * 2] = audio_samples_f[i]; // real + } +} + +/** Display waveform preview */ +void display_wave() +{ dmtx_clear(disp); for (int i = 0; i < 32; i++) { - dmtx_set(disp, i, ((audio_samples[i])>>6)-24, 1); + dmtx_set(disp, i, ((audio_samples[i]) >> 6) - 24, 1); } dmtx_show(disp); } -void user_main() { +/** Calculate and display FFT */ +static void display_fft() +{ + float *bins = audio_samples_f; + + samples_to_float(); + spread_samples_for_fft(); + + const arm_cfft_instance_f32 *S; + S = &arm_cfft_sR_f32_len128; + + arm_cfft_f32(S, bins, 0, true); // bit reversed FFT + arm_cmplx_mag_f32(bins, bins, BIN_COUNT); // get magnitude (extract real values) + + // Normalize & display + + dmtx_clear(dmtx); + + float factor = (1.0f / BIN_COUNT) * 0.25f; + for (int i = 0; i < BIN_COUNT; i++) { // +1 because bin 0 is always 0 + bins[i] *= factor; + } + + // TODO implement offset using gamepad buttons + for (int x = 0; x < SCREEN_W; x++) { + for (int j = 0; j < 1 + floorf(bins[x]); j++) { + dmtx_set(dmtx, x, j, 1); + } + } + + dmtx_show(dmtx); +} + + +void user_main() +{ uart_print("== USER CODE STARTING ==\n"); // Leds OFF @@ -67,22 +148,26 @@ void user_main() { dmtx_clear(disp); dmtx_show(disp); + uint32_t counter = 0; while (1) { - // Blink - HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); - HAL_Delay(50); + if (counter++ == 500) { + counter = 0; + // Blink + HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); + } - //uart_print("Main loop\n"); - start_DMA(); + HAL_Delay(1); - //dmtx_toggle(disp, 31, 15); - //dmtx_show(disp); + if (!capture_pending) { + capture_start(); + } } } //region Error handlers -void user_Error_Handler() { +void user_Error_Handler() +{ uart_print("HAL error occurred.\n"); while (1); } @@ -94,11 +179,13 @@ void user_Error_Handler() { * @param line: assert_param error line source number * @retval None */ -void user_assert_failed(uint8_t *file, uint32_t line) { +void user_assert_failed(uint8_t *file, uint32_t line) +{ user_error_file_line("Assert failed", (const char *) file, line); } -void user_error_file_line(const char *message, const char *file, uint32_t line) { +void user_error_file_line(const char *message, const char *file, uint32_t line) +{ uart_print(message); uart_print(" in file "); uart_print((char *) file);