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 |