Arduino_STM32/STM32F1/libraries/STM32ADC/examples/MultiChannelSingleConversion/MultiChannelSingleConversio...

67 lines
1.7 KiB
C++

/*
This example shows how to use the ADC library to sample several
channels/pins in one go.
This example attaches an interrupt to the DMA completion to notify the user.
The DMA must be set together with the start conversion, so both setDMA and startConversion
Must be called.
*/
#include <STM32ADC.h>
#define BOARD_LED D33 //PB0
uint8 pins[] = {11,10,9,8,7,6,5,4};
const int maxSamples = 8; // 8 channels
// Array for the ADC data
uint16 dataPoints[maxSamples];
volatile static bool dma1_ch1_Active; //flag for interrupt
STM32ADC myADC(ADC1);
void setup() {
//start Serial
Serial.begin(19200);
//Start up blink from Pig-O-Scope
pinMode(BOARD_LED, OUTPUT);
pinMode(D32, INPUT);
digitalWrite(BOARD_LED, HIGH);
delay(1000);
digitalWrite(BOARD_LED, LOW);
delay(1000);
//calibrate ADC.
myADC.calibrate();
myADC.setSampleRate(ADC_SMPR_1_5); //sample ratio
myADC.setPins(pins, maxSamples); //pins to be converted
myADC.setScanMode(); //Set the ADC in Scan Mode
}
void loop(){
//start acquisition on button push.
if(digitalRead(D32) == 1 ) {
Serial.println("begin");
dma1_ch1_Active = 1;
myADC.setDMA(dataPoints, 8, (DMA_MINC_MODE | DMA_TRNS_CMPLT), DMA1_CH1_Event);
myADC.startConversion();
while (dma1_ch1_Active == 1); //wait for DMA to complete.
for(unsigned int i = 0; i < maxSamples; i ++) {
Serial.print("sample[");
Serial.print(i);
Serial.print("] = ");
Serial.println(dataPoints[i]);
}
while(digitalRead(D32) == 1); //stay here. Another button push is required.
}
}; //end loop
/*
Interrupt handler. eh eh
*/
static void DMA1_CH1_Event() {
dma1_ch1_Active = 0;
}