rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
adc_onchip.cpp
Go to the documentation of this file.
1/**
2 * @file adc_onchip.cpp
3 * @brief Low level ChibiOS ADC helpers code
4 *
5 * @date Aug 23, 2025
6 * @author Andrey Gusakov, (c) 2025
7 */
8
9#include "pch.h"
10
11#if HAL_USE_ADC
12
13#include "adc_onchip.h"
14
15// Some helpers for ADCConversionGroup manipulations
16// mostly for STM32 devices. Should we move this to ports?
17
18#if defined(STM32F4) || defined(STM32F7)
19
20int adcConversionGroupSetSeqInput(ADCConversionGroup* cfg, size_t sqn, size_t input) {
21 if (sqn < 6) {
22 size_t shift = 5 * (sqn - 0);
23 cfg->sqr3 = (cfg->sqr3 & (~(0x1f << shift))) |
24 (input << shift);
25 } else if (sqn < 12) {
26 size_t shift = 5 * (sqn - 6);
27 cfg->sqr2 = (cfg->sqr2 & (~(0x1f << shift))) |
28 (input << shift);
29 } else if (sqn < 18) {
30 size_t shift = 5 * (sqn - 12);
31 cfg->sqr1 = (cfg->sqr1 & (~(0x1f << shift))) |
32 (input << shift);
33#if ADC_MAX_CHANNELS_COUNT > 16
34 } else if (sqn < 24) {
35 size_t shift = 5 * (sqn - 18);
36 cfg->sqr4 = (cfg->sqr4 & (~(0x1f << shift))) |
37 (input << shift);
38 } else if (sqn < 30) {
39 size_t shift = 5 * (sqn - 24);
40 cfg->sqr5 = (cfg->sqr5 & (~(0x1f << shift))) |
41 (input << shift);
42 }
43#endif /* ADC_MAX_CHANNELS_COUNT */
44 } else {
45 return -1;
46 }
47
48 return 0;
49}
50
51int adcConversionGroupGetSeqInput(ADCConversionGroup* cfg, size_t sqn) {
52 if (sqn < 6) {
53 size_t shift = 5 * (sqn - 0);
54 return (cfg->sqr3 >> shift) & 0x1f;
55 } else if (sqn < 12) {
56 size_t shift = 5 * (sqn - 6);
57 return (cfg->sqr2 >> shift) & 0x1f;
58 } else if (sqn < 18) {
59 size_t shift = 5 * (sqn - 12);
60 return (cfg->sqr1 >> shift) & 0x1f;
61#if ADC_MAX_CHANNELS_COUNT > 16
62 } else if (sqn < 24) {
63 size_t shift = 5 * (sqn - 18);
64 return (cfg->sqr4 >> shift) & 0x1f;
65 } else if (sqn < 30) {
66 size_t shift = 5 * (sqn - 24);
67 return (cfg->sqr5 >> shift) & 0x1f;
68#endif /* ADC_MAX_CHANNELS_COUNT */
69 }
70
71 return -1;
72}
73
74#endif // STM32F4 || STM32F7
75
76#endif // HAL_USE_ADC
int adcConversionGroupSetSeqInput(ADCConversionGroup *cfg, size_t sqn, size_t input)
int adcConversionGroupGetSeqInput(ADCConversionGroup *cfg, size_t sqn)
Low level ChibiOS ADC helpers header.