STM32 HAL Timer

codedrawer·2021년 8월 6일
0

STM32

목록 보기
1/1

STM32 Stdperiph 라이브러리의 단점

STM32 프로그래밍의 기존 방법은 Stdperiph 라이브러리를 사용하여 라이브러리에서 제공하는 구조체에 필요한 값을 설정하여 제공

Stdperiph 라이브러리도 직접 레지스터에 값을 설정하는 방법에 비해 쉽고 편리한 점이 있지만 이 역시 개발 과정에서 해당 핀의 설정이 다른 peripheral 과 겹치게 설정이 되는지를 다시 한 번 검증해야 하는 과정이 필요 했다.

STM32 Cube HAL 라이브러리의 장점

시각적으로(GUI 기능) 어느 핀이 어떤 기능으로 사용되는지 확인이 쉽다. 따라서, Stdperiph 라이브러리의 단점을 극복한 점이다. 쉽다 빠르다는 점이다.

하지만 역시 Cube 툴을 사용하기 위해 최소한의 시간은 필요하다.

Timer Block

imgTimer 블럭은 system clock을 Prescaler로 나눈값을 사용한다. Prescaler의 출력 부분이 Timer 블럭의 기준 클럭으로 사용된다. System Clock의 경우 APB1 버스인지 APB2 버스인지 확인을 해야 한다. 확인은 레퍼런스 매뉴얼의 Clock Tree에서 참조한다.
img
img

Timer 설정

내부 Timer 설정

Prescaler 값과 Timer를 설정하고 interrupt가 발생 하도록 설정.
img

PA15 핀은 Timer1 Channel 1 을 설정할 수 있으나 해당 핀을 사용하지 않고 Interrupt를 발생 하려면

img

Internal Clock을 설정하고 모든 Channel을 Disable로 설정

img

System Clock이 180 Mhz 일 경우 Prescaler 를 통과한 Clock을 1 KHz를 만들기 위해 179999 (180000 - 1) 로 설정하고 Counter 값을 999 (1000 - 1) 로 설정하면 1초에 한 번씩 Interrupt 가 발생

img

Interrupt Channel 를 설정하고 Code Generation

Start Timer

MX_TIM1_Init 내부에서 HAL_TIM_Base_Start_IT(&htim1);를 호출

/ USER CODE BEGIN TIM2_Init 2 /
HAL_TIM_Base_Start_IT(&htim2);
/ USER CODE END TIM2_Init 2 /

Timer Interrupt ISR Callback

Timer Interrupt가 발생하면 HAL_TIM_IRQHandler 루틴을 수행하게 된다. 해당 함수는 stm32f4xxhal_tim.c 파일 안에 있다. 모든 Channel을 Disable 했으므로 TIM_FLAG_UPDATE 이벤트가 발생한다. 이 경우 HALTIM_PeriodElapsedCallback 루틴을 재정의해서 사용할 수 있다. 간단하게 GPIO LED로 확인 가능하다.

/* USER CODE BEGIN 4 */
void LED6_On(void)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);
}

void LED6_Off(void)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM1) /* 1s */
{
HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_15);
}
}
/* USER CODE END 4 */

profile
Embedded SW

0개의 댓글