본문 바로가기
DSP, MCU/STM32 (ARM Cortex-M)

STM32 ] TIM 2,3,4 인터럽트를 사용하여 LED 1,2,3을 각각 0.1, 0.5, 1초 간격으로 토글하는 예제

by eteo 2022. 6. 29.

기초 예제이긴 하지만 기록을 위해 남긴다.

 

먼저 클락설정부터 해준다.

 

SYS clock은 최대인 180MHz로 했고 APB1 Timer clocks는 90MHz이다.

 

 

 

datasheet의 20페이지 또는 90페이지를 확인하면 각각의 타이머가 어떤 버스의 클락소스를 사용하는지 확인할 수 있다.

 

 

 

 

 

 

 

타이머 2,3,4를 모두 enable 시키고 파라미터 세팅에서 Prescaler와 ARR을 설정해준다.

 

 

 

 

 

 

각각 0.1초, 0.5초, 1초를 뽑아내려면

 

주기는 주파수의 역수이니까 10Hz, 2Hz, 1Hz로 설정하면 된다.\

 

-1 해주는 이유는 0부터 카운트 하기 때문이다.

 

 

 

타이머 셋 다 인터럽트를 켠다.

 

 

각각 MX_TIM2_Init(); 함수를 따라가보면 아까 MX툴에서 설정해둔 값이 들어가 있는것을 볼 수 있다.

 

 

 

 

LED핀 설정

 

위와 같이 User Label을 쓰면 MX_GPIO_Init과 main.h에 아래와 같이 define 된다.

/* Private defines -----------------------------------------------------------*/
#define LED1_Pin GPIO_PIN_0
#define LED1_GPIO_Port GPIOB
#define LED3_Pin GPIO_PIN_14
#define LED3_GPIO_Port GPIOB
#define LED2_Pin GPIO_PIN_7
#define LED2_GPIO_Port GPIOB
/* USER CODE BEGIN Private defines */

 

 

보드매뉴얼 24페이지

 

 

 

 

소스코드

  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim2);
  HAL_TIM_Base_Start_IT(&htim3);
  HAL_TIM_Base_Start_IT(&htim4);
  /* USER CODE END 2 */
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM2){
		HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
		HAL_TIM_Base_Start_IT(&htim2);
	}else if(htim->Instance==TIM3){
		HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
		HAL_TIM_Base_Start_IT(&htim3);
	}else if(htim->Instance==TIM4){
		HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin);
		HAL_TIM_Base_Start_IT(&htim4);
	}
}
/* USER CODE END 4 */