MCU
STM32F103(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
HAL driver를 사용하여 TIMER로 LED를 1Hz(1초에 한번 켜졌다 꺼졌다)로 ON-OFF 한다.

 

TIMER6은 외부 출력이 없는 내부 타이머. 사용에 앞서 TIM6의 기본 clock이 얼마인지 확인해야 한다. TIMER6은 APB1에 연결 되어 있음을 확인 할 수 있다.

APB1 Timer clock = 64MHz

 

1. STM32CubeMX : TIMER 설정

- 'Pinout & Configuration' Tab으로 이동

1) TIM6 선택

2) Activated에 체크

3) Prescaler : 3200-1

- 64MHz / 3,200 = 20,000 = 20KHz

4) Counter Period : 10000-1

- 1/20,000 * 10,000 = 0.5s 마다 인터럽트 발생

5) TIM6 global interrupt : Enbled

- GENERATE CODE 클릭


2. ATOLLIC : main.c 수정

- HAL_TIM_Base_Start_IT (&htim6); 인터럽트 시작을 위해 추가

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_RTC_Init();
MX_USART1_UART_Init();
MX_TIM6_Init();
MX_TIM7_Init();
/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1,(uint16_t*)&(adc_val[0]),3);
HAL_TIM_Base_Start_IT (&htim6);
HAL_TIM_Base_Start_IT (&htim7);
/* USER CODE END 2 */
 

- ATOLLIC : stm32f1xx_it.c 수정

- void TIM6_IRQHandler(void) 수정

- CubeMX 설정에서 0.5초마다 인터럽트가 걸리게 설정하였고 인터럽트 핸들러에서 매 인터럽트 마다 포트를 토글 하므로 1초마다 LED가 깜박임.

void TIM6_IRQHandler(void)
{
  /* USER CODE BEGIN TIM6_IRQn 0 */

  /* USER CODE END TIM6_IRQn 0 */
  HAL_TIM_IRQHandler(&htim6);
  /* USER CODE BEGIN TIM6_IRQn 1 */
  //TIM6->ARR = 10000;
  HAL_GPIO_TogglePin(LED_WDT_GPIO_Port, LED_WDT_Pin);
  /* USER CODE END TIM6_IRQn 1 */
}
 

직접 인터럽트 핸들러를 수정하는 방법도 있고 callback 함수를 추가하는 방법도 있으나, 여기서는 TIM6가 내부 인터럽트만 존재하므로(한가지) 인터럽트 핸들러를 수정하였음.

 

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

STM32F103C8 - RTC(Systick handler)  (0) 2025.08.08
STM32F103C8 - PWM  (0) 2025.08.08
STM32F103C8 - ADC(DMA)  (0) 2025.08.08
STM32F103C8 - ADC(Interrupt)  (0) 2025.08.08
STM32F103C8 - ADC(Polling)  (1) 2025.08.08
 
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

 

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

 

TIMER6은 외부 출력이 없는 내부 타이머. 사용에 앞서 TIM6의 기본 clock이 얼마인지 확인해야 한다. TIMER6은 APB1에 연결 되어 있음을 확인 할 수 있다.

Bus
Boundary address
Peripheral

APB1
0x4000 8000 - 0x4000 FFFF
Reserved
0x4000 7C00 - 0x4000 7FFF
UART8
0x4000 7800 - 0x4000 7BFF
UART7
0x4000 7400 - 0x4000 77FF
DAC
0x4000 7000 - 0x4000 73FF
PWR
0x4000 6C00 - 0x4000 6FFF
HDMI-CEC
0x4000 6800 - 0x4000 6BFF
CAN2
0x4000 6400 - 0x4000 67FF
CAN1
0x4000 6000 - 0x4000 63FF
I2C4
0x4000 5C00 - 0x4000 5FFF
I2C3
0x4000 5800 - 0x4000 5BFF
I2C2
0x4000 5400 - 0x4000 57FF
I2C1
0x4000 5000 - 0x4000 53FF
UART5
0x4000 4C00 - 0x4000 4FFF
UART4
0x4000 4800 - 0x4000 4BFF
USART3
0x4000 4400 - 0x4000 47FF
USART2
0x4000 4000 - 0x4000 43FF
SPDIFRX
0x4000 3C00 - 0x4000 3FFF
SPI3 / I2S3
0x4000 3800 - 0x4000 3BFF
SPI2 / I2S2
0x4000 3400 - 0x4000 37FF
Reserved
0x4000 3000 - 0x4000 33FF
IWDG
0x4000 2C00 - 0x4000 2FFF
WWDG
0x4000 2800 - 0x4000 2BFF
RTC & BKP Registers
0x4000 2400 - 0x4000 27FF
LPTIM1
0x4000 2000 - 0x4000 23FF
TIM14
0x4000 1C00 - 0x4000 1FFF
TIM13
0x4000 1800 - 0x4000 1BFF
TIM12
0x4000 1400 - 0x4000 17FF
TIM7
0x4000 1000 - 0x4000 13FF
TIM6
0x4000 0C00 - 0x4000 0FFF
TIM5
0x4000 0800 - 0x4000 0BFF
TIM4
0x4000 0400 - 0x4000 07FF
TIM3
0x4000 0000 - 0x4000 03FF
TIM2

 

​APB1 Timer clock = 100MHz

1. STM32CubeMX : TIMER 설정

- 'Pinout & Configuration' Tab으로 이동

1) TIM6 선택

2) Activated에 체크

3) Prescaler : 10000-1

- 100MHz / 5,000 = 20,000 = 20KHz

4) Counter Period : 10000-1

- 1/20,000 * 10,000 = 0.5s 마다 인터럽트 발생

5) TIM6 global interrupt : Enbled

- GENERATE CODE 클릭


- ATOLLIC : main.c

- HAL_TIM_Base_Start_IT (&htim6); 인터럽트 시작을 위해 추가

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_RTC_Init();
  MX_GFXSIMULATOR_Init();
  MX_USART1_UART_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT (&htim6);
  /* USER CODE END 2 */
 

- ATOLLIC : stm32f1xx_it.c 수정

- void TIM6_IRQHandler(void) 수정

- CubeMX 설정에서 0.5초마다 인터럽트가 걸리게 설정하였고 인터럽트 핸들러에서 매 인터럽트 마다 포트를 토글 하므로 1초마다(1Hz) LED가 깜박임.

void TIM6_DAC_IRQHandler(void)
{
  /* USER CODE BEGIN TIM6_DAC_IRQn 0 */

  /* USER CODE END TIM6_DAC_IRQn 0 */
  HAL_TIM_IRQHandler(&htim6);
  /* USER CODE BEGIN TIM6_DAC_IRQn 1 */
  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
  /* USER CODE END TIM6_DAC_IRQn 1 */
}
 

직접 인터럽트 핸들러를 수정하는 방법도 있고 callback 함수를 추가하는 방법도 있으나, 여기서는 TIM6가 내부 인터럽트만 존재하므로(한가지) 인터럽트 핸들러를 수정하였음.

STM32F746 TIMER 테스트(LED 점멸)

 

+ Recent posts