kopia lustrzana https://github.com/mobilinkd/NucleoTNC
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.
rodzic
660ebffb73
commit
5b2b150b0d
|
@ -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 ############################## */
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
|
|
46
Src/main.c
46
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 */
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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_;}
|
||||
|
|
|
@ -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<uint16_t>::max();
|
||||
uint16_t max = std::numeric_limits<uint16_t>::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<uint16_t>::max();
|
||||
uint16_t vmax = std::numeric_limits<uint16_t>::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<uint16_t*>(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<TWIST_SAMPLE_SIZE, SAMPLE_RATE> gf1200(1200.0);
|
||||
GoertzelFilter<TWIST_SAMPLE_SIZE, SAMPLE_RATE> gf2200(2200.0);
|
||||
GoertzelFilter<TWIST_SAMPLE_SIZE, SAMPLE_RATE> gf1200(1200.0, 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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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<int16_t, 128> log_volume;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
#ifndef MOBILINKD__TNC__GOERTZEL_FILTER_HPP_
|
||||
#define MOBILINKD__TNC__GOERTZEL_FILTER_HPP_
|
||||
|
||||
#include "AudioLevel.hpp"
|
||||
|
||||
#include <arm_math.h>
|
||||
#include <complex>
|
||||
|
||||
|
@ -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;
|
||||
|
|
Ładowanie…
Reference in New Issue