STM32F103 Timer(Counter Mode)
(feat. open103V)
STM32F103 칩 안에는 여러개의 타이머가 있다. 각 타이머는 아래 DataSheet의 내용과 같이 16bit로 동작한다.
타이머의 기능을 살펴보면 여러가지 모드가 있는데 가장 기본적인 Counter Mode(Upcounting & Downcounting)에 대하여 살펴본다.
1초 단위로 카운터를 세는 일부 코드는 아래와 같다.
static void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 72-1;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1000-1;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK) {
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) {
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) {
Error_Handler();
}
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM2) {
__HAL_RCC_TIM2_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM2_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
}
}
int main(void)
{
uint32_t time2CounterTemp = 0;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_TIM2_Init();
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
while (1) {
if (time2Counter%1000 == 0) {
if (time2CounterTemp != time2Counter) {
printf("%d\r\n", time2Counter/1000);
time2CounterTemp = time2Counter;
}
}
}
}
void TIM2_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim2);
time2Counter++;
}
NVIC(Nested vectored interrupt controller)에 TIM2의 인터럽트를 확인해 보면 28번에 할당되어 있음을 아래와 같이 알 수 있다.
TIM2를 사용하려면 클럭을 인가해 줘야하는데 블록도를 보면 APB1 클럭버스에 물려있는것을 알 수 있다.
따라서 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE)
이렇게 클럭신호를 넣어준다.
NVIC 설정중에 TIM2_IRQn
이라는 값을 사용하는데 Define된 값을 살펴보면 위에서 확인한 바와 같이 28번으로 정의되어 있다.
STM32F103 칩에서 APB1 Timer clock은 아래와 같이 72MHz 이다.
타이머의 prescaler 와 period를 구하는 식은 아래와 같다. 아래와 같은 식으로 계산하면 1msec 주기로 타이머 인터럽트가 발생하게 된다.
위에서 계산한 값을 반영하여 STM32CubeMx 에서 TIM2에 관한 설정은 아래와 같다.
위 그림에서 Prescaler과 Period 값에서 -1을한 이유는 아래 타이밍도와 같이 프리스케일이 3일때 0부터 시작하여 3을 넣으면 4개가 한세트가 되는 것을 알 수 있다. 그럼으로 -1을한 값을 설정해준다.
모든 타이머 설정이 끝나면 아래와 같이 타이머 인터럽트 시작함수를 main에서 호출하여 타이머를 시작해주면 된다.
[개발노트] SPI Slave 모드에서 BSY Flag 에러 (0) | 2020.04.17 |
---|---|
STM32 PWM 모드 사용하기 (1) | 2019.03.07 |
TLC5947 24-Channel, 12-Bit PWM LED Driver (0) | 2019.02.21 |
애노드와 캐소드 차이점(Anode Cathod) (0) | 2019.02.20 |
Open103V(STM32F103VET) 비트맵 파일 다루기 (0) | 2019.02.01 |