안녕하세요.
이전 글에서 타이머 이론을 학습했다면, 이제 Nucleo 보드에서 확인해 보겠습니다.
가지고 있는 STM32 cortex-M 시리즈에서도 타이머 포트 혹은 핀 등을 변경해서도 가능할 것이라 생각됩니다.
1. RTC 회로 확인
내부에 32KHz RTC 크리스털이 있지만, 1초를 측정 오차를 조금이라도 줄이기 위해서 외부 32.768KHz 크리스털이 장착된 것을 알 수 있습니다. (LSE)
2. 프로젝트 생성
STM32 IDE를 실행시키고 "File->New->STM32 Project"를 선택해서 프로젝트를 실행합니다.
테스트 보드라면 상단 "Board Selector"를 선택하고 "Commercial Part Number"에 가지고 있는 제품의 이름을 입력해서 제품을 선택하고 Next를 누릅니다.
현재 테스트보드는 Nucleo-G071RB입니다. 다른 기종의 보드명을 입력하면 됩니다.
프로젝트 이름을 입력하고 "Finish"를 누릅니다. "Initialize all peripherals with their default Mode?"는 주변 장치를 기본값으로 설정할까요? "Yes" 선택.
3. 타이머 설정
1) Pinout & Configuration
설정 복잡성을 줄이기 위해서 몇 가지 사용하지 않는 기능은 사용불가 상태로 만들어 놓고 시작합니다. 만약 "Connectivity"에서 ETH, USB_OTG_FS 등이 있다면 Disable을 선택합니다. G071에는 기능이 없기 때문에 다음으로 넘어갑니다.
"Categories -> RCC(Reset and Clock Control)" 탭으로 이동해서 핀 설정을 먼저 합니다.
HSE는 사용하지 않기 때문에 Disable로 하고 LSE는 Crystal... 로 설정된 것을 확인합니다.
RTC를 사용하기 위해서 "Timers->RTC"에서 Activate Clock Source를 체크합니다.
2) Clock Configuration
LSE와 HSI를 선택합니다.
PLL(Phase-Locked Loop)를 설정하여 CPU에서 제공하는 SYSCLK를 최대 속도로 만들어봅니다.
HSI 입력신호를 PLLM은 /1,
G071 경우 64MHz이나 항상 최대 속도로 시스템을 유지할 없습니다. 시스템에 맞게 SYSCLK을 설정하면 됩니다.
STM32 시리즈마다 PLLR 혹은 PLLP로 SYSCLK으로 사용하는 것이 다를 수도 있습니다.
3) 0.1초 주기 만들기 보기
간단한 타이머 확인을 위해서 TIM2를 사용해 보겠습니다. TIM2는 저속 주변장치 APB(Advanced Peripheral Bus)에 연결되어 있습니다.
TPCLK는 64MHz로 되어 있는 것을 확인합니다.
"Pinout & Configuration->Categories->Timers->TIM2"로 이동해서 Clock Source 메뉴에서 Internal Clock으로 선택을 합니다.
64MHz 클럭을 0.1초(100ms)로 만들기 위해서 Prescaler(PSC)는 100, Counter Period는 640으로 설정합니다.
TIM2 Interrupt도 "NVIC Settings"탭을 선택해서 활성화합니다.
핀 설정을 완료하고 저장을 누릅니다. 그러면 필요한 코드가 자동으로 생성됩니다.
4) 소스코드 작성
Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim.c 파일을 보면 HAL_TIM_PeriodElapsedCallback 함수를 확인할 수 있습니다.
HAL_TIM_PeriodElapsedCallback() 함수는 타이머 카운터(TIMx_CNT)가 타이머의 자동 재로드 값(ARR, Auto Reload Register)에 도달했을 때 Callback 함수가 호출됩니다.
main.c 함수로 돌아와서 콜백함수를 구현해 줍니다. 앞에서 본 함수형식을 복사한 후 카운터가 증가하는 내용을 추가합니다.
int iCount = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
iCount++;
} //HAL_TIM_PeriodElapsedCallback
구현을 했다면, 타이머가 시작할 수 있게 초기화 함수 밑에 타이머 시작 함수를 넣어 줍니다. 인자는 타이머 2의 핸들러(htim2)를 넣어줍니다.
HAL_TIM_Base_Start_IT(&htim2);
5) 동작 확인
다음 글에서 UART를 설정하는 것을 하면 좀 더 시각적으로 볼 수 있지만 현재는 breakpoint를 활용해서 확인해 보겠습니다.
iCount++ 코드 줄에 Ctrl + Shift + B를 눌러 breakpoint 지점을 생성합니다.
"Project -> Project Build" 빌드를 한 후 "Debug->Debug As->STM32 C/C++ Application"을 선택합니다.
Resume(F8)를 눌러 iCount에서 멈출 때마다 마우스 포인터를 변수 위에 놓으면 현재 값이 나타납니다.
혹은 iCount 변수를 선택 후 마우스 오른쪽 버튼을 눌러서 "Add Watch Expression" 선택합니다. Resume(F8) 누를 때 인터럽트가 발생하면 값이 변하는 것을 확인할 수 있습니다.
이것으로 Timer의 동작을 간단하게 확인했습니다. 현재 RTC, 타이머 주기 확인 등을 정확하게 하지 못한 부분이 남아 있습니다. 이후 글에서 다른 모듈과 연동하면서 확인해 보겠습니다.
감사합니다.
<참고 사이트>
1. 임베디드 컨트롤러 기초 5차시 - STEP 교육과정
'Embedded > STM32' 카테고리의 다른 글
STM32 시리즈 타이머(Timer) 이론 학습 (2) | 2025.02.13 |
---|---|
STM32 시리즈 GPIO(General Purpose Input/Output) 포트 학습 정리 (0) | 2025.02.11 |