From 078b520278a2d0e0b04a848c6a4c0b624446bd69 Mon Sep 17 00:00:00 2001 From: cfif Date: Mon, 15 Dec 2025 16:18:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Src/AdcFlagchip.c | 50 ++++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/Src/AdcFlagchip.c b/Src/AdcFlagchip.c index 8d531f9..6fa126d 100644 --- a/Src/AdcFlagchip.c +++ b/Src/AdcFlagchip.c @@ -43,12 +43,10 @@ void ADC_Initial( env->num_aChannels = num_aChannels; env->txAccessQueue = osMessageQueueNew(1, 1, NULL); - env->s_tAdcInitCfg.eResolution = ADC_RESOLUTION_12_BIT, //!< 12 bit resolution env->s_tAdcInitCfg.eAlign = ADC_ALIGN_RIGHT, //!< Align right env->s_tAdcInitCfg.eTriggerMode = ADC_TRIGMODE_SW, //!< Software trigger env->s_tAdcInitCfg.bWaitEnable = false; //!< Disable wait conversion mode - env->s_tAdcInitCfg.bCalEnable = false; env->s_tAdcInitCfg.s32CalOffset = 0U; env->s_tAdcInitCfg.s32CalGain = 0U; @@ -57,7 +55,6 @@ void ADC_Initial( env->s_tAdcInitCfg.eClockDivider = ADC_CLOCK_DIV_1; //!< Adc clock divided by 1 env->s_tAdcInitCfg.eSequenceMode = ADC_SEQMODE_SINGLE; //!< Single sequence mode env->s_tAdcInitCfg.eOverrunMode = ADC_OVERRUN_MODE_PRESERVE; //!< When overrun occurred, the old conversion data are preserved - env->s_tAdcInitCfg.eVoltageRef = ADC_REF_INTERNAL; //!< Use internal reference env->s_tAdcInitCfg.bHwAvgEnable = false; //!< Disable averaging functionality env->s_tAdcInitCfg.eHwAverage = ADC_AVERAGE_4; //!< Selection for number of samples used for averaging @@ -66,6 +63,12 @@ void ADC_Initial( env->s_tAdcInitCfg.aSampleTimes[2] = 40U; env->s_tAdcInitCfg.aSampleTimes[3] = 80U; + ADC_Init(ADCx, &env->s_tAdcInitCfg); + ADC_InitChannel(ADCx, s_aChannels, num_aChannels); + + //начало-----------------------------------DMA-RX------------------------------------------------------------------- + //начало-----------------------------------DMA-RX------------------------------------------------------------------- + //начало-----------------------------------DMA-RX------------------------------------------------------------------- env->s_tAdcDmaCfg.bDmaEnable = true; env->s_tAdcDmaCfg.eSeqGroupIndex = ADC_SEQUENCE_GROUP_0; @@ -75,25 +78,24 @@ void ADC_Initial( env->s_tAdcDmaCfg.pResultBuffer = (void *) ((uint32_t) DMA_BUF); env->s_tAdcDmaCfg.pConvCompleteNotify = Bsp_ADC_HandleResult; - - ADC_Init(ADCx, &env->s_tAdcInitCfg); - - - ADC_InitChannel(ADCx, s_aChannels, num_aChannels); - - ADC_InitDmaChannel(ADCx, &env->s_tAdcDmaCfg); ADC_Enable(ADC_INSTANCE_0); - //NVIC_SetPriorityGrouping(NVIC_PRIORITY_GROUP_4); - - NVIC_EnableIRQ(IRQ_DMA); NVIC_SetPriority(DMA_Error_IRQn, IRQ_DMA_PRIORITY); NVIC_SetPriority(IRQ_DMA, IRQ_DMA_PRIORITY); + NVIC_EnableIRQ(IRQ_DMA); + + DMA_StartChannel(DMA_INSTANCE_0, ADC_DMA_CHANNEL); +// ADC_Start(ADC_INSTANCE_0); + + //конец-----------------------------------DMA-RX------------------------------------------------------------------- + //конец-----------------------------------DMA-RX------------------------------------------------------------------- + //конец-----------------------------------DMA-RX------------------------------------------------------------------- + } -static float *vAdcGet(tAdcFlagchip *env, uint32_t timeout) { +static uint32_t vAdcGet(tAdcFlagchip *env, uint32_t *buf, uint32_t timeout) { ADC_Start(env->ADCx); @@ -101,18 +103,30 @@ static float *vAdcGet(tAdcFlagchip *env, uint32_t timeout) { uint16_t sent = osMessageQueueGet(env->txAccessQueue, &res, 0, timeout); +// if (sent == osOK) { +// for (uint8_t i = 0; i < env->num_aChannels; ++i) { +// env->pVoltageBuffer[i] = (float) env->DMA_BUF[i] / ((1U << 12U) - 1U) * VREF; +// } +// } + + // return env->pVoltageBuffer; + *buf = (uint32_t) env->DMA_BUF; + if (sent == osOK) { - for (uint8_t i = 0; i < env->num_aChannels; ++i) { - env->pVoltageBuffer[i] = (float) env->DMA_BUF[i] / ((1U << 12U) - 1U) * VREF; - } + return env->num_aChannels; } - return env->pVoltageBuffer; + return 0; +} + +static void vAdcStart(tAdcFlagchip *env) { + ADC_Start(env->ADCx); } tAdcIO vAdcGetIo(tAdcFlagchip *env) { tAdcIO io = { .env = env, + .start = (AdcIOStartTransaction) vAdcStart, .get = (AdcIOTransaction) vAdcGet, }; return io;