본 단행본은 inflearn에 있는 ChrisP 강사님의 "HAL, CubeMX, TrueSTUDIO를 이용한 STM32F4 무료 강좌"를 정리한 글입니다.
강좌 바로 보기 >> https://www.inflearn.com/course/stm32f4/dashboard
[무료] HAL, CubeMX, TrueSTUDIO를 이용한 STM32F4 무료 강좌 - 인프런 | 강의
고성능 마이크로컨트롤러인 STM32F 시리즈를 처음 접하는 분들이 쉽게 시작할 수 있도록 무료 컴파일러 TrueSTUDIO 및 코드자동생성 프로그램 CubeMX 설치부터 칩 기능의 개념설명, 소스코드작성(HAL
www.inflearn.com
- ADC : Analog to Digital Converter
강의에서 내용은 다 설명해주므로, 여기서는 핵심만 짚고 넘어가겠습니다.
STM32F4는 총 16개의 ADC를 사용할 수 있다. 채널은 3개이다.
- DMA : Direct Memory Access
Peripheral : 칩 내부의 주변 장치.
Memory : 사용자가 선언한 변수.
Peripheral-to-Memory, Memory-to-Peripheal, Memory-to-Memory 3가지 모드가 있다.
- 회로도
없음
- CubeMx 설정
1. Pinout & Configuration
ADC 관련
ADC1 -> IN9, IN10, IN12, IN13
ADC1 에서는...
Scan Conversion Mode -> Enable
여러개의 ADC 채널을 동시에 사용할 것인지 묻는다.
Continuous Conversion Mode -> Enable
하나의 ADC가 끝난 후, 다음 ADC를 자동으로 실행할지를 묻는다.
DMA Continuous Requests -> Enable
하나의 DMA가 끝난 후, 다음 DMA를 자동으로 실행할지를 묻는다.
Number Of Conversion -> 4
몇개의 ADC 채널을 사용할 것인지를 묻는다.
Rank
1 -> Channel 10, Sampling Time=84 Cycles
2 -> Channel 12, Sampling Time=84 Cycles
3 -> Channel 13, Sampling Time=84 Cycles
4 -> Channel 9, Sampling Time=84 Cycles
ADC 변환 순서를 묻는다. 위에 적은 채널 순서대로 하면 되고,
Sampling Time은 ADC 변환을 하는데 소요되는 CPU 클럭을 결정한다.
설정중에 Resolution을 보면, 12bit (15 ADC Clock Cycles)라고 적혀 있다.
ADC Clock Cycles을 15만큼 소모하겠다는 건데, 이 숫자보다 크고 넉넉하게 설정해 주면 된다.
강의에서는 84로 했다.
DMA 관련
DMA Settings -> Add -> ADC1
DMA 에서는...
Mode -> Circular
여러개의 변수가 있을 때, 0,1,2,3 -> 0,1,2,3 -> ... 순으로 돌아가면서 접근하는 방식이다.
Increment Address -> Peripheral X, Memory O
이거는 DMA를 할 때 마다 peripheral 또는 memory의 주소를 1씩 증가시킬 건지를 묻는다.
강의에서는, ADC1만 사용하므로 peripheral에는 주소를 증가하면 안되므로 체크하면 안되고,
변수는 4개를 사용하므로 memory에는 주소를 증가해주어야 하므로 체크해주어야만 한다.
Data Width -> Peripheral : Half Word, Memory : Half Word
데이터 형태이다. Byte는 8비트, Half Word는 16비트, Word는 32비트를 의미한다.
강의에서는, ADC 변환 결과는 12비트이고 저장해야할 벼수도 12비트 이상이여야 하므로, 둘 다 Half Word를 선택해준다.
- 코드 생성
#include "CLCD.h"
// 여기서는 volatile를 써주는게 좋다!
volatile uint16_t adcval[4];
CLCD_GPIO_Init();
CLCD_Init();
HAL_ADC_Start_DMA(&hadc1, &adcval[0], 4);
uint8_t str[20];
while (1)
{
sprintf(str, "%4d %4d", adcval[0], adcval[1]);
CLCD_Puts(0, 0, str);
sprintf(str, "%4d %4d", adcval[2], adcval[3]);
CLCD_Puts(0, 1, str);
}
'Develop Knowledge > STM32F4 by ChrisP' 카테고리의 다른 글
9강. I2C 통신 (0) | 2023.02.03 |
---|---|
8강. DAC (0) | 2023.02.03 |
6강. PWM 생성하기 (0) | 2023.02.02 |
5강. EXTI (외부 인터럽트) (0) | 2023.02.02 |
4강. Timer Interrupt (0) | 2023.02.02 |