diff --git a/Inc/main.h b/Inc/main.h index 04f69cb..b8c26e7 100644 --- a/Inc/main.h +++ b/Inc/main.h @@ -61,12 +61,12 @@ #define VCP_TX_Pin GPIO_PIN_2 #define VCP_TX_GPIO_Port GPIOA +#define AUDIO_IN_Pin GPIO_PIN_3 +#define AUDIO_IN_GPIO_Port GPIOA #define AUDIO_OUT_DAC_Pin GPIO_PIN_4 #define AUDIO_OUT_DAC_GPIO_Port GPIOA #define AUDIO_IN_VREF_Pin GPIO_PIN_5 #define AUDIO_IN_VREF_GPIO_Port GPIOA -#define AUDIO_OUT_ATTEN_Pin GPIO_PIN_0 -#define AUDIO_OUT_ATTEN_GPIO_Port GPIOB #define BUTTON_AUDIO_IN_ADJUST_Pin GPIO_PIN_1 #define BUTTON_AUDIO_IN_ADJUST_GPIO_Port GPIOB #define BUTTON_AUDIO_IN_ADJUST_EXTI_IRQn EXTI1_IRQn @@ -88,6 +88,8 @@ #define VCP_RX_GPIO_Port GPIOA #define LD3_Pin GPIO_PIN_3 #define LD3_GPIO_Port GPIOB +#define AUDIO_OUT_ATTEN_Pin GPIO_PIN_5 +#define AUDIO_OUT_ATTEN_GPIO_Port GPIOB /* ########################## Assert Selection ############################## */ /** diff --git a/Nucleo_L432KC_TNC.ioc b/Nucleo_L432KC_TNC.ioc index d6334fc..f8a9d35 100644 --- a/Nucleo_L432KC_TNC.ioc +++ b/Nucleo_L432KC_TNC.ioc @@ -13,17 +13,21 @@ ADC1.EnableInjectedConversion=DISABLE ADC1.EnableRegularConversion=ENABLE ADC1.ExternalTrigConv=ADC_EXTERNALTRIG_T6_TRGO ADC1.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_RISING -ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,NbrOfConversionFlag,master,DMAContinuousRequests,Overrun,ExternalTrigConv,OversamplingMode,ClockPrescaler,Resolution,DataAlign,ScanConvMode,ContinuousConvMode,DiscontinuousConvMode,EOCSelection,LowPowerAutoWait,EnableRegularConversion,NbrOfConversion,ExternalTrigConvEdge,EnableInjectedConversion,EnableAnalogWatchDog1,EnableAnalogWatchDog2,EnableAnalogWatchDog3 +ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,NbrOfConversionFlag,DMAContinuousRequests,Overrun,ExternalTrigConv,OversamplingMode,ClockPrescaler,Resolution,DataAlign,ScanConvMode,ContinuousConvMode,DiscontinuousConvMode,EOCSelection,LowPowerAutoWait,EnableRegularConversion,NbrOfConversion,ExternalTrigConvEdge,EnableInjectedConversion,EnableAnalogWatchDog1,EnableAnalogWatchDog2,EnableAnalogWatchDog3,RightBitShift,Ratio,OversamplingStopReset,TriggeredMode,master ADC1.LowPowerAutoWait=DISABLE ADC1.NbrOfConversion=1 ADC1.NbrOfConversionFlag=1 ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE ADC1.Overrun=ADC_OVR_DATA_OVERWRITTEN -ADC1.OversamplingMode=DISABLE +ADC1.OversamplingMode=ENABLE +ADC1.OversamplingStopReset=ADC_REGOVERSAMPLING_CONTINUED_MODE ADC1.Rank-0\#ChannelRegularConversion=1 +ADC1.Ratio=ADC_OVERSAMPLING_RATIO_16 ADC1.Resolution=ADC_RESOLUTION_12B -ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5 +ADC1.RightBitShift=ADC_RIGHTBITSHIFT_2 +ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_6CYCLES_5 ADC1.ScanConvMode=ADC_SCAN_DISABLE +ADC1.TriggeredMode=ADC_TRIGGEREDMODE_SINGLE_TRIGGER ADC1.master=1 CRC.CRCLength=CRC_POLYLENGTH_16B CRC.DefaultInitValueUse=DEFAULT_INIT_VALUE_DISABLE @@ -35,76 +39,77 @@ CRC.InputDataInversionMode=CRC_INPUTDATA_INVERSION_BYTE DAC1.DAC_Channel-DAC_OUT2=DAC_CHANNEL_2 DAC1.DAC_Trigger-DAC_OUT1=DAC_TRIGGER_T7_TRGO DAC1.IPParameters=DAC_Channel-DAC_OUT2,DAC_Trigger-DAC_OUT1 -Dma.ADC1.0.Direction=DMA_PERIPH_TO_MEMORY -Dma.ADC1.0.Instance=DMA1_Channel1 -Dma.ADC1.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD -Dma.ADC1.0.MemInc=DMA_MINC_ENABLE -Dma.ADC1.0.Mode=DMA_CIRCULAR -Dma.ADC1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD -Dma.ADC1.0.PeriphInc=DMA_PINC_DISABLE -Dma.ADC1.0.Priority=DMA_PRIORITY_LOW -Dma.ADC1.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority -Dma.DAC_CH1.3.Direction=DMA_MEMORY_TO_PERIPH -Dma.DAC_CH1.3.Instance=DMA2_Channel4 -Dma.DAC_CH1.3.MemDataAlignment=DMA_MDATAALIGN_HALFWORD -Dma.DAC_CH1.3.MemInc=DMA_MINC_ENABLE -Dma.DAC_CH1.3.Mode=DMA_CIRCULAR -Dma.DAC_CH1.3.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD -Dma.DAC_CH1.3.PeriphInc=DMA_PINC_DISABLE -Dma.DAC_CH1.3.Priority=DMA_PRIORITY_LOW -Dma.DAC_CH1.3.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority -Dma.I2C3_RX.4.Direction=DMA_PERIPH_TO_MEMORY -Dma.I2C3_RX.4.Instance=DMA1_Channel3 -Dma.I2C3_RX.4.MemDataAlignment=DMA_MDATAALIGN_BYTE -Dma.I2C3_RX.4.MemInc=DMA_MINC_ENABLE -Dma.I2C3_RX.4.Mode=DMA_NORMAL -Dma.I2C3_RX.4.PeriphDataAlignment=DMA_PDATAALIGN_BYTE -Dma.I2C3_RX.4.PeriphInc=DMA_PINC_DISABLE -Dma.I2C3_RX.4.Priority=DMA_PRIORITY_LOW -Dma.I2C3_RX.4.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority -Dma.I2C3_TX.5.Direction=DMA_MEMORY_TO_PERIPH -Dma.I2C3_TX.5.Instance=DMA1_Channel2 -Dma.I2C3_TX.5.MemDataAlignment=DMA_MDATAALIGN_BYTE -Dma.I2C3_TX.5.MemInc=DMA_MINC_ENABLE -Dma.I2C3_TX.5.Mode=DMA_NORMAL -Dma.I2C3_TX.5.PeriphDataAlignment=DMA_PDATAALIGN_BYTE -Dma.I2C3_TX.5.PeriphInc=DMA_PINC_DISABLE -Dma.I2C3_TX.5.Priority=DMA_PRIORITY_LOW -Dma.I2C3_TX.5.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority -Dma.Request0=ADC1 -Dma.Request1=USART2_RX -Dma.Request2=USART2_TX -Dma.Request3=DAC_CH1 -Dma.Request4=I2C3_RX -Dma.Request5=I2C3_TX +Dma.ADC1.5.Direction=DMA_PERIPH_TO_MEMORY +Dma.ADC1.5.Instance=DMA1_Channel1 +Dma.ADC1.5.MemDataAlignment=DMA_MDATAALIGN_HALFWORD +Dma.ADC1.5.MemInc=DMA_MINC_ENABLE +Dma.ADC1.5.Mode=DMA_CIRCULAR +Dma.ADC1.5.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD +Dma.ADC1.5.PeriphInc=DMA_PINC_DISABLE +Dma.ADC1.5.Priority=DMA_PRIORITY_LOW +Dma.ADC1.5.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority +Dma.DAC_CH1.2.Direction=DMA_MEMORY_TO_PERIPH +Dma.DAC_CH1.2.Instance=DMA2_Channel4 +Dma.DAC_CH1.2.MemDataAlignment=DMA_MDATAALIGN_HALFWORD +Dma.DAC_CH1.2.MemInc=DMA_MINC_ENABLE +Dma.DAC_CH1.2.Mode=DMA_CIRCULAR +Dma.DAC_CH1.2.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD +Dma.DAC_CH1.2.PeriphInc=DMA_PINC_DISABLE +Dma.DAC_CH1.2.Priority=DMA_PRIORITY_LOW +Dma.DAC_CH1.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority +Dma.I2C3_RX.3.Direction=DMA_PERIPH_TO_MEMORY +Dma.I2C3_RX.3.Instance=DMA1_Channel3 +Dma.I2C3_RX.3.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.I2C3_RX.3.MemInc=DMA_MINC_ENABLE +Dma.I2C3_RX.3.Mode=DMA_NORMAL +Dma.I2C3_RX.3.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.I2C3_RX.3.PeriphInc=DMA_PINC_DISABLE +Dma.I2C3_RX.3.Priority=DMA_PRIORITY_LOW +Dma.I2C3_RX.3.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority +Dma.I2C3_TX.4.Direction=DMA_MEMORY_TO_PERIPH +Dma.I2C3_TX.4.Instance=DMA1_Channel2 +Dma.I2C3_TX.4.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.I2C3_TX.4.MemInc=DMA_MINC_ENABLE +Dma.I2C3_TX.4.Mode=DMA_NORMAL +Dma.I2C3_TX.4.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.I2C3_TX.4.PeriphInc=DMA_PINC_DISABLE +Dma.I2C3_TX.4.Priority=DMA_PRIORITY_LOW +Dma.I2C3_TX.4.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority +Dma.Request0=USART2_RX +Dma.Request1=USART2_TX +Dma.Request2=DAC_CH1 +Dma.Request3=I2C3_RX +Dma.Request4=I2C3_TX +Dma.Request5=ADC1 Dma.RequestsNb=6 -Dma.USART2_RX.1.Direction=DMA_PERIPH_TO_MEMORY -Dma.USART2_RX.1.Instance=DMA1_Channel6 -Dma.USART2_RX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE -Dma.USART2_RX.1.MemInc=DMA_MINC_ENABLE -Dma.USART2_RX.1.Mode=DMA_NORMAL -Dma.USART2_RX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE -Dma.USART2_RX.1.PeriphInc=DMA_PINC_DISABLE -Dma.USART2_RX.1.Priority=DMA_PRIORITY_LOW -Dma.USART2_RX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority -Dma.USART2_TX.2.Direction=DMA_MEMORY_TO_PERIPH -Dma.USART2_TX.2.Instance=DMA1_Channel7 -Dma.USART2_TX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE -Dma.USART2_TX.2.MemInc=DMA_MINC_ENABLE -Dma.USART2_TX.2.Mode=DMA_NORMAL -Dma.USART2_TX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE -Dma.USART2_TX.2.PeriphInc=DMA_PINC_DISABLE -Dma.USART2_TX.2.Priority=DMA_PRIORITY_LOW -Dma.USART2_TX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority +Dma.USART2_RX.0.Direction=DMA_PERIPH_TO_MEMORY +Dma.USART2_RX.0.Instance=DMA1_Channel6 +Dma.USART2_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.USART2_RX.0.MemInc=DMA_MINC_ENABLE +Dma.USART2_RX.0.Mode=DMA_NORMAL +Dma.USART2_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.USART2_RX.0.PeriphInc=DMA_PINC_DISABLE +Dma.USART2_RX.0.Priority=DMA_PRIORITY_LOW +Dma.USART2_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority +Dma.USART2_TX.1.Direction=DMA_MEMORY_TO_PERIPH +Dma.USART2_TX.1.Instance=DMA1_Channel7 +Dma.USART2_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.USART2_TX.1.MemInc=DMA_MINC_ENABLE +Dma.USART2_TX.1.Mode=DMA_NORMAL +Dma.USART2_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.USART2_TX.1.PeriphInc=DMA_PINC_DISABLE +Dma.USART2_TX.1.Priority=DMA_PRIORITY_LOW +Dma.USART2_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority FREERTOS.FootprintOK=true FREERTOS.HEAP_NUMBER=4 -FREERTOS.IPParameters=Tasks01,FootprintOK,configUSE_TICKLESS_IDLE,MEMORY_ALLOCATION,configTOTAL_HEAP_SIZE,HEAP_NUMBER,configUSE_TIMERS,Queues01,Timers01 +FREERTOS.IPParameters=Tasks01,FootprintOK,configUSE_TICKLESS_IDLE,MEMORY_ALLOCATION,configTOTAL_HEAP_SIZE,HEAP_NUMBER,configUSE_TIMERS,Queues01,Timers01,configCHECK_FOR_STACK_OVERFLOW FREERTOS.MEMORY_ALLOCATION=2 FREERTOS.Queues01=ioEventQueue,16,uint32_t,0,Static,ioEventQueueBuffer,ioEventQueueControlBlock;serialInputQueue,16,uint32_t,0,Static,serialInputQueueBuffer,serialInputQueueControlBlock;serialOutputQueue,16,uint32_t,0,Static,serialOutputQueueBuffer,serialOutputQueueControlBlock;audioInputQueue,4,uint8_t,0,Static,audioInputQueueBuffer,audioInputQueueControlBlock;hdlcInputQueue,3,uint32_t,0,Static,hdlcInputQueueBuffer,hdlcInputQueueControlBlock;hdlcOutputQueue,3,uint32_t,0,Static,hdlcOutputQueueBuffer,hdlcOutputQueueControlBlock;dacOutputQueue,128,uint8_t,0,Static,dacOutputQueueBuffer,dacOutputQueueControlBlock;adcInputQueue,3,uint32_t,0,Static,adcInputQueueBuffer,adcInputQueueControlBlock FREERTOS.Tasks01=defaultTask,-3,256,startDefaultTask,Default,NULL,Static,defaultTaskBuffer,defaultTaskControlBlock;ioEventTask,-2,384,startIOEventTask,As external,NULL,Static,ioEventTaskBuffer,ioEventTaskControlBlock;audioInputTask,0,512,startAudioInputTask,As external,NULL,Static,audioInputTaskBuffer,audioInputTaskControlBlock;modulatorTask,0,384,startModulatorTask,As external,NULL,Static,modulatorTaskBuffer,modulatorTaskControlBlock FREERTOS.Timers01=beaconTimer1,onBeaconTimer1,osTimerPeriodic,As external,NULL,Dynamic,NULL;beaconTimer2,onBeaconTimer2,osTimerPeriodic,As external,NULL,Dynamic,NULL;beaconTimer3,onBeaconTimer3,osTimerPeriodic,As external,NULL,Dynamic,NULL;beaconTimer4,onBeaconTimer4,osTimerPeriodic,As external,NULL,Dynamic,NULL +FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2 FREERTOS.configTOTAL_HEAP_SIZE=4096 -FREERTOS.configUSE_TICKLESS_IDLE=0 +FREERTOS.configUSE_TICKLESS_IDLE=1 FREERTOS.configUSE_TIMERS=1 File.Version=6 I2C3.I2C_Speed_Mode=I2C_Fast_Plus @@ -131,18 +136,18 @@ Mcu.Name=STM32L432K(B-C)Ux Mcu.Package=UFQFPN32 Mcu.Pin0=PC14-OSC32_IN (PC14) Mcu.Pin1=PC15-OSC32_OUT (PC15) -Mcu.Pin10=PB1 -Mcu.Pin11=PA8 -Mcu.Pin12=PA9 -Mcu.Pin13=PA10 -Mcu.Pin14=PA11 -Mcu.Pin15=PA12 -Mcu.Pin16=PA13 (JTMS-SWDIO) -Mcu.Pin17=PA14 (JTCK-SWCLK) -Mcu.Pin18=PA15 (JTDI) -Mcu.Pin19=PB3 (JTDO-TRACESWO) +Mcu.Pin10=PA8 +Mcu.Pin11=PA9 +Mcu.Pin12=PA10 +Mcu.Pin13=PA11 +Mcu.Pin14=PA12 +Mcu.Pin15=PA13 (JTMS-SWDIO) +Mcu.Pin16=PA14 (JTCK-SWCLK) +Mcu.Pin17=PA15 (JTDI) +Mcu.Pin18=PB3 (JTDO-TRACESWO) +Mcu.Pin19=PB4 (NJTRST) Mcu.Pin2=PA0 -Mcu.Pin20=PB4 (NJTRST) +Mcu.Pin20=PB5 Mcu.Pin21=PB6 Mcu.Pin22=PB7 Mcu.Pin23=VP_ADC1_OPAMP1_OUT @@ -159,13 +164,13 @@ Mcu.Pin5=PA3 Mcu.Pin6=PA4 Mcu.Pin7=PA5 Mcu.Pin8=PA7 -Mcu.Pin9=PB0 +Mcu.Pin9=PB1 Mcu.PinsNb=31 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32L432KCUx -MxCube.Version=4.26.0 -MxDb.Version=DB.4.0.260 +MxCube.Version=4.26.1 +MxDb.Version=DB.4.0.261 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:false\:false\:false NVIC.DMA1_Channel1_IRQn=true\:5\:0\:false\:false\:true\:true\:false NVIC.DMA1_Channel2_IRQn=true\:5\:0\:false\:false\:true\:true\:false @@ -229,9 +234,10 @@ PA2.GPIO_Label=VCP_TX PA2.Locked=true PA2.Mode=Asynchronous PA2.Signal=USART2_TX +PA3.GPIOParameters=GPIO_Label +PA3.GPIO_Label=AUDIO_IN PA3.Locked=true -PA3.Mode=PGA Connected -PA3.Signal=OPAMP1_VOUT +PA3.Signal=SharedAnalog_PA3 PA4.GPIOParameters=GPIO_Label PA4.GPIO_Label=AUDIO_OUT_DAC PA4.Locked=true @@ -242,6 +248,7 @@ PA5.Locked=true PA5.Signal=COMP_DAC12_group PA7.GPIOParameters=GPIO_PuPdOD PA7.GPIO_PuPdOD=GPIO_NOPULL +PA7.Locked=true PA7.Mode=I2C PA7.Signal=I2C3_SCL PA8.GPIOParameters=PinState,GPIO_Label,GPIO_ModeDefaultOutputPP @@ -256,11 +263,6 @@ PA9.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD PA9.Locked=true PA9.PinState=GPIO_PIN_SET PA9.Signal=GPIO_Output -PB0.GPIOParameters=GPIO_Label,GPIO_ModeDefaultOutputPP -PB0.GPIO_Label=AUDIO_OUT_ATTEN -PB0.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD -PB0.Locked=true -PB0.Signal=GPIO_Output PB1.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI PB1.GPIO_Label=BUTTON_AUDIO_IN_ADJUST PB1.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING @@ -274,8 +276,15 @@ PB3\ (JTDO-TRACESWO).Signal=GPIO_Output PB3\ (JTDO-TRACESWO).Stacked=true PB4\ (NJTRST).GPIOParameters=GPIO_PuPdOD PB4\ (NJTRST).GPIO_PuPdOD=GPIO_NOPULL +PB4\ (NJTRST).Locked=true PB4\ (NJTRST).Mode=I2C PB4\ (NJTRST).Signal=I2C3_SDA +PB5.GPIOParameters=PinState,GPIO_Label,GPIO_ModeDefaultOutputPP +PB5.GPIO_Label=AUDIO_OUT_ATTEN +PB5.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD +PB5.Locked=true +PB5.PinState=GPIO_PIN_SET +PB5.Signal=GPIO_Output PB6.Locked=true PB6.Signal=GPIO_Analog PB7.Locked=true @@ -322,7 +331,7 @@ ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=true ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-MX_DMA_Init-DMA-false-HAL-true,3-SystemClock_Config-RCC-false-HAL-false,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_CRC_Init-CRC-false-HAL-true,6-MX_DAC1_Init-DAC1-false-HAL-true,7-MX_OPAMP1_Init-OPAMP1-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_TIM6_Init-TIM6-false-HAL-true,10-MX_TIM7_Init-TIM7-false-HAL-true,11-MX_USART2_UART_Init-USART2-false-HAL-true,12-MX_I2C3_Init-I2C3-false-HAL-true RCC.48CLKFreq_Value=24000000 -RCC.ADCFreq_Value=48000000 +RCC.ADCFreq_Value=80000000 RCC.AHBFreq_Value=48000000 RCC.APB1Freq_Value=48000000 RCC.APB1TimFreq_Value=48000000 @@ -357,17 +366,17 @@ RCC.PLLN=24 RCC.PLLPoutputFreq_Value=13714285.714285715 RCC.PLLQoutputFreq_Value=48000000 RCC.PLLRCLKFreq_Value=48000000 -RCC.PLLSAI1N=24 -RCC.PLLSAI1PoutputFreq_Value=13714285.714285715 -RCC.PLLSAI1QoutputFreq_Value=48000000 -RCC.PLLSAI1RoutputFreq_Value=48000000 +RCC.PLLSAI1N=40 +RCC.PLLSAI1PoutputFreq_Value=22857142.85714286 +RCC.PLLSAI1QoutputFreq_Value=80000000 +RCC.PLLSAI1RoutputFreq_Value=80000000 RCC.PREFETCH_ENABLE=1 RCC.PWRFreq_Value=48000000 -RCC.RNGFreq_Value=48000000 +RCC.RNGFreq_Value=80000000 RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE RCC.RTCFreq_Value=32768 RCC.RTCHSEDivFreq_Value=4000000 -RCC.SAI1Freq_Value=13714285.714285715 +RCC.SAI1Freq_Value=22857142.85714286 RCC.SWPMI1Freq_Value=48000000 RCC.SYSCLKFreq_VALUE=48000000 RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK @@ -376,10 +385,10 @@ RCC.TimerFreq_Value=32000000 RCC.USART1Freq_Value=48000000 RCC.USART2Freq_Value=48000000 RCC.USART3Freq_Value=16000000 -RCC.USBFreq_Value=48000000 +RCC.USBFreq_Value=80000000 RCC.VCOInputFreq_Value=4000000 RCC.VCOOutputFreq_Value=96000000 -RCC.VCOSAI1OutputFreq_Value=96000000 +RCC.VCOSAI1OutputFreq_Value=160000000 RCC.WatchDogFreq_Value=32000 SH.COMP_DAC11_group.0=DAC1_OUT1,DAC_OUT1 SH.COMP_DAC11_group.ConfNb=1 @@ -387,6 +396,9 @@ SH.COMP_DAC12_group.0=DAC1_OUT2,DAC_OUT2 SH.COMP_DAC12_group.ConfNb=1 SH.GPXTI1.0=GPIO_EXTI1 SH.GPXTI1.ConfNb=1 +SH.SharedAnalog_PA3.0=ADC1_IN8 +SH.SharedAnalog_PA3.1=OPAMP1_VOUT,PGA Connected +SH.SharedAnalog_PA3.ConfNb=2 TIM6.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE TIM6.IPParameters=Period,AutoReloadPreload,TIM_MasterOutputTrigger TIM6.Period=1817 diff --git a/Src/main.c b/Src/main.c index 2c148e5..bb7f187 100644 --- a/Src/main.c +++ b/Src/main.c @@ -284,9 +284,11 @@ int main(void) /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ - HAL_DAC_Start(&hdac1, DAC_CHANNEL_2); - HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, 1024); - HAL_OPAMP_Start(&hopamp1); + if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, 1024) != HAL_OK) Error_Handler(); + if (HAL_DAC_Start(&hdac1, DAC_CHANNEL_2) != HAL_OK) Error_Handler(); + if (HAL_OPAMP_SelfCalibrate(&hopamp1) != HAL_OK) Error_Handler(); + if (HAL_OPAMP_Start(&hopamp1) != HAL_OK) Error_Handler(); + if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) != HAL_OK) Error_Handler(); /* USER CODE END RTOS_QUEUES */ @@ -367,7 +369,7 @@ void SystemClock_Config(void) PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_MSI; PeriphClkInit.PLLSAI1.PLLSAI1M = 1; - PeriphClkInit.PLLSAI1.PLLSAI1N = 24; + PeriphClkInit.PLLSAI1.PLLSAI1N = 40; PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7; PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2; PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2; @@ -423,7 +425,11 @@ static void MX_ADC1_Init(void) hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; hadc1.Init.DMAContinuousRequests = ENABLE; hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; - hadc1.Init.OversamplingMode = DISABLE; + hadc1.Init.OversamplingMode = ENABLE; + hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16; + hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_2; + hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; + hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE; if (HAL_ADC_Init(&hadc1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); @@ -433,7 +439,7 @@ static void MX_ADC1_Init(void) */ sConfig.Channel = ADC_CHANNEL_8; sConfig.Rank = ADC_REGULAR_RANK_1; - sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; + sConfig.SamplingTime = ADC_SAMPLETIME_6CYCLES_5; sConfig.SingleDiff = ADC_SINGLE_ENDED; sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.Offset = 0; @@ -743,27 +749,29 @@ static void MX_GPIO_Init(void) __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOB, AUDIO_OUT_ATTEN_Pin|LD3_Pin, GPIO_PIN_RESET); - /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, LED_RED_Pin|LED_GREEN_Pin|LED_YELLOW_Pin, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, PTT_M_Pin|PTT_S_Pin, GPIO_PIN_RESET); + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(AUDIO_OUT_ATTEN_GPIO_Port, AUDIO_OUT_ATTEN_Pin, GPIO_PIN_SET); + /*Configure GPIO pin : PA6 */ GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - /*Configure GPIO pin : AUDIO_OUT_ATTEN_Pin */ - GPIO_InitStruct.Pin = AUDIO_OUT_ATTEN_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; + /*Configure GPIO pins : PB0 PB6 PB7 */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(AUDIO_OUT_ATTEN_GPIO_Port, &GPIO_InitStruct); + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pin : BUTTON_AUDIO_IN_ADJUST_Pin */ GPIO_InitStruct.Pin = BUTTON_AUDIO_IN_ADJUST_Pin; @@ -792,11 +800,12 @@ static void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LD3_GPIO_Port, &GPIO_InitStruct); - /*Configure GPIO pins : PB5 PB6 PB7 */ - GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + /*Configure GPIO pin : AUDIO_OUT_ATTEN_Pin */ + GPIO_InitStruct.Pin = AUDIO_OUT_ATTEN_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(AUDIO_OUT_ATTEN_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : PH3 */ GPIO_InitStruct.Pin = GPIO_PIN_3; @@ -876,6 +885,7 @@ void _Error_Handler(char *file, int line) void assert_failed(uint8_t* file, uint32_t line) { /* USER CODE BEGIN 6 */ + _Error_Handler(file, line); /* User can add his own implementation to report the file name and line number, tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ diff --git a/Src/stm32l4xx_hal_msp.c b/Src/stm32l4xx_hal_msp.c index e3d02e2..2fb6130 100644 --- a/Src/stm32l4xx_hal_msp.c +++ b/Src/stm32l4xx_hal_msp.c @@ -103,6 +103,7 @@ void HAL_MspInit(void) void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) { + GPIO_InitTypeDef GPIO_InitStruct; if(hadc->Instance==ADC1) { /* USER CODE BEGIN ADC1_MspInit 0 */ @@ -111,6 +112,14 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) /* Peripheral clock enable */ __HAL_RCC_ADC_CLK_ENABLE(); + /**ADC1 GPIO Configuration + PA3 ------> ADC1_IN8 + */ + GPIO_InitStruct.Pin = AUDIO_IN_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(AUDIO_IN_GPIO_Port, &GPIO_InitStruct); + /* ADC1 DMA Init */ /* ADC1 Init */ hdma_adc1.Instance = DMA1_Channel1; @@ -146,6 +155,11 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) /* USER CODE END ADC1_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_ADC_CLK_DISABLE(); + + /**ADC1 GPIO Configuration + PA3 ------> ADC1_IN8 + */ + HAL_GPIO_DeInit(AUDIO_IN_GPIO_Port, AUDIO_IN_Pin); /* ADC1 DMA DeInit */ HAL_DMA_DeInit(hadc->DMA_Handle); @@ -381,11 +395,16 @@ void HAL_OPAMP_MspInit(OPAMP_HandleTypeDef* hopamp) PA1 ------> OPAMP1_VINM PA3 ------> OPAMP1_VOUT */ - GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3; + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + GPIO_InitStruct.Pin = AUDIO_IN_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(AUDIO_IN_GPIO_Port, &GPIO_InitStruct); + /* USER CODE BEGIN OPAMP1_MspInit 1 */ /* USER CODE END OPAMP1_MspInit 1 */ @@ -409,7 +428,7 @@ void HAL_OPAMP_MspDeInit(OPAMP_HandleTypeDef* hopamp) PA1 ------> OPAMP1_VINM PA3 ------> OPAMP1_VOUT */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3); + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1|AUDIO_IN_Pin); /* USER CODE BEGIN OPAMP1_MspDeInit 1 */ diff --git a/TNC/AfskDemodulator.hpp b/TNC/AfskDemodulator.hpp index 409beb4..c1119da 100644 --- a/TNC/AfskDemodulator.hpp +++ b/TNC/AfskDemodulator.hpp @@ -123,7 +123,6 @@ struct Demodulator { , nrzi_(), hdlc_decoder_(false), locked_(false) {} - // hdlc::IoFrame* operator()(float* samples, size_t len) __attribute__((section(".bss2"))); hdlc::IoFrame* operator()(float* samples, size_t len); bool locked() const {return locked_;} diff --git a/TNC/AudioInput.cpp b/TNC/AudioInput.cpp index 056bd49..dce4b7c 100644 --- a/TNC/AudioInput.cpp +++ b/TNC/AudioInput.cpp @@ -437,6 +437,7 @@ void demodulatorTask() { bool dcd_status{false}; while (true) { + mobilinkd::tnc::gpio::LD3::off(); osEvent peek = osMessagePeek(audioInputQueueHandle, 0); if (peek.status == osEventMessage) break; @@ -445,6 +446,7 @@ void demodulatorTask() { continue; } ++counter; + mobilinkd::tnc::gpio::LD3::on(); auto block = (adc_pool_type::chunk_type*) evt.value.p; auto samples = (int16_t*) block->buffer; @@ -536,8 +538,8 @@ void streamLevels(uint32_t channel, uint8_t cmd) { uint16_t count = 0; uint32_t accum = 0; - uint16_t min = 4096; - uint16_t max = 0; + uint16_t min = std::numeric_limits::max(); + uint16_t max = std::numeric_limits::min(); while (count < 2640) { osEvent evt = osMessageGet(adcInputQueueHandle, osWaitForever); @@ -547,7 +549,7 @@ void streamLevels(uint32_t channel, uint8_t cmd) { auto block = (adc_pool_type::chunk_type*) evt.value.p; uint16_t* start = (uint16_t*) block->buffer; - uint16_t* end = (uint16_t*) block->buffer + ADC_BUFFER_SIZE; + uint16_t* end = start + ADC_BUFFER_SIZE; min = std::min(min, *std::min_element(start, end)); max = std::max(max, *std::max_element(start, end)); @@ -586,8 +588,8 @@ levels_type readLevels(uint32_t channel, uint32_t samples) { uint16_t count = 0; uint32_t accum = 0; - uint16_t vmin = 4096; - uint16_t vmax = 0; + uint16_t vmin = std::numeric_limits::max(); + uint16_t vmax = std::numeric_limits::min(); INFO("readLevels: start"); startADC(channel); @@ -597,17 +599,19 @@ levels_type readLevels(uint32_t channel, uint32_t samples) { osEvent evt = osMessageGet(adcInputQueueHandle, osWaitForever); if (evt.status != osEventMessage) continue; - count += ADC_BUFFER_SIZE; + auto block = (adc_pool_type::chunk_type*) evt.value.p; + auto start = reinterpret_cast(block->buffer); + auto end = start + ADC_BUFFER_SIZE; - auto block = (adc_pool_type::chunk_type*) evt.value.v; - uint16_t* start = (uint16_t*) block->buffer; - uint16_t* end = (uint16_t*) block->buffer + ADC_BUFFER_SIZE; +// if (count == 0) for (auto it = start; it != end; ++it) DEBUG("%hu\n", *it); vmin = std::min(vmin, *std::min_element(start, end)); vmax = std::max(vmax, *std::max_element(start, end)); accum = std::accumulate(start, end, accum); adcPool.deallocate(block); + + count += ADC_BUFFER_SIZE; } stopADC(); @@ -619,8 +623,10 @@ levels_type readLevels(uint32_t channel, uint32_t samples) { return levels_type(pp, avg, vmin, vmax); } - -constexpr uint32_t TWIST_SAMPLE_SIZE = 264 * 5; +/** + * This provides 100Hz resolution to the Goerztel filter. + */ +constexpr uint32_t TWIST_SAMPLE_SIZE = 88; /* * Return twist as a the difference in dB between mark and space. The @@ -636,10 +642,10 @@ float readTwist() float g1200 = 0.0f; float g2200 = 0.0f; - GoertzelFilter gf1200(1200.0); - GoertzelFilter gf2200(2200.0); + GoertzelFilter gf1200(1200.0, 0); + GoertzelFilter gf2200(2200.0, 0); - const uint32_t AVG_SAMPLES = 100; + const uint32_t AVG_SAMPLES = 20; startADC(channel); @@ -661,17 +667,24 @@ float readTwist() adcPool.deallocate(block); } - g1200 += 10.0 * log10(gf1200); - g2200 += 10.0 * log10(gf2200); + g1200 += (gf1200 / count); + g2200 += (gf2200 / count); gf1200.reset(); gf2200.reset(); } stopADC(); - DEBUG("exit readTwist"); - return (g1200 / AVG_SAMPLES) - (g2200 / AVG_SAMPLES); + g1200 = 10.0f * log10f(g1200 / AVG_SAMPLES); + g2200 = 10.0f * log10f(g2200 / AVG_SAMPLES); + + auto result = g1200 - g2200; + + INFO("Twist = %d / 100 (%d - %d)", int(result*100), int(g1200), int(g2200)); + + DEBUG("exit readTwist"); + return result; } /* diff --git a/TNC/AudioInput.hpp b/TNC/AudioInput.hpp index de82567..d901180 100644 --- a/TNC/AudioInput.hpp +++ b/TNC/AudioInput.hpp @@ -65,7 +65,7 @@ void TNC_Error_Handler(int dev, int err); namespace mobilinkd { namespace tnc { namespace audio { -const uint32_t SAMPLE_RATE = 26400; +constexpr const uint32_t SAMPLE_RATE = 26400; enum AdcState { STOPPED, // STOP MODE, wait for comparator @@ -89,33 +89,35 @@ const size_t DMA_TRANSFER_SIZE = ADC_BUFFER_SIZE / 2; extern uint32_t adc_buffer[]; // Two int16_t samples per element. inline void stopADC() { - HAL_ADC_Stop_DMA(&hadc1); - HAL_TIM_Base_Stop(&htim6); + if (HAL_ADC_Stop_DMA(&hadc1) != HAL_OK) + Error_Handler(); + if (HAL_TIM_Base_Stop(&htim6) != HAL_OK) + Error_Handler(); } inline void startADC(uint32_t channel) { ADC_ChannelConfTypeDef sConfig; sConfig.Channel = channel; - sConfig.Rank = 1; + sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SingleDiff = ADC_SINGLE_ENDED; sConfig.SamplingTime = ADC_SAMPLETIME_24CYCLES_5; sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.Offset = 0; - HAL_ADC_ConfigChannel(&hadc1, &sConfig); + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) + Error_Handler(); - HAL_StatusTypeDef adcStatus = HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED); - if (adcStatus != HAL_OK) { - Error_Handler(); - } - - HAL_TIM_Base_Start(&htim6); - HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE * 2); + if (HAL_TIM_Base_Start(&htim6) != HAL_OK) + Error_Handler(); + if (HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE * 2) != HAL_OK) + Error_Handler(); } inline void restartADC() { - HAL_TIM_Base_Start(&htim6); - HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE * 2); + if (HAL_TIM_Base_Start(&htim6) != HAL_OK) + Error_Handler(); + if (HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE * 2) != HAL_OK) + Error_Handler(); } /// Vpp, Vavg, Vmin, Vmax diff --git a/TNC/AudioLevel.cpp b/TNC/AudioLevel.cpp index edc77f7..89d38b3 100644 --- a/TNC/AudioLevel.cpp +++ b/TNC/AudioLevel.cpp @@ -24,25 +24,25 @@ extern DAC_HandleTypeDef hdac1; namespace mobilinkd { namespace tnc { namespace audio { uint16_t virtual_ground; +float i_vgnd; void setAudioPins(void) { GPIO_InitTypeDef GPIO_InitStruct; - GPIO_InitStruct.Pin = GPIO_PIN_3; + GPIO_InitStruct.Pin = AUDIO_IN_Pin; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL; GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + HAL_GPIO_Init(AUDIO_IN_GPIO_Port, &GPIO_InitStruct); } void set_input_gain(int level) { uint32_t dc_offset{}; - if (HAL_OPAMP_DeInit(&hopamp1) != HAL_OK) - { + if (HAL_OPAMP_Stop(&hopamp1) != HAL_OK) + Error_Handler(); + if (HAL_OPAMP_DeInit(&hopamp1) != HAL_OK) Error_Handler(); - } - switch (level) { case 0: // 0dB @@ -73,49 +73,57 @@ void set_input_gain(int level) Error_Handler(); } - HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, dc_offset); + if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, dc_offset) != HAL_OK) + Error_Handler(); if (HAL_OPAMP_Init(&hopamp1) != HAL_OK) - { Error_Handler(); - } - HAL_OPAMP_Start(&hopamp1); - osDelay(100); + + if (HAL_OPAMP_Start(&hopamp1)!= HAL_OK) + Error_Handler(); + +// setAudioPins(); + osDelay(300); } int adjust_input_gain() __attribute__((noinline)); int adjust_input_gain() { - INFO("Adjusting input gain..."); + INFO("\nAdjusting input gain...\n"); int gain{0}; - while (true) { - set_input_gain(gain); + set_input_gain(gain); + auto [vpp, vavg, vmin, vmax] = readLevels(AUDIO_IN); + INFO("\nVpp = %" PRIu16 ", Vavg = %" PRIu16 "\n", vpp, vavg); + INFO("\nVmin = %" PRIu16 ", Vmax = %" PRIu16 ", setting = %d\n", vmin, vmax, gain); - auto [vpp, vavg, vmin, vmax] = readLevels(AUDIO_IN); + while (gain == 0 and (vmax == vref or vmin == 0)) + { + gpio::LED_OTHER::toggle(); + std::tie(vpp, vavg, vmin, vmax) = readLevels(AUDIO_IN); - INFO("Vpp = %" PRIu16 ", Vavg = %" PRIu16, vpp, vavg); - INFO("Vmin = %" PRIu16 ", Vmax = %" PRIu16 ", setting = %d", vmin, vmax, gain); - - while (gain == 0 and (vmax > 4090 or vmin < 5)) { - - gpio::LED_OTHER::toggle(); - std::tie(vpp, vavg, vmin, vmax) = readLevels(AUDIO_IN); - - INFO("Vpp = %" PRIu16 ", Vavg = %" PRIu16 ", Vmin = %" PRIu16 - ", Vmax = %" PRIu16 ", setting = %d", vpp, vavg, vmin, vmax, gain); - - } - gpio::LED_OTHER::off(); - - virtual_ground = vavg; - - if (vpp > 2048) break; - if (gain == 4) break; - ++gain; + INFO("\nVpp = %" PRIu16 ", Vavg = %" PRIu16 "\n", vpp, vavg); + INFO("\nVmin = %" PRIu16 ", Vmax = %" PRIu16 ", setting = %d\n", vmin, vmax, gain); } + + auto desired_gain = vref / vpp; + + if (desired_gain >= 16) gain = 4; + else if (desired_gain >= 8) gain = 3; + else if (desired_gain >= 4) gain = 2; + else if (desired_gain >= 2) gain = 1; + else gain = 0; + + set_input_gain(gain); + std::tie(vpp, vavg, vmin, vmax) = readLevels(AUDIO_IN); + INFO("\nVpp = %" PRIu16 ", Vavg = %" PRIu16 "\n", vpp, vavg); + INFO("\nVmin = %" PRIu16 ", Vmax = %" PRIu16 ", setting = %d\n", vmin, vmax, gain); + + virtual_ground = vavg; + i_vgnd = 1.0 / virtual_ground; + gpio::LED_OTHER::on(); return gain; @@ -152,6 +160,11 @@ void setAudioInputLevels() // setAudioPins(); INFO("Setting input gain: %d", kiss::settings().input_gain); set_input_gain(kiss::settings().input_gain); + auto [vpp, vavg, vmin, vmax] = readLevels(AUDIO_IN); + INFO("Vpp = %" PRIu16 ", Vavg = %" PRIu16, vpp, vavg); + INFO("Vmin = %" PRIu16 ", Vmax = %" PRIu16 ", setting = %d", vmin, vmax, 2); + virtual_ground = vavg; + i_vgnd = 1.0 / virtual_ground; } std::array log_volume; diff --git a/TNC/AudioLevel.hpp b/TNC/AudioLevel.hpp index abedaef..1b0aeaa 100644 --- a/TNC/AudioLevel.hpp +++ b/TNC/AudioLevel.hpp @@ -6,6 +6,7 @@ #include "arm_math.h" #include "cmsis_os.h" +#include "stm32l4xx_hal.h" #ifdef __cplusplus extern "C" { @@ -17,7 +18,7 @@ extern osMessageQId audioInputQueueHandle; } #endif -#define AUDIO_IN ADC_CHANNEL_8 +constexpr const uint32_t AUDIO_IN = ADC_CHANNEL_8; namespace mobilinkd { namespace tnc { namespace audio { @@ -27,7 +28,9 @@ void setAudioInputLevels(); void setAudioOutputLevel(); extern bool streamInputDCOffset; +constexpr const uint16_t vref = 16383; // Must match ADC output (adjust when oversampling) extern uint16_t virtual_ground; +extern float i_vgnd; }}} // mobilinkd::tnc::audio diff --git a/TNC/FirFilter.hpp b/TNC/FirFilter.hpp index 95cf105..f868503 100644 --- a/TNC/FirFilter.hpp +++ b/TNC/FirFilter.hpp @@ -74,7 +74,7 @@ struct FirFilter { float* operator()(int16_t* input) // __attribute__((section(".bss2"))) { for (size_t i = 0; i != BLOCK_SIZE; i++) { - filter_input[i] = (float(input[i]) - vgnd_) * 0.00048828125f; + filter_input[i] = (float(input[i]) - vgnd_) * audio::i_vgnd; } arm_fir_f32(&instance, filter_input, filter_output, BLOCK_SIZE); return filter_output; diff --git a/TNC/GPIO.hpp b/TNC/GPIO.hpp index 5dbd8eb..c6cf16e 100644 --- a/TNC/GPIO.hpp +++ b/TNC/GPIO.hpp @@ -42,6 +42,7 @@ typedef GPIO<(uint32_t)GPIOA_BASE,LED_RED_Pin> LED_TX; typedef GPIO<(uint32_t)GPIOA_BASE,LED_GREEN_Pin> LED_DCD; typedef GPIO<(uint32_t)GPIOA_BASE,LED_YELLOW_Pin> LED_OTHER; typedef GPIO<(uint32_t)GPIOB_BASE,AUDIO_OUT_ATTEN_Pin> AUDIO_OUT_ATTEN; +typedef GPIO<(uint32_t)GPIOB_BASE,LD3_Pin> LD3; }}} // mobilinkd::tnc::gpio diff --git a/TNC/Goertzel.h b/TNC/Goertzel.h index 40dea7a..5e3b63f 100644 --- a/TNC/Goertzel.h +++ b/TNC/Goertzel.h @@ -4,6 +4,8 @@ #ifndef MOBILINKD__TNC__GOERTZEL_FILTER_HPP_ #define MOBILINKD__TNC__GOERTZEL_FILTER_HPP_ +#include "AudioLevel.hpp" + #include #include @@ -17,17 +19,17 @@ class GoertzelFilter float filterFreq_; int bin_; float coeff_; - float d1{0.0f}; - float d2{0.0f}; - uint32_t count{0}; - const float* window_; + float d1{0.0f}; + float d2{0.0f}; + uint32_t count{0}; + const float* window_; public: GoertzelFilter(float filter_freq, const float* window = WINDOW) : filterFreq_(filter_freq) , bin_(0.5f + ((filter_freq * SAMPLES) / SAMPLE_RATE)) , coeff_(2.0f * cos((2.0f * M_PI * bin_) / float(SAMPLES))) - , window_(window) + , window_(window) {} void operator()(float* samples, uint32_t n) { @@ -45,7 +47,7 @@ public: for (uint32_t i = 0; i != n; ++i) { float w = window_ ? window_[count] : 1.0; - float sample = (float(samples[i]) - 2048.0f) / 2048.0f; + float sample = (float(samples[i]) - audio::virtual_ground) * audio::i_vgnd; float y = w * sample + coeff_ * d1 - d2; d2 = d1; d1 = y;