diff --git a/Makefile b/Makefile index a4e6916..9b28a97 100644 --- a/Makefile +++ b/Makefile @@ -83,6 +83,7 @@ src/resource.c \ src/animation.c \ src/font.c \ src/power.c \ +src/audio.c \ # ASM sources diff --git a/src/audio.c b/src/audio.c new file mode 100644 index 0000000..a097279 --- /dev/null +++ b/src/audio.c @@ -0,0 +1,25 @@ +#include "CH58x_common.h" + +#include "leddrv.h" + +// TODO: setup an interrupt instead of polling, now is just for POC +int16_t mic_adc() +{ + ADC_ChannelCfg(11); + uint64_t sum = 0; + for (int i = 0; i < 64; i++) { + sum += ADC_ExcutSingleConver(); + // mDelayuS(1); + } + + // adc idle level is 2048. Normalizing this to 0 + return sum / 64 - 2048; +} + +void mic_init() +{ + /* adc 11 - pa7 */ + GPIOA_ModeCfg(GPIO_Pin_7, GPIO_ModeIN_Floating); + ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0); + ADC_ChannelCfg(11); +} diff --git a/src/audio.h b/src/audio.h new file mode 100644 index 0000000..9b0e399 --- /dev/null +++ b/src/audio.h @@ -0,0 +1,31 @@ +#ifndef __AUDIO_H__ +#define __AUDIO_H__ + +#include + +const uint16_t amp_wav_lut[8] = { + 0b00000000000, + 0b00000100000, + 0b00001110000, + 0b00011111000, + 0b00111111100, + 0b01111111110, + 0b11111111111, + 0b11111111111, +}; + +const uint16_t amp_wav_lut_w1[8] = { + 0b00000100000, + 0b00001110000, + 0b00011111000, + 0b00111111100, + 0b01111111110, + 0b11111111111, + 0b11111111111, + 0b11111111111, +}; + +int16_t mic_adc(); +void mic_init(); + +#endif /* __AUDIO_H__ */ diff --git a/src/main.c b/src/main.c index a1127cb..7945239 100644 --- a/src/main.c +++ b/src/main.c @@ -2,6 +2,7 @@ #include "CH58x_sys.h" #include "CH58xBLE_LIB.h" +#include "audio.h" #include "leddrv.h" #include "button.h" #include "bmlist.h" @@ -30,6 +31,7 @@ enum MODES { NORMAL, DOWNLOAD, POWER_OFF, + AUDIO, MODES_COUNT, }; @@ -60,6 +62,7 @@ static void change_brightness() static void mode_setup_download(); static void mode_setup_normal(); +static void mode_setup_audio_visualize(); __HIGH_CODE static void change_mode() @@ -69,6 +72,7 @@ static void change_mode() NULL, mode_setup_normal, mode_setup_download, + mode_setup_audio_visualize, poweroff }; @@ -398,6 +402,29 @@ static void mode_setup_normal() start_normal_animation(); } +static void audio_visualize_poll() +{ + while (1) { + for (int i=0; i