STM32

STM32F407VE - 기초 7) Timer

찬영_00 2024. 11. 25. 14:29

Timer를 한번 다루어 보겠다.

폴링과 인터럽트로 해보겠다.

 

폴링은 인터럽트만 체크하지 않으면 됨을 이전 포스팅에서 계속 다루었다.

 

이렇게 하고, LED하나를 달아 점등하게 했다. 그리고 이것을 오실로스코프를 찍어본 결과이다.

코드는 다음과 같다.

  HAL_TIM_Base_Start(&htim6);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	if(__HAL_TIM_GET_FLAG(&htim6, TIM_FLAG_UPDATE))
	{
	  __HAL_TIM_CLEAR_IT(&htim6, TIM_IT_UPDATE);
	  HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
	}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 

 

 

우리가 설정한대로 100ms다마 신호를 보내고 있음을 알 수 있다.

 

다음으로 인터럽트로 알아보자

인터럽트는 NVIC Setting에 가서 체크만 해주면 된다.

인터럽트를 활성화 한뒤 코드를 입력하자

 

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM6)
  {
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
  }
}

/*
int __io_putchar(int ch){
	HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, 0xFFFF);
	return ch;
}*/

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim6);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

 

똑같이 동작함을 알수 있다.

 

그럼 2개의 타이머를 사용하여 점등을 하나는 0.1초 신호 하나는 0.5초마다 신호를 주게 해보겠다.

그럼 하나의 타이머는 0.1초에 한 펄스니, 총 5펄스, 약 2~3번 깜빡일때 0.5초 마다 신호를 받는 LED가 1번 깜빡일것이다.

먼저 LED의 GPIO를 OUTPUT해준다.

 

그리고 타이머를 2개 설정한다.

 

위 처럼 설정해주고, 전부 NVIC에서 인터럽트를 활성화해주자

일단 우리가 84MHz를 사용중이다.

84,000,000Hz / 840 = 100KHz로 낮추어 진다.
그리고 10,000은 100,000에서 10,000을 나누면 10이 된다.
따라서 한번 카운트 하는데 걸리는 시간은 1/10, 0.1초가 된다.
50000은 당연히 0.5초가 될것이다.

 

이렇게 클럭을 주기를 만들어주고, 저장한다.

 

코드는 다음과 같다.

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM6)
  {
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
  }
  else if(htim->Instance == TIM7)
  {
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
  }
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM6_Init();
  MX_TIM7_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim6);
  HAL_TIM_Base_Start_IT(&htim7);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 

https://youtube.com/shorts/3t3lq4Fr1RE?feature=share

 

 

다른 방식으로 주기를 변경할 수 있다.

  while (1)
  {
	TIM7->ARR = 10000;
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 

 

 

'STM32' 카테고리의 다른 글

RTC사용해보기  (0) 2024.11.26
I2C로 LCD 제어해보기  (0) 2024.11.25
MCU Internal 온도 측정하기  (0) 2024.11.24
STM32F407VE - 기초 6) ADC-2  (0) 2024.11.24
STM32F407VE - 기초 5) ADC  (0) 2024.11.23