static void get_adc_config (uint32_t config[4]) { config[2] = ADC_SQR1_NUM_CH(2); switch (SYS_BOARD_ID) { case BOARD_ID_FST_01: config[0] = 0; config[1] = ADC_SMPR2_SMP_AN0(ADC_SAMPLE_1P5) | ADC_SMPR2_SMP_AN9(ADC_SAMPLE_1P5); config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN9); break; case BOARD_ID_OLIMEX_STM32_H103: case BOARD_ID_STBEE: config[0] = ADC_SMPR1_SMP_AN10(ADC_SAMPLE_1P5) | ADC_SMPR1_SMP_AN11(ADC_SAMPLE_1P5); config[1] = 0; config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN10) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN11); break; case BOARD_ID_STBEE_MINI: config[0] = 0; config[1] = ADC_SMPR2_SMP_AN1(ADC_SAMPLE_1P5) | ADC_SMPR2_SMP_AN2(ADC_SAMPLE_1P5); config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN1) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN2); break; case BOARD_ID_CQ_STARM: case BOARD_ID_FST_01_00: case BOARD_ID_MAPLE_MINI: case BOARD_ID_STM32_PRIMER2: case BOARD_ID_STM8S_DISCOVERY: case BOARD_ID_ST_DONGLE: case BOARD_ID_ST_NUCLEO_F103: case BOARD_ID_NITROKEY_START: default: config[0] = 0; config[1] = ADC_SMPR2_SMP_AN0(ADC_SAMPLE_1P5) | ADC_SMPR2_SMP_AN1(ADC_SAMPLE_1P5); config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN1); break; } }
static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { (void)adcp; (void)err; } /* * ADC conversion group. */ static const ADCConversionGroup adccg = { TRUE, ADC_NUM_CHANNELS, adccallback, adcerrorcallback, 0, /* CR1 */ ADC_CR2_SWSTART, /* CR2 */ ADC_SMPR1_SMP_AN10(ADC_SAMPLE_480) | ADC_SMPR1_SMP_AN11(ADC_SAMPLE_480) | ADC_SMPR1_SMP_AN12(ADC_SAMPLE_480) | ADC_SMPR1_SMP_AN13(ADC_SAMPLE_480) | ADC_SMPR1_SMP_AN14(ADC_SAMPLE_480) | ADC_SMPR1_SMP_AN15(ADC_SAMPLE_480), 0, /* SMPR2 */ ADC_SQR1_NUM_CH(ADC_NUM_CHANNELS), 0, (ADC_SQR3_SQ6_N(ADC_AN33_2) | ADC_SQR3_SQ5_N(ADC_AN33_1) | ADC_SQR3_SQ4_N(ADC_AN33_0) | ADC_SQR3_SQ3_N(ADC_6V_SUPPLY) | ADC_SQR3_SQ2_N(ADC_MAIN_SUPPLY) | ADC_SQR3_SQ1_N(ADC_CURRENT_SENS)) }; /* *******************************************************************************
static void adc_callback_slow(ADCDriver *adcp, adcsample_t *buffer, size_t n); #define ADC_SAMPLING_SLOW ADC_SAMPLE_480 #define ADC_SAMPLING_FAST ADC_SAMPLE_28 /* * ADC conversion group. */ static ADCConversionGroup adcgrpcfgSlow = { FALSE, 0, adc_callback_slow, NULL, /* HW dependent part.*/ ADC_TwoSamplingDelay_20Cycles, // cr1 ADC_CR2_SWSTART, // cr2 /** * here we configure all possible channels for slow mode. Some channels would not actually * be used hopefully that's fine to configure all possible channels. */ ADC_SMPR1_SMP_AN10(ADC_SAMPLING_SLOW) | ADC_SMPR1_SMP_AN11(ADC_SAMPLING_SLOW) | ADC_SMPR1_SMP_AN12(ADC_SAMPLING_SLOW) | ADC_SMPR1_SMP_AN13(ADC_SAMPLING_SLOW) | ADC_SMPR1_SMP_AN14(ADC_SAMPLING_SLOW) | ADC_SMPR1_SMP_AN15(ADC_SAMPLING_SLOW) | ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_144) , // sample times for channels 10...18 ADC_SMPR2_SMP_AN0(ADC_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN1(ADC_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN2(ADC_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN3(ADC_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN4(ADC_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN5(ADC_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN6(ADC_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN7(ADC_SAMPLING_SLOW) |
} static void adc_callback_slow(ADCDriver *adcp, adcsample_t *buffer, size_t n); #define MY_SAMPLING_SLOW ADC_SAMPLE_480 #define MY_SAMPLING_FAST ADC_SAMPLE_28 /* * ADC conversion group. */ static ADCConversionGroup adcgrpcfgSlow = { FALSE, 0, adc_callback_slow, NULL, /* HW dependent part.*/ ADC_TwoSamplingDelay_20Cycles, // cr1 ADC_CR2_SWSTART, // cr2 ADC_SMPR1_SMP_AN10(MY_SAMPLING_SLOW) | ADC_SMPR1_SMP_AN11(MY_SAMPLING_SLOW) | ADC_SMPR1_SMP_AN12(MY_SAMPLING_SLOW) | ADC_SMPR1_SMP_AN13(MY_SAMPLING_SLOW) | ADC_SMPR1_SMP_AN14(MY_SAMPLING_SLOW) | ADC_SMPR1_SMP_AN15(MY_SAMPLING_SLOW) , // sample times for channels 10...18 ADC_SMPR2_SMP_AN0(MY_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN1(MY_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN3(MY_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN4(MY_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN5(MY_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN6(MY_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN7(MY_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN8(MY_SAMPLING_SLOW) | ADC_SMPR2_SMP_AN9(MY_SAMPLING_SLOW)
(void)adcp; (void)err; } /* * ADC conversion group. * Mode: Linear buffer, 8 samples of 1 channel, SW triggered. * Channels: IN10. */ static const ADCConversionGroup adcgrpcfg1 = { FALSE, ADC_GRP1_NUM_CHANNELS, NULL, adcerrorcallback, 0, 0, /* CR1, CR2 */ ADC_SMPR1_SMP_AN10(ADC_SAMPLE_1P5), 0, /* SMPR2 */ ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), 0, /* SQR2 */ ADC_SQR3_SQ1_N(ADC_CHANNEL_IN10) }; /* * ADC conversion group. * Mode: Continuous, 16 samples of 8 channels, SW triggered. * Channels: IN10, IN11, IN10, IN11, IN10, IN11, Sensor, VRef. */ static const ADCConversionGroup adcgrpcfg2 = { TRUE, ADC_GRP2_NUM_CHANNELS, adccallback,
static void adcerrorcallback(ADCDriver *adcp, adcerror_t err); static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n); static adcsample_t samples[ADC_NUM_CHANNELS * ADC_BUF_DEPTH]; static uint32_t ints = 0; static uint32_t errors = 0; static const ADCConversionGroup adccg = { TRUE, ADC_NUM_CHANNELS, adccallback, adcerrorcallback, 0, /* CR1 */ ADC_CR2_SWSTART, /* CR2 */ ADC_SMPR1_SMP_AN10(ADC_SAMPLE_3) | ADC_SMPR1_SMP_AN11(ADC_SAMPLE_3) | ADC_SMPR1_SMP_AN12(ADC_SAMPLE_3) | ADC_SMPR1_SMP_AN13(ADC_SAMPLE_3) | ADC_SMPR1_SMP_AN14(ADC_SAMPLE_3) | ADC_SMPR1_SMP_AN15(ADC_SAMPLE_3), 0, /* SMPR2 */ ADC_SQR1_NUM_CH(ADC_NUM_CHANNELS), 0, ADC_SQR3_SQ6_N(ADC_AN33_2) | ADC_SQR3_SQ5_N(ADC_AN33_1) | ADC_SQR3_SQ4_N(ADC_AN33_0) | ADC_SQR3_SQ3_N(ADC_6V_SUPPLY) | ADC_SQR3_SQ2_N(ADC_MAIN_SUPPLY) | ADC_SQR3_SQ1_N(ADC_CURRENT_SENS) };
* ADC samples buffer. */ unsigned short adcvalues[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH] __attribute__ ((section (".sram2"))); /* * ADC conversion group. * Mode: Linear buffer, 8 samples of 1 channel, SW triggered. * Channels: IN11. */ static const ADCConversionGroup adcgrpcfg1 = {FALSE, //circular buffer mode ADC_GRP1_NUM_CHANNELS, //Number of the analog channels NULL, //Callback function (not needed here) 0, //Error callback 0, /* CR1 */ ADC_CR2_SWSTART, /* CR2 */ ADC_SMPR1_SMP_AN10(ADC_SAMPLE_84) | ADC_SMPR1_SMP_AN11(ADC_SAMPLE_84) | ADC_SMPR1_SMP_AN12(ADC_SAMPLE_84) | ADC_SMPR1_SMP_AN13(ADC_SAMPLE_84) | ADC_SMPR1_SMP_AN14(ADC_SAMPLE_84) | ADC_SMPR1_SMP_AN15(ADC_SAMPLE_84), //sample times ch10-18 ADC_SMPR2_SMP_AN0(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN1(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN2(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN3(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN4(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN5(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN6(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN7(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN8(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN9(ADC_SAMPLE_84), //sample times ch0-9 ADC_SQR1_SQ13_N(ADC_CHANNEL_IN12) | ADC_SQR1_SQ14_N(ADC_CHANNEL_IN13) | ADC_SQR1_SQ15_N(ADC_CHANNEL_IN14) | ADC_SQR1_SQ16_N(ADC_CHANNEL_IN15) | ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), //SQR1: Conversion group sequence 13...16 + sequence length ADC_SQR2_SQ7_N(ADC_CHANNEL_IN6) | ADC_SQR2_SQ8_N(ADC_CHANNEL_IN7) | ADC_SQR2_SQ9_N(ADC_CHANNEL_IN8) | ADC_SQR2_SQ10_N(ADC_CHANNEL_IN9) | ADC_SQR2_SQ11_N(ADC_CHANNEL_IN10) | ADC_SQR2_SQ12_N(ADC_CHANNEL_IN11), //SQR2: Conversion group sequence 7...12 ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN1) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN2) | ADC_SQR3_SQ4_N(ADC_CHANNEL_IN3)
/* * ADC conversion group. * Mode: Linear buffer, 4 samples of 2 channels, SW triggered. * Channels: IN10 (41.5 cycles sample time) * Sensor (239.5 cycles sample time) */ static const ADCConversionGroup adcgrpcfg = { FALSE, ADC_GRP1_NUM_CHANNELS, adccb, NULL, /* HW dependent part.*/ 0, ADC_CR2_TSVREFE, ADC_SMPR1_SMP_AN10(ADC_SAMPLE_41P5) | ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_239P5), 0, ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), 0, ADC_SQR3_SQ2_N(ADC_CHANNEL_IN10) | ADC_SQR3_SQ1_N(ADC_CHANNEL_SENSOR) }; /* * SPI configuration structure. * Maximum speed (12MHz), CPHA=0, CPOL=0, 16bits frames, MSb transmitted first. * The slave select line is the pin GPIOA_SPI1NSS on the port GPIOA. */ static const SPIConfig spicfg = { spicb, /* HW dependent part.*/ GPIOA,