ST/STM32F746DIS

STM32F746G DISCOVERY - TIM(IC, OC, PWM)

engineer4ever 2025. 4. 19. 11:44
 
MCU
STM32F746G DISCOVERY(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
HAL driver를 사용하여 TIMER 다양한 mode를 사용하여 LED를 1Hz(1초에 한번 켜졌다 꺼졌다)로 ON-OFF 한다.

 

TIM2를 사용하는데 TIM2는 APB1 Timer clock = 100MHz

 

1. STM32CubeMX : TIMER Output Compare 설정

- 'Pinout & Configuration' Tab으로 이동

1) Timers - TIM2 선택

2) Channel1 : Output Compare No Output 선택

3) Prescaler : 50000-1

- 100MHz / 50,000 = 2,000 = 2KHz

4) Counter Period : 1000-1

- 2,000 / 1,000 = 2Hz, 0.5s 간격으로 TIM2 Interrupt 발생

5) Output Compare : 100

- OC count가 500이 될때 마다 TIM2 Output Compare Interrupt 발생

6) NVIC : TIM2 global interrupt Enabled

- GENERATE CODE 클릭


- ATOLLIC : main.c 수정

- HAL_TIM_Base_Start_IT, HAL_TIM_OC_Start_IT ; 인터럽트 시작을 위해 추가

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_GFXSIMULATOR_Init();
  MX_USART1_UART_Init();
  MX_RTC_Init();
  MX_TIM6_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim2);
  HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_1);
  /* USER CODE END 2 */
 

- HAL_TIM_PeriodElapsedCallback(), HAL_TIM_OC_DelayElapsedCallback() 작성

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == htim2.Instance)
	{
		HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
	}
}

void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == htim2.Instance)
	{
		HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
	}
}
 

- 0.5s 마다 duty 10%로 LED 점멸

STM32F746 TIMER OC 테스트(LED 점멸)

2. STM32CubeMX : TIMER PWM 설정

- 'Pinout & Configuration' Tab으로 이동

1) TIM2 선택

2) Channel1 : PWM Generation No Output 선택

3) Prescaler : 50000-1

- 100MHz / 50,000 = 2,000 = 2KHz

4) Counter Period : 1000-1

- 2,000 / 1,000 = 2Hz, 0.5s 간격으로 TIM2 Interrupt 발생

5) Output Compare : 900

- Duty 90%

6) NVIC : TIM2 global interrupt Enabled

- GENERATE CODE 클릭

 

- ATOLLIC : main.c 수정

- HAL_TIM_PWM_Start ; 인터럽트 시작을 위해 추가

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_GFXSIMULATOR_Init();
  MX_USART1_UART_Init();
  MX_RTC_Init();
  MX_TIM6_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
  HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_1);
  /* USER CODE END 2 */
 

- HAL_TIM_PWM_PulseFinishedCallback() 작성

- 0.5s 마다 인터럽트가 걸리는데, 인터럽트 걸릴때 마다 토글하게 되있으므로 1s 마다 LED 점멸

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	  if(htim->Instance == htim2.Instance)
	  {
		  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	  }
}
 

 

- 소스를 약간 수정해 본다.

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_GFXSIMULATOR_Init();
  MX_USART1_UART_Init();
  MX_RTC_Init();
  MX_TIM6_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim2);
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
  HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_1);
  /* USER CODE END 2 */
 
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == htim2.Instance)
	{
		HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
	}
}
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	  if(htim->Instance == htim2.Instance)
	  {
		  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
	  }
}
 

- 0.5s 마다 duty 90%로 LED 점멸

STM32F746 TIMER PWM 테스트(LED 점멸)

 

'ST > STM32F746DIS' 카테고리의 다른 글

STM32F746G DISCOVERY - LCD I/F  (0) 2025.04.19
STM32F746G DISCOVERY - SDRAM  (0) 2025.04.19
STM32F746G DISCOVERY - TIMER  (0) 2025.04.19
STM32F746G DISCOVERY - UART(DMA)  (0) 2025.04.19
STM32F746G DISCOVERY - UART(Polling, Interrupt)  (0) 2025.04.19