Files
Frame-rate-optimization/Bsp/bsp_adc.c
2026-04-09 10:14:20 +08:00

175 lines
4.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "bsp_adc.h"
#include "string.h"
#include "stdbool.h"
#define CUMULATIVE_NUM 1
#define ADC_CHANNEL_NUM 2
volatile uint16_t adc_value[CUMULATIVE_NUM][ADC_CHANNEL_NUM];
uint16_t adc_v[ADC_CHANNEL_NUM] = { 0 };
void read_adc_value(void)
{
uint16_t sum = 0;
for(uint8_t adc_channel_index = 0; adc_channel_index < ADC_CHANNEL_NUM; ++adc_channel_index)
{
sum = 0;
for(uint8_t cumulative_index = 0; cumulative_index < CUMULATIVE_NUM; ++cumulative_index)
{
sum += adc_value[cumulative_index][adc_channel_index];
}
adc_v[adc_channel_index] = sum / CUMULATIVE_NUM;
}
}
uint16_t GetAdcValue(uint8_t index)
{
if(index < ADC_CHANNEL_NUM)
{
return adc_v[index];
}
else
{
return 0;
}
}
void adc_init(void)
{
/* system clocks configuration */
rcu_config();
/* GPIO configuration */
gpio_config();
/* DMA configuration */
dma_config();
/* ADC configuration */
adc_config();
adc_ordinary_software_trigger_enable(ADC1, TRUE);
}
/*!
\brief configure the different system clocks
\param[in] none
\param[out] none
\retval none
*/
void rcu_config(void)
{
/* enable GPIO clock */
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
/* enable ADC clock */
crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
/* enable DMA0 clock */
crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
}
/*!
\brief configure the GPIO peripheral
\param[in] none
\param[out] none
\retval none
*/
void gpio_config(void)
{
gpio_init_type gpio_init_struct;
gpio_default_para_init(&gpio_init_struct);
/* configure the IN8 pin */
gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
gpio_init_struct.gpio_pins = GPIO_PINS_0;
gpio_init(GPIOB, &gpio_init_struct);
/* configure the IN9 pin */
gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
gpio_init_struct.gpio_pins = GPIO_PINS_1;
gpio_init(GPIOB, &gpio_init_struct);
}
/*!
\brief configure the DMA peripheral
\param[in] none
\param[out] none
\retval none
*/
void dma_config(void)
{
dma_init_type dma_init_struct;
nvic_irq_enable(DMA1_Channel1_IRQn, 0, 0);
dma_reset(DMA1_CHANNEL3);
dma_default_para_init(&dma_init_struct);
dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
dma_init_struct.memory_base_addr = (uint32_t)(&adc_v);
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)&ADC1->odt;
dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_HALFWORD;
dma_init_struct.peripheral_inc_enable = FALSE;
dma_init_struct.buffer_size = CUMULATIVE_NUM * ADC_CHANNEL_NUM;
dma_init_struct.priority = DMA_PRIORITY_HIGH;
dma_init_struct.loop_mode_enable = TRUE;
dma_init(DMA1_CHANNEL3, &dma_init_struct);
/* dmamux function enable */
dmamux_enable(DMA1, TRUE);
dmamux_init(DMA1MUX_CHANNEL3, DMAMUX_DMAREQ_ID_ADC1);
dma_channel_enable(DMA1_CHANNEL3, TRUE);
}
/*!
\brief configure the ADC peripheral
\param[in] none
\param[out] none
\retval none
*/
void adc_config(void)
{
adc_base_config_type adc_base_struct;
adc_common_config_type adc_common_struct;
//common_settings
crm_adc_clock_select(CRM_ADC_CLOCK_SOURCE_HCLK);
adc_common_default_para_init(&adc_common_struct);
/* config adc clock division */
adc_common_struct.div = ADC_HCLK_DIV_2;
/* config inner temperature sensor and vintrv */
adc_common_struct.tempervintrv_state = FALSE;
adc_common_config(&adc_common_struct);
/* adc_settings------------------------------------------------------------------- */
adc_base_default_para_init(&adc_base_struct);
adc_base_struct.sequence_mode = TRUE;//<2F><><EFBFBD><EFBFBD>ģʽ
adc_base_struct.repeat_mode = TRUE;//<2F><><EFBFBD><EFBFBD>ģʽ
adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;//<2F>Ҷ<EFBFBD><D2B6><EFBFBD>
adc_base_struct.ordinary_channel_length = ADC_CHANNEL_NUM;
adc_base_config(ADC1, &adc_base_struct);
adc_resolution_set(ADC1, ADC_RESOLUTION_12B);
/* adc_ordinary_conversionmode---------------------------------------------------- */
adc_ordinary_channel_set(ADC1, ADC_CHANNEL_8, 1, ADC_SAMPLETIME_12_5);
adc_ordinary_channel_set(ADC1, ADC_CHANNEL_9, 2, ADC_SAMPLETIME_12_5);
adc_ordinary_conversion_trigger_set(ADC1, ADC_ORDINARY_TRIG_SOFTWARE, ADC_ORDINARY_TRIG_EDGE_NONE);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
adc_dma_mode_enable(ADC1, TRUE);
adc_dma_request_repeat_enable(ADC1, TRUE);
adc_enable(ADC1, TRUE);
while(adc_flag_get(ADC1, ADC_RDY_FLAG) == RESET);
/* adc calibration---------------------------------------------------------------- */
adc_calibration_init(ADC1);
while(adc_calibration_init_status_get(ADC1));
adc_calibration_start(ADC1);
while(adc_calibration_status_get(ADC1));
}