Welcome to mirror list, hosted at ThFree Co, Russian Federation.

adc_dma.cpp « cm3cpp - github.com/thirdpin/libopencm3_cpp_extensions.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 1a7bb09f97b9a13ac970e844cea3cdeeeaf35ee4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "adc_dma.hpp"

namespace cm3cpp {

namespace adc {

AdcDma::AdcDma(DmaConf dma, AdcConf adc, bool is_temp_sensor)
{
    _adc = new Adc(adc.number);
    _data = new uint16_t[adc.channels_count];
    memset(_data, 0, (adc.channels_count * sizeof(uint16_t)));

    dma_stream_reset(dma.number, dma.stream);
    dma_channel_select(dma.number, dma.stream, dma.channel);
    dma_set_memory_address(dma.number, dma.stream, (uint32_t)_data);
    dma_set_peripheral_address(dma.number, dma.stream,
                               (uint32_t)&ADC_DR(_adc->get_base_address()));
    dma_set_transfer_mode(dma.number, dma.stream,
                          DMA_SxCR_DIR_PERIPHERAL_TO_MEM);
    dma_set_number_of_data(dma.number, dma.stream, adc.channels_count);
    dma_disable_peripheral_increment_mode(dma.number, dma.stream);
    dma_enable_memory_increment_mode(dma.number, dma.stream);
    dma_set_peripheral_size(dma.number, dma.stream, DMA_SxCR_PSIZE_16BIT);
    dma_set_memory_size(dma.number, dma.stream, DMA_SxCR_MSIZE_16BIT);
    dma_enable_circular_mode(dma.number, dma.stream);
    dma_set_priority(dma.number, dma.stream, DMA_SxCR_PL_MEDIUM);
    dma_enable_fifo_mode(dma.number, dma.stream);
    dma_set_fifo_threshold(dma.number, dma.stream, DMA_SxFCR_FTH_2_4_FULL);
    dma_set_memory_burst(dma.number, dma.stream, DMA_SxCR_MBURST_SINGLE);
    dma_set_peripheral_burst(dma.number, dma.stream, DMA_SxCR_PBURST_SINGLE);
    dma_enable_stream(dma.number, dma.stream);

    if (is_temp_sensor) {
        _adc->enable_temp_sensor();
    }
    _adc->set_multi_mode(Adc::MultiMode::MODE_INDEPENDENT);
    _adc->set_prescaler(Adc::Prescaler::PRESCALER_8);
    _adc->set_dma_mode(Adc::DmaMode::MODE_NONE);
    _adc->set_delay_between_two_samples(Adc::Delay::DELAY_CYCLES_20);
    _adc->set_resolution(Adc::Resolution::RES_12_BIT);
    _adc->enable_scan_mode();
    _adc->set_conversion_mode(Adc::ConversionMode::CONTINUOUS_CONV);
    _adc->set_external_trigger_polarity_for_regular_group(
      Adc::RegularGroupTriggerPolarity::TRIGGER_NONE);
    _adc->set_external_trigger_for_regular_group(
      Adc::RegularGroupTrigger::T1_CC1);
    _adc->set_data_alignment(Adc::Alignment::RIGHT_ALIGN);
    _adc->set_conversion_number_in_sequence(adc.channels_count, adc.channels);

    for (int i = 0; i < adc.channels_count; ++i) {
        _adc->set_channel_sampling_time_selection(Adc::SamplingTime::CYCLES_480,
                                                  adc.channels[i]);
    }

    _adc->enable_dma_request();
    _adc->enable_dma();
    _adc->enable();
    _adc->start_conversion();
}

uint16_t AdcDma::get_value(uint8_t index)
{
    return (_data[index]);
}

}  // namespace adc

}  // namespace cm3cpp