From a11057d4e76a55d95b49a32bfef26dfbc65f8766 Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Wed, 22 Feb 2023 15:58:59 +0100 Subject: [PATCH] audio output working --- Makefile | 2 +- NANOVNA_STM32_F303/adc.c | 6 +++- NANOVNA_STM32_F303/board.h | 4 +-- NANOVNA_STM32_F303/mcuconf.h | 6 ++-- halconf.h | 2 +- main.c | 63 ++++++++++++++++++++++++++++++++++-- nanovna.h | 5 +++ sa_core.c | 8 ++--- ui.c | 4 +-- 9 files changed, 84 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 4eaf747..85410be 100644 --- a/Makefile +++ b/Makefile @@ -92,7 +92,7 @@ endif ifeq ($(TARGET),F303) USE_FPU = hard - USE_PROCESS_STACKSIZE = 0x380 + USE_PROCESS_STACKSIZE = 0x480 USE_EXCEPTIONS_STACKSIZE = 0x200 endif diff --git a/NANOVNA_STM32_F303/adc.c b/NANOVNA_STM32_F303/adc.c index 5e60cf4..9f06461 100644 --- a/NANOVNA_STM32_F303/adc.c +++ b/NANOVNA_STM32_F303/adc.c @@ -64,7 +64,11 @@ static const ADCConversionGroup adcgrpcfgTouch = { NULL, // adcerrorcallback_touch // CFGR ADC_CFGR_EXTEN_0 // rising edge of external trigger - | ADC_CFGR_EXTSEL_2 // EXT4 0x1000 event (TIM3_TRGO) + + | ADC_CFGR_EXTSEL_3 | ADC_CFGR_EXTSEL_0 // EXT4 0x1001 event (TIM1_TRGO) +// | ADC_CFGR_EXTSEL_2 // EXT4 0x100 event (TIM3_TRGO) + + | ADC_CFGR_AWD1EN, // Enable Analog watchdog check interrupt ADC_TR(0, TOUCH_THRESHOLD), // Analog watchdog threshold TR1, interrupt on touch press {ADC_SMPR1_SMP_AN4(ADC_TOUCH_SMP_TIME), 0}, // SMPR[2] diff --git a/NANOVNA_STM32_F303/board.h b/NANOVNA_STM32_F303/board.h index 76e0649..71f9f9f 100644 --- a/NANOVNA_STM32_F303/board.h +++ b/NANOVNA_STM32_F303/board.h @@ -162,7 +162,7 @@ PIN_MODE_INPUT(1U) | \ PIN_MODE_INPUT(2U) | \ PIN_MODE_INPUT(3U) | \ - PIN_MODE_INPUT(GPIO_SD_DAT2) | \ + PIN_MODE_ALTERNATE(GPIO_SD_DAT2) | \ PIN_MODE_ANALOG(GPIOA_DAC2) | \ PIN_MODE_ANALOG(GPIOA_XP) | \ PIN_MODE_ANALOG(GPIOA_YP) | \ @@ -242,7 +242,7 @@ PIN_AFIO_AF(1, 0) | \ PIN_AFIO_AF(2, 0) | \ PIN_AFIO_AF(3, 0) | \ - PIN_AFIO_AF(GPIO_SD_DAT2, 0) | \ + PIN_AFIO_AF(GPIO_SD_DAT2, 2) | \ PIN_AFIO_AF(5, 0) | \ PIN_AFIO_AF(6, 0) | \ PIN_AFIO_AF(7, 0)) diff --git a/NANOVNA_STM32_F303/mcuconf.h b/NANOVNA_STM32_F303/mcuconf.h index 391e522..4dedf5d 100644 --- a/NANOVNA_STM32_F303/mcuconf.h +++ b/NANOVNA_STM32_F303/mcuconf.h @@ -153,9 +153,9 @@ /* * GPT driver system settings. */ -#define STM32_GPT_USE_TIM1 FALSE +#define STM32_GPT_USE_TIM1 TRUE #define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 TRUE +#define STM32_GPT_USE_TIM3 FALSE #define STM32_GPT_USE_TIM4 TRUE #define STM32_GPT_TIM1_IRQ_PRIORITY 2 #define STM32_GPT_TIM2_IRQ_PRIORITY 2 @@ -210,7 +210,7 @@ #define STM32_PWM_USE_ADVANCED FALSE #define STM32_PWM_USE_TIM1 FALSE #define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE +#define STM32_PWM_USE_TIM3 TRUE #define STM32_PWM_TIM1_IRQ_PRIORITY 3 #define STM32_PWM_TIM2_IRQ_PRIORITY 3 #define STM32_PWM_TIM3_IRQ_PRIORITY 3 diff --git a/halconf.h b/halconf.h index 9d34c41..c42c81f 100644 --- a/halconf.h +++ b/halconf.h @@ -115,7 +115,7 @@ * @brief Enables the PWM subsystem. */ #if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE +#define HAL_USE_PWM TRUE #endif /** diff --git a/main.c b/main.c index cf2e39c..bb94623 100644 --- a/main.c +++ b/main.c @@ -2529,6 +2529,60 @@ THD_FUNCTION(myshellThread, p) #pragma GCC pop_options +#ifdef __PWM__ + + +static void audio_toggle(void) +{ + static volatile int h = 0; + if (h) { + DAC->DHR12R1 = 0; + h = 0; + } else { + DAC->DHR12R1 = 4095; + h = 1; + } +} + +static PWMConfig pwmcfg = { + 400000, /* 400kHz PWM clock frequency. */ + 100, /* Initial PWM frequency is 4kHz */ + NULL, + { + {PWM_OUTPUT_DISABLED, NULL}, + {PWM_OUTPUT_ACTIVE_HIGH, audio_toggle}, + {PWM_OUTPUT_DISABLED, NULL}, + {PWM_OUTPUT_DISABLED, NULL} + }, + 0, + 0 +}; + +#define PWM_TIMER PWMD3 +#define PWM_CHANNEL 1 // Channel 2 +void pwm_init(void) { + palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(6)); // PA9 + palSetPadMode(GPIOA, 4, PAL_MODE_ALTERNATE(2)); // PA4 Time 3 channel 2 + pwmStart(&PWM_TIMER, &pwmcfg); + pwmEnableChannel(&PWM_TIMER, PWM_CHANNEL, PWM_PERCENTAGE_TO_WIDTH(&PWM_TIMER, 5000)); + pwmEnableChannelNotification(&PWM_TIMER, PWM_CHANNEL); +} + +void pwm_start(int f) +{ + pwmcfg.frequency = f*100; + pwmStart(&PWM_TIMER, &pwmcfg); +// pwmChangePeriod(&PWM_TIMER, f); + pwmEnableChannel(&PWM_TIMER, PWM_CHANNEL, PWM_PERCENTAGE_TO_WIDTH(&PWM_TIMER, 5000)); +} + +void pwm_stop(void) +{ + pwmDisableChannel(&PWM_TIMER, PWM_CHANNEL); +} +#endif + + static const GPTConfig gpt4cfg = { 8000000, // 8 MHz timer clock. NULL, // No callback @@ -2646,14 +2700,19 @@ int main(void) spi_init(); PULSE - +#ifdef __PWM__ + pwm_init(); + pwm_start(2000); + pwm_stop(); +#endif /* * Set LCD display brightness (use DAC2 for control) * Starting DAC1 driver, setting up the output pin as analog as suggested by the Reference Manual. */ dac_init(); PULSE - DAC->CR|= DAC_CR_EN1 | DAC_CR_EN2; // Use DAC: CH1 and CH2 +// DAC->CR|= DAC_CR_EN1 | DAC_CR_EN2; // Use DAC: CH1 and CH2 + DAC->CR|= DAC_CR_EN2; // Use DAC: CH1 and CH2 #ifdef __LCD_BRIGHTNESS__ lcd_setBrightness(DEFAULT_BRIGHTNESS); #endif diff --git a/nanovna.h b/nanovna.h index a7582ce..1959ce0 100644 --- a/nanovna.h +++ b/nanovna.h @@ -119,6 +119,11 @@ //#define __USE_FREQ_TABLE__ // Enable use table for frequency list #endif +#ifdef __GUARD__ +#define __PWM__ +#endif + + #ifdef TINYSA3 #define VARIANT(X,Y) (X) #define DEFAULT_IF 433800000 diff --git a/sa_core.c b/sa_core.c index 4f22808..c1109fc 100644 --- a/sa_core.c +++ b/sa_core.c @@ -4872,14 +4872,14 @@ static bool sweep(bool break_on_operation) if (current_guard > GUARDS_MAX) current_guard = 0; } - while(!setting.guards[current_guard].enabled); + while(!(setting.guards[current_guard].enabled)); if (setting.guards[current_guard].end > setting.guards[current_guard].start) { set_sweep_frequency(ST_START, setting.guards[current_guard].start); set_sweep_frequency(ST_STOP, setting.guards[current_guard].end); set_rbw(8000); set_sweep_points((setting.guards[current_guard].end - setting.guards[current_guard].start) / 800000); } - DAC->DHR12R1 = 0; + pwm_stop(); } #endif @@ -5213,7 +5213,7 @@ static volatile int dummy; if (MODE_INPUT(setting.mode)) { #ifdef __GUARD__ if (setting.measurement == M_GUARD && RSSI > setting.guards[current_guard].level) { - DAC->DHR12R1 = 4095; + pwm_start(4000); } #endif for (int t=0; t