cancel
Showing results for 
Search instead for 
Did you mean: 

ADC interleaved mode (2/2): Hands-On STM32CubeIDE project

LauraCx
ST Employee

This series of articles will provide you with:

  • Tips&tricks on how to implement ADC interleaved mode to double equivalent sampling rate
  • ADC interleave mode details from practical point of view
  • Info on DMA data transfer using ADC Common Data Register

Part 1 of the article is available here

1. New project creation

  • Open STM32CubeIDE
  • File → New STM32 project → select STM32L476RG
  • Enter project name and location
  • Press Finish button
1509.png          1510.png

2. System Core

File → New STM32 project → STM32L476RG (NUCLEO)
Pinout & Configuration tab → System Core → SYS
Select Debug interface: Serial Wire

1511.png       1512.png

3. Analog Settings

  • Pinout & Configuration tab → Analog → ADC1

1513.png

  • Pinout & Configuration tab → Analog → ADC1 : ADC1 Parameters Settings tab:
    -Mode: Dual interleaved mode only
    -DMA Access Mode: DMA access mode enabled
    -Delay between 2 sampling phases: 3 Cycles
    -Synchronous clock mode divided by 1
    -Continuous Conversion Mode: Enabled
    -DMA Continuous Requests: Enabled
    -Rank 1; Channel: Channel 5, Sampling Time: 6.5 Cycles

1515.png

  • Pinout & Configuration tab → Analog → ADC1: Configure ADC1 in DMA Settings tab
- ADC1, DMA1 Channel 1, Peripheral To Memory, Low
- Mode: Normal,
- Increment Address: Memory,
- Data Width: Word
1517.png
1519.png
  • Pinout & Configuration tab → Analog → ADC2 : Configure ADC2 in Parameters Settings tab
-Mode: Dual interleaved mode only
-DMA Access Mode: DMA access mode enabled
-Delay between 2 sampling phases: 3 Cycles
-Synchronous clock mode divided by 1
-Continuous Conversion Mode: Enabled
-Rank 1; Channel: Channel 5, Sampling Time: 6.5 Cycles
1520.png
  • Pinout & Configuration tab → Connectivity → USART2
USART2 Mode: Asynchronous
USART2 in Parameters Settings tab
-Baud Rate: 115200 Bits/s,
-Char Length: 8Bits,
-Parity: None,
-Stop Bits: 1
1522.png 1524.png

4. Clock Configuration tab

  • Set HCLK frequency as 80MHz
1526.png

5. Generate code

  • Click on 1528.png
  • Open C perspective and edit main.c file

1530.png

6. Insert relevant code in main.c

  • Follow user code section names, section by section and put relevant code of main.c
1. USER CODE Includes section

#include <stdio.h>
2. USER CODE PD

#define ADC_BUF_SIZE 20
3. USER CODE PV

static uint32_t adcBuf[ADC_BUF_SIZE];  
static uint32_t adcFlag = RESET;
4. USER CODE 0

int _write(int file, char *ptr, int len)
{
 HAL_UART_Transmit(&huart2,(uint8_t*)ptr,len,100);
  return len;
}
5. USER CODE 2

HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);

LL_ADC_SetMultiDMATransfer(ADC123_COMMON,LL_ADC_MULTI_REG_DMA_LIMIT_RES12_10B);  //One shot MDMA mode

HAL_ADCEx_MultiModeStart_DMA(&hadc1,adcBuf,ADC_BUF_SIZE);
__HAL_DMA_DISABLE_IT(&hdma_adc1,DMA_IT_HT);  //Avoid DMA half transfer interrupt trigger

7. MDMA mode

  • MDMA=0b10: a single DMA request is generated each time both master and slave EOC events have occurred, 32-bit register ADCx_CDR contains the two half-words representing two ADC-converted data items (10 or 12 bit).
1531.png
  • Follow user code section names, section by section and put relevant code of main.c
6. USER CODE 3

if (adcFlag)
{
  printf("-------------\r\n");
  for(uint32_t i=0;i<ADC_BUF_SIZE;i++)
  {
    printf("%u\r\n",(uint16_t)(adcBuf[i]&0x0000FFFF));  //LSB -> MASTER
    printf("%u\r\n",(uint16_t)(adcBuf[i]>>16));         //MSB -> SLAVE
  }
  HAL_Delay(1000);

  adcFlag = RESET;
  HAL_ADCEx_MultiModeStart_DMA(&hadc1,adcBuf,ADC_BUF_SIZE);
  __HAL_DMA_DISABLE_IT(&hdma_adc1,DMA_IT_HT);
}
7. USER CODE 4

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *AdcHandle)
{
  adcFlag = SET;
}

 

1532.png
1533.png

8. Final steps

  • 10. Start terminal: 115200,8,N,1 and observe ADC results, check if application is running
1534.png
  • 11. Connect signal generator: sinus 500kHz / 3Vpp, follow MCU electrical limits (unipolar voltage), pin 1 of CN8 or pin 28 of CN7
1535.png
  • 12. Observe the ADC results, import text data to Excel1536.png

 
 
 
 
Comments
Milan1367
Associate

@Laurids_PETERSEN 
I tried the steps, but there is an error on :

LL_ADC_SetMultiDMATransfer(ADC123_COMMON,LL_ADC_MULTI_REG_DMA_LIMIT_RES12_10B);  //One shot MDMA mode

Description Resource Path Location Type
'ADC123_COMMON' undeclared (first use in this function); did you mean 'ADC12_COMMON'? main.c / ADC_interleaved/ Core/ Src line 113 C/C++ Problem

 

it should be ADC12_COMMON
 

Milan1367
Associate

Update: I was generating code On STMG4, I tried this on STM32L476RG as explained above, and the code is correct: ADC123_COMMON

Version history
Last update:
‎2024-06-03 01:28 AM
Updated by:
Contributors