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 |