commit 1b98f03828ad6de9af3dafca67db0d051ccdd8d7 Author: cfif Date: Fri Jul 18 15:05:48 2025 +0300 Общие изменения diff --git a/Inc/Adc_AC7840x.h b/Inc/Adc_AC7840x.h new file mode 100644 index 0000000..99fde1d --- /dev/null +++ b/Inc/Adc_AC7840x.h @@ -0,0 +1,59 @@ +// +// Created by cfif on 17.11.22. +// + +#ifndef ADC_ARTERY_H +#define ADC_ARTERY_H + +#include "AdcIO.h" +#include "cmsis_os2.h" +#include CMSIS_device_header +#include "gpio_drv.h" +#include "adc_drv.h" +#include "dma_drv.h" + +typedef struct { + + uint8_t ADC0_CHANNEL_NUM; + uint8_t ADC1_CHANNEL_NUM; + + adc_converter_config_t adc0Config; + adc_converter_config_t adc1Config; + + dma_state_t g_dma_state; + dma_chn_state_t g_dma_adc0_state; + dma_chn_state_t g_dma_adc1_state; + + uint16_t g_adc0_array[32]; + uint16_t g_adc1_array[32]; + +} tAdcGlobalAC7840x; + +typedef struct { + + int32_t offset; + double mux; + double div; + uint8_t index; + + uint16_t *g_adc_array; + +#ifdef ACCESS_ADC + osMutexId_t access; +#endif + +} tAdcAC7840x; + +tAdcAC7840x ADC_Initial( + tAdcAC7840x *env, + PORT_Type *port, + uint32_t pinMask, + adc_inputchannel_t channel, + int32_t offset, + double mux, + double div +); + +tAdcIO vAdcGetIo(tAdcAC7840x *env); + +#endif //ADC_ARTERY_H diff --git a/Src/Adc_AC7840x.c b/Src/Adc_AC7840x.c new file mode 100644 index 0000000..765d9b5 --- /dev/null +++ b/Src/Adc_AC7840x.c @@ -0,0 +1,235 @@ +// +// Created by cfif on 07.09.22. +// +#include +#include "Adc_AC7840x.h" + +#define ADC0_INDEX (0U) +#define ADC1_INDEX (1U) + +#define ADC0_DMA_CHANNEL (0U) +#define ADC1_DMA_CHANNEL (1U) + +tAdcGlobalAC7840x adcGlobalAC7840x; + +void DmaInit() { + dma_channel_config_t dma_adc0_config; + dma_channel_config_t dma_adc1_config; + + DMA_DRV_Init(&adcGlobalAC7840x.g_dma_state, NULL, NULL, 0); + + dma_adc0_config.channelPriority = DMA_CHN_PRIORITY_LOW; + dma_adc0_config.virtChnConfig = ADC0_DMA_CHANNEL; + dma_adc0_config.source = DMA_REQ_ADC0; + dma_adc0_config.callback = NULL; + dma_adc0_config.enableTrigger = false; + DMA_DRV_ChannelInit(&adcGlobalAC7840x.g_dma_adc0_state, &dma_adc0_config); + + dma_adc1_config.channelPriority = DMA_CHN_PRIORITY_LOW; + dma_adc1_config.virtChnConfig = ADC1_DMA_CHANNEL; + dma_adc1_config.source = DMA_REQ_ADC1; + dma_adc1_config.callback = NULL; + dma_adc1_config.enableTrigger = false; + DMA_DRV_ChannelInit(&adcGlobalAC7840x.g_dma_adc1_state, &dma_adc1_config); +} + + +void ADC0_DmaStart() { + DMA_DRV_ConfigTransfer(ADC0_DMA_CHANNEL, DMA_TRANSFER_PERIPH2MEM, (uint32_t) (ADC0->RDR), + (uint32_t) adcGlobalAC7840x.g_adc0_array, DMA_TRANSFER_SIZE_2B, + adcGlobalAC7840x.ADC0_CHANNEL_NUM * 2); + + DMA_DRV_SetSrcAddr(ADC0_DMA_CHANNEL, (uint32_t) (&(ADC0->RDR[0])), + (uint32_t) (&(ADC0->RDR[adcGlobalAC7840x.ADC0_CHANNEL_NUM]))); + + DMA_DRV_SetSrcOffset(ADC0_DMA_CHANNEL, 4); + + DMA_DRV_SetCircularMode(ADC0_DMA_CHANNEL, true); + DMA_DRV_StartChannel(ADC0_DMA_CHANNEL); + ADC_DRV_SoftwareStartRegularConvert(ADC0_INDEX); +} + +void ADC1_DmaStart() { + DMA_DRV_ConfigTransfer(ADC1_DMA_CHANNEL, DMA_TRANSFER_PERIPH2MEM, (uint32_t) (ADC1->RDR), + (uint32_t) adcGlobalAC7840x.g_adc1_array, DMA_TRANSFER_SIZE_2B, + adcGlobalAC7840x.ADC1_CHANNEL_NUM * 2); + + DMA_DRV_SetSrcAddr(ADC1_DMA_CHANNEL, (uint32_t) (&(ADC1->RDR[0])), + (uint32_t) (&(ADC1->RDR[adcGlobalAC7840x.ADC1_CHANNEL_NUM]))); + + DMA_DRV_SetSrcOffset(ADC1_DMA_CHANNEL, 4); + + DMA_DRV_SetCircularMode(ADC1_DMA_CHANNEL, true); + DMA_DRV_StartChannel(ADC1_DMA_CHANNEL); + ADC_DRV_SoftwareStartRegularConvert(ADC1_INDEX); +} + + +void ADC_ConfigChannel(const uint32_t instance, const adc_sequence_t seq, adc_inputchannel_t channel) { + // ADCCLK = FCLK/clockDivide = 60/6 = 10MHz + // = (SPT+ resolution12/10/8) ADCCLK + 5 FCLK = (5+12)/10+5/60 - 1.78us + // 12bit - 1Msps 10bit - 1.2Msps 8bit - 1.4Msps + + adc_chan_config_t adcChConfig; + + ADC_DRV_InitChanStruct(&adcChConfig); + adcChConfig.channel = channel; + adcChConfig.spt = ADC_SPT_CLK_5; + adcChConfig.interruptEn = false; + ADC_DRV_ConfigChan(instance, seq, &adcChConfig); + +} + +tAdcAC7840x ADC0_Add(PORT_Type *port, uint32_t pinMask, adc_sequence_t sequence, adc_inputchannel_t channel, + int32_t offset, double mux, double div) { + GPIO_DRV_SetMuxModeSel(port, pinMask, PORT_PIN_DISABLED); + + ++adcGlobalAC7840x.ADC0_CHANNEL_NUM; + + adcGlobalAC7840x.adc0Config.regularSequenceLength = adcGlobalAC7840x.ADC0_CHANNEL_NUM; + ADC_ConfigChannel(ADC0_INDEX, sequence, channel); + +#ifdef ACCESS_ADC + tAdcAC7840x adc = { + .offset = offset, + .div = div, + .mux = mux, + .index = adcGlobalAC7840x.ADC0_CHANNEL_NUM, + .g_adc_array = adcGlobalAC7840x.g_adc0_array, + .access = osMutexNew(NULL) + }; + +#else + + tAdcAC7840x adc = { + .offset = offset, + .div = div, + .mux = mux, + .index = adcGlobalAC7840x.ADC1_CHANNEL_NUM, + .g_adc_array = adcGlobalAC7840x.g_adc0_array, + }; + +#endif + + return adc; +} + + +tAdcAC7840x ADC1_Add(PORT_Type *port, uint32_t pinMask, adc_sequence_t sequence, adc_inputchannel_t channel, + int32_t offset, double mux, double div) { + GPIO_DRV_SetMuxModeSel(port, pinMask, PORT_PIN_DISABLED); + + ++adcGlobalAC7840x.ADC1_CHANNEL_NUM; + + adcGlobalAC7840x.adc0Config.regularSequenceLength = adcGlobalAC7840x.ADC1_CHANNEL_NUM; + ADC_ConfigChannel(ADC1_INDEX, sequence, channel); + +#ifdef ACCESS_ADC + + tAdcAC7840x adc = { + .offset = offset, + .div = div, + .mux = mux, + .index = adcGlobalAC7840x.ADC1_CHANNEL_NUM, + .g_adc_array = adcGlobalAC7840x.g_adc1_array, + .access = osMutexNew(NULL) + }; + +#else + + tAdcAC7840x adc = { + .ADCx = ADCx, + .ADC_Channel = ADC_Channel, + .offset = offset, + .div = div, + .mux = mux, + .index = adcGlobalAC7840x.ADC1_CHANNEL_NUM, + .g_adc_array = adcGlobalAC7840x.g_adc1_array, + }; + +#endif + + return adc; +} + +void ADC_StartInit(tAdcAC7840x *env) { + + adcGlobalAC7840x.ADC0_CHANNEL_NUM = 0; + ADC_DRV_Init(ADC0_INDEX); + ADC_DRV_InitConverterStruct(&adcGlobalAC7840x.adc0Config); + adcGlobalAC7840x.adc0Config.clockDivide = ADC_CLK_DIVIDE_6; + adcGlobalAC7840x.adc0Config.resolution = ADC_RESOLUTION_12BIT; + adcGlobalAC7840x.adc0Config.regularTrigger = ADC_TRIGGER_INTERNAL; + adcGlobalAC7840x.adc0Config.injectTrigger = ADC_TRIGGER_INTERNAL; + adcGlobalAC7840x.adc0Config.dmaEnable = true; + adcGlobalAC7840x.adc0Config.voltageRef = ADC_VOLTAGEREF_VREF; + adcGlobalAC7840x.adc0Config.scanModeEn = true; + adcGlobalAC7840x.adc0Config.continuousModeEn = true; + adcGlobalAC7840x.adc0Config.regularDiscontinuousModeEn = false; + adcGlobalAC7840x.adc0Config.injectDiscontinuousModeEn = false; + adcGlobalAC7840x.adc0Config.injectAutoModeEn = false; + adcGlobalAC7840x.adc0Config.intervalModeEn = false; + adcGlobalAC7840x.adc0Config.regularDiscontinuousNum = 0; + adcGlobalAC7840x.adc0Config.regularSequenceLength = adcGlobalAC7840x.ADC0_CHANNEL_NUM; + adcGlobalAC7840x.adc0Config.injectSequenceLength = 0; + adcGlobalAC7840x.adc0Config.powerEn = true; + + adcGlobalAC7840x.ADC1_CHANNEL_NUM = 0; + ADC_DRV_Init(ADC1_INDEX); + ADC_DRV_InitConverterStruct(&adcGlobalAC7840x.adc1Config); + adcGlobalAC7840x.adc1Config.clockDivide = ADC_CLK_DIVIDE_6; + adcGlobalAC7840x.adc1Config.resolution = ADC_RESOLUTION_12BIT; + adcGlobalAC7840x.adc1Config.regularTrigger = ADC_TRIGGER_INTERNAL; + adcGlobalAC7840x.adc1Config.injectTrigger = ADC_TRIGGER_INTERNAL; + adcGlobalAC7840x.adc1Config.dmaEnable = true; + adcGlobalAC7840x.adc1Config.voltageRef = ADC_VOLTAGEREF_VREF; + adcGlobalAC7840x.adc1Config.scanModeEn = true; + adcGlobalAC7840x.adc1Config.continuousModeEn = true; + adcGlobalAC7840x.adc1Config.regularDiscontinuousModeEn = false; + adcGlobalAC7840x.adc1Config.injectDiscontinuousModeEn = false; + adcGlobalAC7840x.adc1Config.injectAutoModeEn = false; + adcGlobalAC7840x.adc1Config.intervalModeEn = false; + adcGlobalAC7840x.adc1Config.regularDiscontinuousNum = 0; + adcGlobalAC7840x.adc1Config.regularSequenceLength = adcGlobalAC7840x.ADC1_CHANNEL_NUM; + adcGlobalAC7840x.adc1Config.injectSequenceLength = 0; + adcGlobalAC7840x.adc1Config.powerEn = true; +} + +void ADC_EndInit() { + ADC_DRV_ConfigConverter(ADC0_INDEX, &adcGlobalAC7840x.adc0Config); + ADC_DRV_ConfigConverter(ADC1_INDEX, &adcGlobalAC7840x.adc1Config); +} + +static uint32_t vAdcGet(tAdcAC7840x *env) { + +#ifdef ACCESS_ADC + + if (osMutexAcquire(env->access, 100) == osOK) { + + volatile uint16_t data = env->g_adc_array[env->index]; + + int32_t projected = (int32_t) ((double) (data + env->offset) * env->mux / env->div); + + osMutexRelease(env->access); + + return projected; + } else { + return 0; + } + +#else + + volatile uint16_t data = env->g_adc_array[env->index]; + + int32_t projected = ((data + env->offset) * env->mux / env->div); + return projected; +#endif +} + +tAdcIO vAdcGetIo(tAdcAC7840x *env) { + tAdcIO io = { + .env = env, + .get = (AdcIOTransaction) vAdcGet, + }; + return io; +} \ No newline at end of file diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..6983eac --- /dev/null +++ b/modular.json @@ -0,0 +1,17 @@ +{ + "dep": [ + { + "type": "git", + "provider": "Smart_Components", + "repo": "Adc" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file