Move some pins around, use LED3, and name the AUDIO_IN pin. Initialize DAC, Op Amp and ADC in main(). Increase ADC clock to 80MHz and enable 16x oversampling. Increase sample time to 6.5 cycles. Support up to 16-bit ADC values (oversampling). Widen the DFT bins used for twist detection. Increase the amount of error checking we do. Improve input gain setting algorithm.

m17
Rob Riggs 2018-08-05 19:21:52 -05:00
rodzic 660ebffb73
commit 5b2b150b0d
12 zmienionych plików z 268 dodań i 192 usunięć

Wyświetl plik

@ -61,12 +61,12 @@
#define VCP_TX_Pin GPIO_PIN_2 #define VCP_TX_Pin GPIO_PIN_2
#define VCP_TX_GPIO_Port GPIOA #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_Pin GPIO_PIN_4
#define AUDIO_OUT_DAC_GPIO_Port GPIOA #define AUDIO_OUT_DAC_GPIO_Port GPIOA
#define AUDIO_IN_VREF_Pin GPIO_PIN_5 #define AUDIO_IN_VREF_Pin GPIO_PIN_5
#define AUDIO_IN_VREF_GPIO_Port GPIOA #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_Pin GPIO_PIN_1
#define BUTTON_AUDIO_IN_ADJUST_GPIO_Port GPIOB #define BUTTON_AUDIO_IN_ADJUST_GPIO_Port GPIOB
#define BUTTON_AUDIO_IN_ADJUST_EXTI_IRQn EXTI1_IRQn #define BUTTON_AUDIO_IN_ADJUST_EXTI_IRQn EXTI1_IRQn
@ -88,6 +88,8 @@
#define VCP_RX_GPIO_Port GPIOA #define VCP_RX_GPIO_Port GPIOA
#define LD3_Pin GPIO_PIN_3 #define LD3_Pin GPIO_PIN_3
#define LD3_GPIO_Port GPIOB #define LD3_GPIO_Port GPIOB
#define AUDIO_OUT_ATTEN_Pin GPIO_PIN_5
#define AUDIO_OUT_ATTEN_GPIO_Port GPIOB
/* ########################## Assert Selection ############################## */ /* ########################## Assert Selection ############################## */
/** /**

Wyświetl plik

@ -13,17 +13,21 @@ ADC1.EnableInjectedConversion=DISABLE
ADC1.EnableRegularConversion=ENABLE ADC1.EnableRegularConversion=ENABLE
ADC1.ExternalTrigConv=ADC_EXTERNALTRIG_T6_TRGO ADC1.ExternalTrigConv=ADC_EXTERNALTRIG_T6_TRGO
ADC1.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_RISING 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.LowPowerAutoWait=DISABLE
ADC1.NbrOfConversion=1 ADC1.NbrOfConversion=1
ADC1.NbrOfConversionFlag=1 ADC1.NbrOfConversionFlag=1
ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE
ADC1.Overrun=ADC_OVR_DATA_OVERWRITTEN ADC1.Overrun=ADC_OVR_DATA_OVERWRITTEN
ADC1.OversamplingMode=DISABLE ADC1.OversamplingMode=ENABLE
ADC1.OversamplingStopReset=ADC_REGOVERSAMPLING_CONTINUED_MODE
ADC1.Rank-0\#ChannelRegularConversion=1 ADC1.Rank-0\#ChannelRegularConversion=1
ADC1.Ratio=ADC_OVERSAMPLING_RATIO_16
ADC1.Resolution=ADC_RESOLUTION_12B 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.ScanConvMode=ADC_SCAN_DISABLE
ADC1.TriggeredMode=ADC_TRIGGEREDMODE_SINGLE_TRIGGER
ADC1.master=1 ADC1.master=1
CRC.CRCLength=CRC_POLYLENGTH_16B CRC.CRCLength=CRC_POLYLENGTH_16B
CRC.DefaultInitValueUse=DEFAULT_INIT_VALUE_DISABLE 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_Channel-DAC_OUT2=DAC_CHANNEL_2
DAC1.DAC_Trigger-DAC_OUT1=DAC_TRIGGER_T7_TRGO DAC1.DAC_Trigger-DAC_OUT1=DAC_TRIGGER_T7_TRGO
DAC1.IPParameters=DAC_Channel-DAC_OUT2,DAC_Trigger-DAC_OUT1 DAC1.IPParameters=DAC_Channel-DAC_OUT2,DAC_Trigger-DAC_OUT1
Dma.ADC1.0.Direction=DMA_PERIPH_TO_MEMORY Dma.ADC1.5.Direction=DMA_PERIPH_TO_MEMORY
Dma.ADC1.0.Instance=DMA1_Channel1 Dma.ADC1.5.Instance=DMA1_Channel1
Dma.ADC1.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD Dma.ADC1.5.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.ADC1.0.MemInc=DMA_MINC_ENABLE Dma.ADC1.5.MemInc=DMA_MINC_ENABLE
Dma.ADC1.0.Mode=DMA_CIRCULAR Dma.ADC1.5.Mode=DMA_CIRCULAR
Dma.ADC1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD Dma.ADC1.5.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.ADC1.0.PeriphInc=DMA_PINC_DISABLE Dma.ADC1.5.PeriphInc=DMA_PINC_DISABLE
Dma.ADC1.0.Priority=DMA_PRIORITY_LOW Dma.ADC1.5.Priority=DMA_PRIORITY_LOW
Dma.ADC1.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority Dma.ADC1.5.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.DAC_CH1.3.Direction=DMA_MEMORY_TO_PERIPH Dma.DAC_CH1.2.Direction=DMA_MEMORY_TO_PERIPH
Dma.DAC_CH1.3.Instance=DMA2_Channel4 Dma.DAC_CH1.2.Instance=DMA2_Channel4
Dma.DAC_CH1.3.MemDataAlignment=DMA_MDATAALIGN_HALFWORD Dma.DAC_CH1.2.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.DAC_CH1.3.MemInc=DMA_MINC_ENABLE Dma.DAC_CH1.2.MemInc=DMA_MINC_ENABLE
Dma.DAC_CH1.3.Mode=DMA_CIRCULAR Dma.DAC_CH1.2.Mode=DMA_CIRCULAR
Dma.DAC_CH1.3.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD Dma.DAC_CH1.2.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.DAC_CH1.3.PeriphInc=DMA_PINC_DISABLE Dma.DAC_CH1.2.PeriphInc=DMA_PINC_DISABLE
Dma.DAC_CH1.3.Priority=DMA_PRIORITY_LOW Dma.DAC_CH1.2.Priority=DMA_PRIORITY_LOW
Dma.DAC_CH1.3.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority Dma.DAC_CH1.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.I2C3_RX.4.Direction=DMA_PERIPH_TO_MEMORY Dma.I2C3_RX.3.Direction=DMA_PERIPH_TO_MEMORY
Dma.I2C3_RX.4.Instance=DMA1_Channel3 Dma.I2C3_RX.3.Instance=DMA1_Channel3
Dma.I2C3_RX.4.MemDataAlignment=DMA_MDATAALIGN_BYTE Dma.I2C3_RX.3.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.I2C3_RX.4.MemInc=DMA_MINC_ENABLE Dma.I2C3_RX.3.MemInc=DMA_MINC_ENABLE
Dma.I2C3_RX.4.Mode=DMA_NORMAL Dma.I2C3_RX.3.Mode=DMA_NORMAL
Dma.I2C3_RX.4.PeriphDataAlignment=DMA_PDATAALIGN_BYTE Dma.I2C3_RX.3.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.I2C3_RX.4.PeriphInc=DMA_PINC_DISABLE Dma.I2C3_RX.3.PeriphInc=DMA_PINC_DISABLE
Dma.I2C3_RX.4.Priority=DMA_PRIORITY_LOW Dma.I2C3_RX.3.Priority=DMA_PRIORITY_LOW
Dma.I2C3_RX.4.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority Dma.I2C3_RX.3.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.I2C3_TX.5.Direction=DMA_MEMORY_TO_PERIPH Dma.I2C3_TX.4.Direction=DMA_MEMORY_TO_PERIPH
Dma.I2C3_TX.5.Instance=DMA1_Channel2 Dma.I2C3_TX.4.Instance=DMA1_Channel2
Dma.I2C3_TX.5.MemDataAlignment=DMA_MDATAALIGN_BYTE Dma.I2C3_TX.4.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.I2C3_TX.5.MemInc=DMA_MINC_ENABLE Dma.I2C3_TX.4.MemInc=DMA_MINC_ENABLE
Dma.I2C3_TX.5.Mode=DMA_NORMAL Dma.I2C3_TX.4.Mode=DMA_NORMAL
Dma.I2C3_TX.5.PeriphDataAlignment=DMA_PDATAALIGN_BYTE Dma.I2C3_TX.4.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.I2C3_TX.5.PeriphInc=DMA_PINC_DISABLE Dma.I2C3_TX.4.PeriphInc=DMA_PINC_DISABLE
Dma.I2C3_TX.5.Priority=DMA_PRIORITY_LOW Dma.I2C3_TX.4.Priority=DMA_PRIORITY_LOW
Dma.I2C3_TX.5.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority Dma.I2C3_TX.4.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.Request0=ADC1 Dma.Request0=USART2_RX
Dma.Request1=USART2_RX Dma.Request1=USART2_TX
Dma.Request2=USART2_TX Dma.Request2=DAC_CH1
Dma.Request3=DAC_CH1 Dma.Request3=I2C3_RX
Dma.Request4=I2C3_RX Dma.Request4=I2C3_TX
Dma.Request5=I2C3_TX Dma.Request5=ADC1
Dma.RequestsNb=6 Dma.RequestsNb=6
Dma.USART2_RX.1.Direction=DMA_PERIPH_TO_MEMORY Dma.USART2_RX.0.Direction=DMA_PERIPH_TO_MEMORY
Dma.USART2_RX.1.Instance=DMA1_Channel6 Dma.USART2_RX.0.Instance=DMA1_Channel6
Dma.USART2_RX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE Dma.USART2_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART2_RX.1.MemInc=DMA_MINC_ENABLE Dma.USART2_RX.0.MemInc=DMA_MINC_ENABLE
Dma.USART2_RX.1.Mode=DMA_NORMAL Dma.USART2_RX.0.Mode=DMA_NORMAL
Dma.USART2_RX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE Dma.USART2_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART2_RX.1.PeriphInc=DMA_PINC_DISABLE Dma.USART2_RX.0.PeriphInc=DMA_PINC_DISABLE
Dma.USART2_RX.1.Priority=DMA_PRIORITY_LOW Dma.USART2_RX.0.Priority=DMA_PRIORITY_LOW
Dma.USART2_RX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority Dma.USART2_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.USART2_TX.2.Direction=DMA_MEMORY_TO_PERIPH Dma.USART2_TX.1.Direction=DMA_MEMORY_TO_PERIPH
Dma.USART2_TX.2.Instance=DMA1_Channel7 Dma.USART2_TX.1.Instance=DMA1_Channel7
Dma.USART2_TX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE Dma.USART2_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART2_TX.2.MemInc=DMA_MINC_ENABLE Dma.USART2_TX.1.MemInc=DMA_MINC_ENABLE
Dma.USART2_TX.2.Mode=DMA_NORMAL Dma.USART2_TX.1.Mode=DMA_NORMAL
Dma.USART2_TX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE Dma.USART2_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART2_TX.2.PeriphInc=DMA_PINC_DISABLE Dma.USART2_TX.1.PeriphInc=DMA_PINC_DISABLE
Dma.USART2_TX.2.Priority=DMA_PRIORITY_LOW Dma.USART2_TX.1.Priority=DMA_PRIORITY_LOW
Dma.USART2_TX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority Dma.USART2_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
FREERTOS.FootprintOK=true FREERTOS.FootprintOK=true
FREERTOS.HEAP_NUMBER=4 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.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.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.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.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.configTOTAL_HEAP_SIZE=4096
FREERTOS.configUSE_TICKLESS_IDLE=0 FREERTOS.configUSE_TICKLESS_IDLE=1
FREERTOS.configUSE_TIMERS=1 FREERTOS.configUSE_TIMERS=1
File.Version=6 File.Version=6
I2C3.I2C_Speed_Mode=I2C_Fast_Plus I2C3.I2C_Speed_Mode=I2C_Fast_Plus
@ -131,18 +136,18 @@ Mcu.Name=STM32L432K(B-C)Ux
Mcu.Package=UFQFPN32 Mcu.Package=UFQFPN32
Mcu.Pin0=PC14-OSC32_IN (PC14) Mcu.Pin0=PC14-OSC32_IN (PC14)
Mcu.Pin1=PC15-OSC32_OUT (PC15) Mcu.Pin1=PC15-OSC32_OUT (PC15)
Mcu.Pin10=PB1 Mcu.Pin10=PA8
Mcu.Pin11=PA8 Mcu.Pin11=PA9
Mcu.Pin12=PA9 Mcu.Pin12=PA10
Mcu.Pin13=PA10 Mcu.Pin13=PA11
Mcu.Pin14=PA11 Mcu.Pin14=PA12
Mcu.Pin15=PA12 Mcu.Pin15=PA13 (JTMS-SWDIO)
Mcu.Pin16=PA13 (JTMS-SWDIO) Mcu.Pin16=PA14 (JTCK-SWCLK)
Mcu.Pin17=PA14 (JTCK-SWCLK) Mcu.Pin17=PA15 (JTDI)
Mcu.Pin18=PA15 (JTDI) Mcu.Pin18=PB3 (JTDO-TRACESWO)
Mcu.Pin19=PB3 (JTDO-TRACESWO) Mcu.Pin19=PB4 (NJTRST)
Mcu.Pin2=PA0 Mcu.Pin2=PA0
Mcu.Pin20=PB4 (NJTRST) Mcu.Pin20=PB5
Mcu.Pin21=PB6 Mcu.Pin21=PB6
Mcu.Pin22=PB7 Mcu.Pin22=PB7
Mcu.Pin23=VP_ADC1_OPAMP1_OUT Mcu.Pin23=VP_ADC1_OPAMP1_OUT
@ -159,13 +164,13 @@ Mcu.Pin5=PA3
Mcu.Pin6=PA4 Mcu.Pin6=PA4
Mcu.Pin7=PA5 Mcu.Pin7=PA5
Mcu.Pin8=PA7 Mcu.Pin8=PA7
Mcu.Pin9=PB0 Mcu.Pin9=PB1
Mcu.PinsNb=31 Mcu.PinsNb=31
Mcu.ThirdPartyNb=0 Mcu.ThirdPartyNb=0
Mcu.UserConstants= Mcu.UserConstants=
Mcu.UserName=STM32L432KCUx Mcu.UserName=STM32L432KCUx
MxCube.Version=4.26.0 MxCube.Version=4.26.1
MxDb.Version=DB.4.0.260 MxDb.Version=DB.4.0.261
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:false\:false\:false 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_Channel1_IRQn=true\:5\:0\:false\:false\:true\:true\:false
NVIC.DMA1_Channel2_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.Locked=true
PA2.Mode=Asynchronous PA2.Mode=Asynchronous
PA2.Signal=USART2_TX PA2.Signal=USART2_TX
PA3.GPIOParameters=GPIO_Label
PA3.GPIO_Label=AUDIO_IN
PA3.Locked=true PA3.Locked=true
PA3.Mode=PGA Connected PA3.Signal=SharedAnalog_PA3
PA3.Signal=OPAMP1_VOUT
PA4.GPIOParameters=GPIO_Label PA4.GPIOParameters=GPIO_Label
PA4.GPIO_Label=AUDIO_OUT_DAC PA4.GPIO_Label=AUDIO_OUT_DAC
PA4.Locked=true PA4.Locked=true
@ -242,6 +248,7 @@ PA5.Locked=true
PA5.Signal=COMP_DAC12_group PA5.Signal=COMP_DAC12_group
PA7.GPIOParameters=GPIO_PuPdOD PA7.GPIOParameters=GPIO_PuPdOD
PA7.GPIO_PuPdOD=GPIO_NOPULL PA7.GPIO_PuPdOD=GPIO_NOPULL
PA7.Locked=true
PA7.Mode=I2C PA7.Mode=I2C
PA7.Signal=I2C3_SCL PA7.Signal=I2C3_SCL
PA8.GPIOParameters=PinState,GPIO_Label,GPIO_ModeDefaultOutputPP PA8.GPIOParameters=PinState,GPIO_Label,GPIO_ModeDefaultOutputPP
@ -256,11 +263,6 @@ PA9.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD
PA9.Locked=true PA9.Locked=true
PA9.PinState=GPIO_PIN_SET PA9.PinState=GPIO_PIN_SET
PA9.Signal=GPIO_Output 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.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI
PB1.GPIO_Label=BUTTON_AUDIO_IN_ADJUST PB1.GPIO_Label=BUTTON_AUDIO_IN_ADJUST
PB1.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING PB1.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING
@ -274,8 +276,15 @@ PB3\ (JTDO-TRACESWO).Signal=GPIO_Output
PB3\ (JTDO-TRACESWO).Stacked=true PB3\ (JTDO-TRACESWO).Stacked=true
PB4\ (NJTRST).GPIOParameters=GPIO_PuPdOD PB4\ (NJTRST).GPIOParameters=GPIO_PuPdOD
PB4\ (NJTRST).GPIO_PuPdOD=GPIO_NOPULL PB4\ (NJTRST).GPIO_PuPdOD=GPIO_NOPULL
PB4\ (NJTRST).Locked=true
PB4\ (NJTRST).Mode=I2C PB4\ (NJTRST).Mode=I2C
PB4\ (NJTRST).Signal=I2C3_SDA 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.Locked=true
PB6.Signal=GPIO_Analog PB6.Signal=GPIO_Analog
PB7.Locked=true PB7.Locked=true
@ -322,7 +331,7 @@ ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=true 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 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.48CLKFreq_Value=24000000
RCC.ADCFreq_Value=48000000 RCC.ADCFreq_Value=80000000
RCC.AHBFreq_Value=48000000 RCC.AHBFreq_Value=48000000
RCC.APB1Freq_Value=48000000 RCC.APB1Freq_Value=48000000
RCC.APB1TimFreq_Value=48000000 RCC.APB1TimFreq_Value=48000000
@ -357,17 +366,17 @@ RCC.PLLN=24
RCC.PLLPoutputFreq_Value=13714285.714285715 RCC.PLLPoutputFreq_Value=13714285.714285715
RCC.PLLQoutputFreq_Value=48000000 RCC.PLLQoutputFreq_Value=48000000
RCC.PLLRCLKFreq_Value=48000000 RCC.PLLRCLKFreq_Value=48000000
RCC.PLLSAI1N=24 RCC.PLLSAI1N=40
RCC.PLLSAI1PoutputFreq_Value=13714285.714285715 RCC.PLLSAI1PoutputFreq_Value=22857142.85714286
RCC.PLLSAI1QoutputFreq_Value=48000000 RCC.PLLSAI1QoutputFreq_Value=80000000
RCC.PLLSAI1RoutputFreq_Value=48000000 RCC.PLLSAI1RoutputFreq_Value=80000000
RCC.PREFETCH_ENABLE=1 RCC.PREFETCH_ENABLE=1
RCC.PWRFreq_Value=48000000 RCC.PWRFreq_Value=48000000
RCC.RNGFreq_Value=48000000 RCC.RNGFreq_Value=80000000
RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE
RCC.RTCFreq_Value=32768 RCC.RTCFreq_Value=32768
RCC.RTCHSEDivFreq_Value=4000000 RCC.RTCHSEDivFreq_Value=4000000
RCC.SAI1Freq_Value=13714285.714285715 RCC.SAI1Freq_Value=22857142.85714286
RCC.SWPMI1Freq_Value=48000000 RCC.SWPMI1Freq_Value=48000000
RCC.SYSCLKFreq_VALUE=48000000 RCC.SYSCLKFreq_VALUE=48000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
@ -376,10 +385,10 @@ RCC.TimerFreq_Value=32000000
RCC.USART1Freq_Value=48000000 RCC.USART1Freq_Value=48000000
RCC.USART2Freq_Value=48000000 RCC.USART2Freq_Value=48000000
RCC.USART3Freq_Value=16000000 RCC.USART3Freq_Value=16000000
RCC.USBFreq_Value=48000000 RCC.USBFreq_Value=80000000
RCC.VCOInputFreq_Value=4000000 RCC.VCOInputFreq_Value=4000000
RCC.VCOOutputFreq_Value=96000000 RCC.VCOOutputFreq_Value=96000000
RCC.VCOSAI1OutputFreq_Value=96000000 RCC.VCOSAI1OutputFreq_Value=160000000
RCC.WatchDogFreq_Value=32000 RCC.WatchDogFreq_Value=32000
SH.COMP_DAC11_group.0=DAC1_OUT1,DAC_OUT1 SH.COMP_DAC11_group.0=DAC1_OUT1,DAC_OUT1
SH.COMP_DAC11_group.ConfNb=1 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.COMP_DAC12_group.ConfNb=1
SH.GPXTI1.0=GPIO_EXTI1 SH.GPXTI1.0=GPIO_EXTI1
SH.GPXTI1.ConfNb=1 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.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE
TIM6.IPParameters=Period,AutoReloadPreload,TIM_MasterOutputTrigger TIM6.IPParameters=Period,AutoReloadPreload,TIM_MasterOutputTrigger
TIM6.Period=1817 TIM6.Period=1817

Wyświetl plik

@ -284,9 +284,11 @@ int main(void)
/* USER CODE BEGIN RTOS_QUEUES */ /* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */ /* add queues, ... */
HAL_DAC_Start(&hdac1, DAC_CHANNEL_2); if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, 1024) != HAL_OK) Error_Handler();
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, 1024); if (HAL_DAC_Start(&hdac1, DAC_CHANNEL_2) != HAL_OK) Error_Handler();
HAL_OPAMP_Start(&hopamp1); 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 */ /* USER CODE END RTOS_QUEUES */
@ -367,7 +369,7 @@ void SystemClock_Config(void)
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_MSI; PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_MSI;
PeriphClkInit.PLLSAI1.PLLSAI1M = 1; PeriphClkInit.PLLSAI1.PLLSAI1M = 1;
PeriphClkInit.PLLSAI1.PLLSAI1N = 24; PeriphClkInit.PLLSAI1.PLLSAI1N = 40;
PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7; PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7;
PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2; PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2;
PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_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.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
hadc1.Init.DMAContinuousRequests = ENABLE; hadc1.Init.DMAContinuousRequests = ENABLE;
hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; 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) if (HAL_ADC_Init(&hadc1) != HAL_OK)
{ {
_Error_Handler(__FILE__, __LINE__); _Error_Handler(__FILE__, __LINE__);
@ -433,7 +439,7 @@ static void MX_ADC1_Init(void)
*/ */
sConfig.Channel = ADC_CHANNEL_8; sConfig.Channel = ADC_CHANNEL_8;
sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; sConfig.SamplingTime = ADC_SAMPLETIME_6CYCLES_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED; sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0; sConfig.Offset = 0;
@ -743,27 +749,29 @@ static void MX_GPIO_Init(void)
__HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOH_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 */ /*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, LED_RED_Pin|LED_GREEN_Pin|LED_YELLOW_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, LED_RED_Pin|LED_GREEN_Pin|LED_YELLOW_Pin, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */ /*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, PTT_M_Pin|PTT_S_Pin, GPIO_PIN_RESET); 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 */ /*Configure GPIO pin : PA6 */
GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : AUDIO_OUT_ATTEN_Pin */ /*Configure GPIO pins : PB0 PB6 PB7 */
GPIO_InitStruct.Pin = AUDIO_OUT_ATTEN_Pin; GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_Init(AUDIO_OUT_ATTEN_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : BUTTON_AUDIO_IN_ADJUST_Pin */ /*Configure GPIO pin : BUTTON_AUDIO_IN_ADJUST_Pin */
GPIO_InitStruct.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; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LD3_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init(LD3_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : PB5 PB6 PB7 */ /*Configure GPIO pin : AUDIO_OUT_ATTEN_Pin */
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Pin = AUDIO_OUT_ATTEN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL; 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 */ /*Configure GPIO pin : PH3 */
GPIO_InitStruct.Pin = GPIO_PIN_3; 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) void assert_failed(uint8_t* file, uint32_t line)
{ {
/* USER CODE BEGIN 6 */ /* USER CODE BEGIN 6 */
_Error_Handler(file, line);
/* User can add his own implementation to report the file name and line number, /* 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) */ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */ /* USER CODE END 6 */

Wyświetl plik

@ -103,6 +103,7 @@ void HAL_MspInit(void)
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{ {
GPIO_InitTypeDef GPIO_InitStruct;
if(hadc->Instance==ADC1) if(hadc->Instance==ADC1)
{ {
/* USER CODE BEGIN ADC1_MspInit 0 */ /* USER CODE BEGIN ADC1_MspInit 0 */
@ -111,6 +112,14 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
/* Peripheral clock enable */ /* Peripheral clock enable */
__HAL_RCC_ADC_CLK_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 DMA Init */
/* ADC1 Init */ /* ADC1 Init */
hdma_adc1.Instance = DMA1_Channel1; hdma_adc1.Instance = DMA1_Channel1;
@ -146,6 +155,11 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
/* USER CODE END ADC1_MspDeInit 0 */ /* USER CODE END ADC1_MspDeInit 0 */
/* Peripheral clock disable */ /* Peripheral clock disable */
__HAL_RCC_ADC_CLK_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 */ /* ADC1 DMA DeInit */
HAL_DMA_DeInit(hadc->DMA_Handle); HAL_DMA_DeInit(hadc->DMA_Handle);
@ -381,11 +395,16 @@ void HAL_OPAMP_MspInit(OPAMP_HandleTypeDef* hopamp)
PA1 ------> OPAMP1_VINM PA1 ------> OPAMP1_VINM
PA3 ------> OPAMP1_VOUT 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.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 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 BEGIN OPAMP1_MspInit 1 */
/* USER CODE END OPAMP1_MspInit 1 */ /* USER CODE END OPAMP1_MspInit 1 */
@ -409,7 +428,7 @@ void HAL_OPAMP_MspDeInit(OPAMP_HandleTypeDef* hopamp)
PA1 ------> OPAMP1_VINM PA1 ------> OPAMP1_VINM
PA3 ------> OPAMP1_VOUT 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 */ /* USER CODE BEGIN OPAMP1_MspDeInit 1 */

Wyświetl plik

@ -123,7 +123,6 @@ struct Demodulator {
, nrzi_(), hdlc_decoder_(false), locked_(false) , 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); hdlc::IoFrame* operator()(float* samples, size_t len);
bool locked() const {return locked_;} bool locked() const {return locked_;}

Wyświetl plik

@ -437,6 +437,7 @@ void demodulatorTask() {
bool dcd_status{false}; bool dcd_status{false};
while (true) { while (true) {
mobilinkd::tnc::gpio::LD3::off();
osEvent peek = osMessagePeek(audioInputQueueHandle, 0); osEvent peek = osMessagePeek(audioInputQueueHandle, 0);
if (peek.status == osEventMessage) break; if (peek.status == osEventMessage) break;
@ -445,6 +446,7 @@ void demodulatorTask() {
continue; continue;
} }
++counter; ++counter;
mobilinkd::tnc::gpio::LD3::on();
auto block = (adc_pool_type::chunk_type*) evt.value.p; auto block = (adc_pool_type::chunk_type*) evt.value.p;
auto samples = (int16_t*) block->buffer; auto samples = (int16_t*) block->buffer;
@ -536,8 +538,8 @@ void streamLevels(uint32_t channel, uint8_t cmd) {
uint16_t count = 0; uint16_t count = 0;
uint32_t accum = 0; uint32_t accum = 0;
uint16_t min = 4096; uint16_t min = std::numeric_limits<uint16_t>::max();
uint16_t max = 0; uint16_t max = std::numeric_limits<uint16_t>::min();
while (count < 2640) { while (count < 2640) {
osEvent evt = osMessageGet(adcInputQueueHandle, osWaitForever); 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; auto block = (adc_pool_type::chunk_type*) evt.value.p;
uint16_t* start = (uint16_t*) block->buffer; 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)); min = std::min(min, *std::min_element(start, end));
max = std::max(max, *std::max_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; uint16_t count = 0;
uint32_t accum = 0; uint32_t accum = 0;
uint16_t vmin = 4096; uint16_t vmin = std::numeric_limits<uint16_t>::max();
uint16_t vmax = 0; uint16_t vmax = std::numeric_limits<uint16_t>::min();
INFO("readLevels: start"); INFO("readLevels: start");
startADC(channel); startADC(channel);
@ -597,17 +599,19 @@ levels_type readLevels(uint32_t channel, uint32_t samples) {
osEvent evt = osMessageGet(adcInputQueueHandle, osWaitForever); osEvent evt = osMessageGet(adcInputQueueHandle, osWaitForever);
if (evt.status != osEventMessage) continue; if (evt.status != osEventMessage) continue;
count += ADC_BUFFER_SIZE; auto block = (adc_pool_type::chunk_type*) evt.value.p;
auto start = reinterpret_cast<uint16_t*>(block->buffer);
auto end = start + ADC_BUFFER_SIZE;
auto block = (adc_pool_type::chunk_type*) evt.value.v; // if (count == 0) for (auto it = start; it != end; ++it) DEBUG("%hu\n", *it);
uint16_t* start = (uint16_t*) block->buffer;
uint16_t* end = (uint16_t*) block->buffer + ADC_BUFFER_SIZE;
vmin = std::min(vmin, *std::min_element(start, end)); vmin = std::min(vmin, *std::min_element(start, end));
vmax = std::max(vmax, *std::max_element(start, end)); vmax = std::max(vmax, *std::max_element(start, end));
accum = std::accumulate(start, end, accum); accum = std::accumulate(start, end, accum);
adcPool.deallocate(block); adcPool.deallocate(block);
count += ADC_BUFFER_SIZE;
} }
stopADC(); stopADC();
@ -619,8 +623,10 @@ levels_type readLevels(uint32_t channel, uint32_t samples) {
return levels_type(pp, avg, vmin, vmax); 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 * Return twist as a the difference in dB between mark and space. The
@ -636,10 +642,10 @@ float readTwist()
float g1200 = 0.0f; float g1200 = 0.0f;
float g2200 = 0.0f; float g2200 = 0.0f;
GoertzelFilter<TWIST_SAMPLE_SIZE, SAMPLE_RATE> gf1200(1200.0); GoertzelFilter<TWIST_SAMPLE_SIZE, SAMPLE_RATE> gf1200(1200.0, 0);
GoertzelFilter<TWIST_SAMPLE_SIZE, SAMPLE_RATE> gf2200(2200.0); GoertzelFilter<TWIST_SAMPLE_SIZE, SAMPLE_RATE> gf2200(2200.0, 0);
const uint32_t AVG_SAMPLES = 100; const uint32_t AVG_SAMPLES = 20;
startADC(channel); startADC(channel);
@ -661,17 +667,24 @@ float readTwist()
adcPool.deallocate(block); adcPool.deallocate(block);
} }
g1200 += 10.0 * log10(gf1200); g1200 += (gf1200 / count);
g2200 += 10.0 * log10(gf2200); g2200 += (gf2200 / count);
gf1200.reset(); gf1200.reset();
gf2200.reset(); gf2200.reset();
} }
stopADC(); 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;
} }
/* /*

Wyświetl plik

@ -65,7 +65,7 @@ void TNC_Error_Handler(int dev, int err);
namespace mobilinkd { namespace tnc { namespace audio { namespace mobilinkd { namespace tnc { namespace audio {
const uint32_t SAMPLE_RATE = 26400; constexpr const uint32_t SAMPLE_RATE = 26400;
enum AdcState { enum AdcState {
STOPPED, // STOP MODE, wait for comparator 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. extern uint32_t adc_buffer[]; // Two int16_t samples per element.
inline void stopADC() { inline void stopADC() {
HAL_ADC_Stop_DMA(&hadc1); if (HAL_ADC_Stop_DMA(&hadc1) != HAL_OK)
HAL_TIM_Base_Stop(&htim6); Error_Handler();
if (HAL_TIM_Base_Stop(&htim6) != HAL_OK)
Error_Handler();
} }
inline void startADC(uint32_t channel) { inline void startADC(uint32_t channel) {
ADC_ChannelConfTypeDef sConfig; ADC_ChannelConfTypeDef sConfig;
sConfig.Channel = channel; sConfig.Channel = channel;
sConfig.Rank = 1; sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED; sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_24CYCLES_5; sConfig.SamplingTime = ADC_SAMPLETIME_24CYCLES_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0; 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 (HAL_TIM_Base_Start(&htim6) != HAL_OK)
if (adcStatus != HAL_OK) { Error_Handler();
Error_Handler(); if (HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE * 2) != HAL_OK)
} Error_Handler();
HAL_TIM_Base_Start(&htim6);
HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE * 2);
} }
inline void restartADC() { inline void restartADC() {
HAL_TIM_Base_Start(&htim6); if (HAL_TIM_Base_Start(&htim6) != HAL_OK)
HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE * 2); Error_Handler();
if (HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE * 2) != HAL_OK)
Error_Handler();
} }
/// Vpp, Vavg, Vmin, Vmax /// Vpp, Vavg, Vmin, Vmax

Wyświetl plik

@ -24,25 +24,25 @@ extern DAC_HandleTypeDef hdac1;
namespace mobilinkd { namespace tnc { namespace audio { namespace mobilinkd { namespace tnc { namespace audio {
uint16_t virtual_ground; uint16_t virtual_ground;
float i_vgnd;
void setAudioPins(void) { void setAudioPins(void) {
GPIO_InitTypeDef GPIO_InitStruct; 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.Mode = GPIO_MODE_ANALOG_ADC_CONTROL;
GPIO_InitStruct.Pull = GPIO_NOPULL; 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) void set_input_gain(int level)
{ {
uint32_t dc_offset{}; 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(); Error_Handler();
}
switch (level) { switch (level) {
case 0: // 0dB case 0: // 0dB
@ -73,49 +73,57 @@ void set_input_gain(int level)
Error_Handler(); 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) if (HAL_OPAMP_Init(&hopamp1) != HAL_OK)
{
Error_Handler(); Error_Handler();
}
HAL_OPAMP_Start(&hopamp1); if (HAL_OPAMP_Start(&hopamp1)!= HAL_OK)
osDelay(100); Error_Handler();
// setAudioPins();
osDelay(300);
} }
int adjust_input_gain() __attribute__((noinline)); int adjust_input_gain() __attribute__((noinline));
int adjust_input_gain() { int adjust_input_gain() {
INFO("Adjusting input gain..."); INFO("\nAdjusting input gain...\n");
int gain{0}; 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("\nVpp = %" PRIu16 ", Vavg = %" PRIu16 "\n", vpp, vavg);
INFO("Vmin = %" PRIu16 ", Vmax = %" PRIu16 ", setting = %d", vmin, vmax, gain); INFO("\nVmin = %" PRIu16 ", Vmax = %" PRIu16 ", setting = %d\n", 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;
} }
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(); gpio::LED_OTHER::on();
return gain; return gain;
@ -152,6 +160,11 @@ void setAudioInputLevels()
// setAudioPins(); // setAudioPins();
INFO("Setting input gain: %d", kiss::settings().input_gain); INFO("Setting input gain: %d", kiss::settings().input_gain);
set_input_gain(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<int16_t, 128> log_volume; std::array<int16_t, 128> log_volume;

Wyświetl plik

@ -6,6 +6,7 @@
#include "arm_math.h" #include "arm_math.h"
#include "cmsis_os.h" #include "cmsis_os.h"
#include "stm32l4xx_hal.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -17,7 +18,7 @@ extern osMessageQId audioInputQueueHandle;
} }
#endif #endif
#define AUDIO_IN ADC_CHANNEL_8 constexpr const uint32_t AUDIO_IN = ADC_CHANNEL_8;
namespace mobilinkd { namespace tnc { namespace audio { namespace mobilinkd { namespace tnc { namespace audio {
@ -27,7 +28,9 @@ void setAudioInputLevels();
void setAudioOutputLevel(); void setAudioOutputLevel();
extern bool streamInputDCOffset; extern bool streamInputDCOffset;
constexpr const uint16_t vref = 16383; // Must match ADC output (adjust when oversampling)
extern uint16_t virtual_ground; extern uint16_t virtual_ground;
extern float i_vgnd;
}}} // mobilinkd::tnc::audio }}} // mobilinkd::tnc::audio

Wyświetl plik

@ -74,7 +74,7 @@ struct FirFilter {
float* operator()(int16_t* input) // __attribute__((section(".bss2"))) float* operator()(int16_t* input) // __attribute__((section(".bss2")))
{ {
for (size_t i = 0; i != BLOCK_SIZE; i++) { 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); arm_fir_f32(&instance, filter_input, filter_output, BLOCK_SIZE);
return filter_output; return filter_output;

Wyświetl plik

@ -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_GREEN_Pin> LED_DCD;
typedef GPIO<(uint32_t)GPIOA_BASE,LED_YELLOW_Pin> LED_OTHER; 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,AUDIO_OUT_ATTEN_Pin> AUDIO_OUT_ATTEN;
typedef GPIO<(uint32_t)GPIOB_BASE,LD3_Pin> LD3;
}}} // mobilinkd::tnc::gpio }}} // mobilinkd::tnc::gpio

Wyświetl plik

@ -4,6 +4,8 @@
#ifndef MOBILINKD__TNC__GOERTZEL_FILTER_HPP_ #ifndef MOBILINKD__TNC__GOERTZEL_FILTER_HPP_
#define MOBILINKD__TNC__GOERTZEL_FILTER_HPP_ #define MOBILINKD__TNC__GOERTZEL_FILTER_HPP_
#include "AudioLevel.hpp"
#include <arm_math.h> #include <arm_math.h>
#include <complex> #include <complex>
@ -17,17 +19,17 @@ class GoertzelFilter
float filterFreq_; float filterFreq_;
int bin_; int bin_;
float coeff_; float coeff_;
float d1{0.0f}; float d1{0.0f};
float d2{0.0f}; float d2{0.0f};
uint32_t count{0}; uint32_t count{0};
const float* window_; const float* window_;
public: public:
GoertzelFilter(float filter_freq, const float* window = WINDOW) GoertzelFilter(float filter_freq, const float* window = WINDOW)
: filterFreq_(filter_freq) : filterFreq_(filter_freq)
, bin_(0.5f + ((filter_freq * SAMPLES) / SAMPLE_RATE)) , bin_(0.5f + ((filter_freq * SAMPLES) / SAMPLE_RATE))
, coeff_(2.0f * cos((2.0f * M_PI * bin_) / float(SAMPLES))) , coeff_(2.0f * cos((2.0f * M_PI * bin_) / float(SAMPLES)))
, window_(window) , window_(window)
{} {}
void operator()(float* samples, uint32_t n) { void operator()(float* samples, uint32_t n) {
@ -45,7 +47,7 @@ public:
for (uint32_t i = 0; i != n; ++i) { for (uint32_t i = 0; i != n; ++i) {
float w = window_ ? window_[count] : 1.0; 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; float y = w * sample + coeff_ * d1 - d2;
d2 = d1; d2 = d1;
d1 = y; d1 = y;