ST/STM32F103C8

STM32F103C8 - ADC(DMA)

engineer4ever 2025. 8. 8. 10:11
 
MCU
STM32F103(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
HAL driver를 사용하여 ADC를 여러개를 DMA mode로 multi conversion 한다.

 

1. STM32CubeMX : ADC-DMA 설정

- 'Pinout & Configuration' Tab으로 이동

1) Analog 선택

2) ADC1 항목 선택

 

- ADC Configuration 확인

ADC_Settings >

1) Scan Convsersion Mode : Enabled

여러 채널을 샘플링 하는 경우 scan 모드를 enable 하고 한개 채널만 샘플링 하는 경우 disable

2) Continous conversion mode : Enabled

3) Discontinous conversion mode : Disabled

 

ADC_Regular_Conversion Mode >

1) Enable Regular Conversions : Enable

2) Number of Conversion : 3

3) 각 Rank 별로 원하는 ADC 채널 선택

 

- DMA Settings 확인

1) DMA Request : ADC1

2) ADC1 and ADC2 global interrupts : Enabled에 체크

3) Data Width : Word(uint32_t), Half Word(uint16_t)

4) Mode : Normal(HAL_ADC_Start_DMA() 함수를 계속 호출해야 함),

Circular(HAL_ADC_Start_DMA() 함수를 최초에 한번만 호출하면 됨)

- GENERATE CODE 클릭


2. ATOLLIC : main.c 수정

- 변수 선언 ; CubeMX에서 Half Word(uint16_t)로 설정

/* USER CODE BEGIN 0 */
uint16_t adc_ch = 0;
uint16_t adc_val[3] = {1, };
 

- HAL_ADC_Start_DMA 호출 ; CubeMX에서 DMA 설정을 Circular로 했기 때문에 1번만 호출해 주면됨(매번 호출할 필요 없음)

- printf() 함수로 while() 루프에서 ADC 값 확인

/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1,(uint16_t*)&(adc_val[0]),3);

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
	printf("PB0 = %d, PC5 = %d, PA2 = %d\n", adc_val[0], adc_val[1], adc_val[2]);
	HAL_Delay(500);
}
 

'ST > STM32F103C8' 카테고리의 다른 글

STM32F103C8 - PWM  (0) 2025.08.08
STM32F103C8 - TIMER  (1) 2025.08.08
STM32F103C8 - ADC(Interrupt)  (0) 2025.08.08
STM32F103C8 - ADC(Polling)  (1) 2025.08.08
STM32F103C8 - printf()를 이용하여 UART로 문자열 출력  (0) 2025.08.08