TestSubmodule/LOCAL/Src/Adcs.c

140 lines
4.6 KiB
C

//
// Created by villuton on 25.08.2025.
//
#include <string.h>
#include "Adcs.h"
#include "at32f403a_407_gpio.h"
///Таблица значений ADC DMA
__IO uint16_t adc_ordinary_valuetab[ADCS_ADC_BUFF_SIZE] = {0};
__IO uint16_t dma_trans_complete_flag = 0;
/**
* @brief gpio configuration.
* @param none
* @retval none
*/
static void adc_gpio_config(void) {
gpio_init_type gpio_initstructure;
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_initstructure);
gpio_initstructure.gpio_mode = GPIO_MODE_ANALOG;
/// Инициализация пинов ADC GPIOA
gpio_initstructure.gpio_pins =
GPIO_PINS_0 | GPIO_PINS_1 | GPIO_PINS_2 | GPIO_PINS_3 |
GPIO_PINS_4 | GPIO_PINS_5 | GPIO_PINS_6 | GPIO_PINS_7;
gpio_init(GPIOA, &gpio_initstructure);
/// Инициализация пинов ADC GPIOB
gpio_initstructure.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1;
gpio_init(GPIOB, &gpio_initstructure);
}
/**
* @brief dma configuration.
* @param none
* @retval none
*/
static void adc_dma_config(void) {
dma_init_type dma_init_struct;
crm_periph_clock_enable(ADCS_ADC_CRM_DMAx_PERIPH_CLOCK, TRUE);
nvic_irq_enable(ADCS_ADC_DMAx_Channelx_IRQn, 0, 0);
dma_reset(ADCS_ADC_DMAx_CHANNELx);
dma_default_para_init(&dma_init_struct);
dma_init_struct.buffer_size = ADCS_ADC_BUFF_SIZE;
dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
dma_init_struct.memory_base_addr = (uint32_t) adc_ordinary_valuetab;
dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_HALFWORD;
dma_init_struct.memory_inc_enable = TRUE;
dma_init_struct.peripheral_base_addr = (uint32_t) &(ADCS_ADCx->odt);
dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_HALFWORD;
dma_init_struct.peripheral_inc_enable = FALSE;
dma_init_struct.priority = DMA_PRIORITY_HIGH;
dma_init_struct.loop_mode_enable = TRUE;
dma_init(ADCS_ADC_DMAx_CHANNELx, &dma_init_struct);
dma_interrupt_enable(ADCS_ADC_DMAx_CHANNELx, DMA_FDT_INT, TRUE);
dma_channel_enable(ADCS_ADC_DMAx_CHANNELx, TRUE);
}
/**
* @brief adc channel configuration.
* @param none
* @retval none
*/
static void adc_channel_config(void) {
for (int i = ADC_CHANNEL_0; i <= ADC_CHANNEL_9; i++) {
adc_ordinary_channel_set(ADCS_ADCx, i, i + 1, ADC_SAMPLETIME_239_5);
}
/**
adc_ordinary_channel_set(ADCS_ADCx, ADC_CHANNEL_0, 1, ADC_SAMPLETIME_239_5);
adc_ordinary_channel_set(ADCS_ADCx, ADC_CHANNEL_1, 2, ADC_SAMPLETIME_239_5);
adc_ordinary_channel_set(ADCS_ADCx, ADC_CHANNEL_2, 3, ADC_SAMPLETIME_239_5);
adc_ordinary_channel_set(ADCS_ADCx, ADC_CHANNEL_3, 4, ADC_SAMPLETIME_239_5);
adc_ordinary_channel_set(ADCS_ADCx, ADC_CHANNEL_4, 5, ADC_SAMPLETIME_239_5);
adc_ordinary_channel_set(ADCS_ADCx, ADC_CHANNEL_5, 6, ADC_SAMPLETIME_239_5);
adc_ordinary_channel_set(ADCS_ADCx, ADC_CHANNEL_6, 7, ADC_SAMPLETIME_239_5);
adc_ordinary_channel_set(ADCS_ADCx, ADC_CHANNEL_7, 8, ADC_SAMPLETIME_239_5);
adc_ordinary_channel_set(ADCS_ADCx, ADC_CHANNEL_8, 9, ADC_SAMPLETIME_239_5);
adc_ordinary_channel_set(ADCS_ADCx, ADC_CHANNEL_9, 10, ADC_SAMPLETIME_239_5);
*/
}
/**
* @brief adc configuration.
* @param none
* @retval none
*/
static void adc_config(void) {
adc_base_config_type adc_base_struct;
crm_periph_clock_enable(ADCS_CRM_ADCx_PERIPH_CLOCK, TRUE);
crm_adc_clock_div_set(CRM_ADC_DIV_6);
/* select combine mode */
adc_combine_mode_select(ADC_INDEPENDENT_MODE);
adc_base_default_para_init(&adc_base_struct);
adc_base_struct.sequence_mode = TRUE;
adc_base_struct.repeat_mode = TRUE;
adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
adc_base_struct.ordinary_channel_length = ADCS_ADC_BUFF_SIZE;
adc_base_config(ADCS_ADCx, &adc_base_struct);
adc_channel_config();
adc_ordinary_conversion_trigger_set(
ADCS_ADCx,
ADCS_ADCx_ORDINARY_TRIG_SOFTWARE,
TRUE);
adc_dma_mode_enable(ADCS_ADCx, TRUE);
adc_enable(ADCS_ADCx, TRUE);
adc_calibration_init(ADCS_ADCx);
while (adc_calibration_init_status_get(ADCS_ADCx));
adc_calibration_start(ADCS_ADCx);
while (adc_calibration_status_get(ADCS_ADCx));
}
/**
* Инициализация ADC
* @param *env tAdcs
*/
void Adcs_Init(tAdcs *env) {
adc_gpio_config();
adc_dma_config();
adc_config();
memset(env->tab, 0, ADCS_ADC_BUFF_SIZE);
}
/**
* Обновление таблицы значений каналов ADC
* @param env
*/
void Adcs_UpdateTab(tAdcs *env) {
memcpy(env->tab, (void *) adc_ordinary_valuetab, ADCS_ADC_BUFF_SIZE);
}