Bare metal C Ch09 TIM - Hongjayeong-02/Basic_SoC_implementation GitHub Wiki

Ch09. ๋ฒ”์šฉ ํƒ€์ด๋จธ (TIM)

ํ•œ ์ค„ ์š”์•ฝ: TIM2๋ฅผ ์‚ฌ์šฉํ•ด 1 Hz Update Event๋ฅผ ๋งŒ๋“ค๊ณ , UIF ํ”Œ๋ž˜๊ทธ๋ฅผ ํด๋งํ•ด LD1์„ 1์ดˆ ์ฃผ๊ธฐ๋กœ ํ† ๊ธ€ํ•œ๋‹ค.

1. ํ•ต์‹ฌ ์ด๋ก 

SysTick๊ณผ TIM์˜ ์ฐจ์ด

Ch08์˜ SysTick์€ Cortex-M ์ฝ”์–ด์— ํฌํ•จ๋œ ๊ณตํ†ต ํƒ€์ด๋จธ์ด๊ณ , TIM์€ STM32๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฒค๋” ์ฃผ๋ณ€์žฅ์น˜๋‹ค. STM32F439์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ TIM์ด ์กด์žฌํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์ธ delay๋ฟ ์•„๋‹ˆ๋ผ PWM, Input Capture, Output Compare, Encoder ๋“ฑ์˜ ๊ธฐ๋Šฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ญ๋ชฉ | SysTick | TIM2 -- | -- | -- ์†Œ์† | Cortex-M ์ฝ”์–ด | STM32 peripheral ๊ฐœ์ˆ˜ | 1๊ฐœ | ์—ฌ๋Ÿฌ TIM ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์นด์šดํ„ฐ | 24-bit down counter | TIM2๋Š” 32-bit ์ƒํƒœ ํ”Œ๋ž˜๊ทธ | COUNTFLAG | UIF ์ด๋ฒˆ ์‹ค์Šต | SysTick polling | TIM2 Update Event polling

1 Hz ๊ณ„์‚ฐ

Notion ์ •๋ฆฌ์—์„œ๋Š” APB1 timer clock์„ 16 MHz๋กœ ๋‘๊ณ  ๋‹ค์Œ ๊ฐ’์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

UEV frequency
= Timer Clock / ((PSC + 1) ร— (ARR + 1))

PSC = 1599 ARR = 9999

16,000,000 / (1600 ร— 10000) = 1 Hz

PSC์™€ ARR ๋ชจ๋‘ 0๋ถ€ํ„ฐ ์„ธ๋ฏ€๋กœ ๊ณ„์‚ฐ์—๋Š” +1์ด ๋“ค์–ด๊ฐ„๋‹ค.

UIF๋Š” ์ง์ ‘ clear

TIM์˜ UIF๋Š” ํ•œ ๋ฒˆ set๋œ ๋’ค ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์ง์ ‘ clearํ•ด์•ผ ํ•œ๋‹ค.

TIM2->SR &= ~SR_UIF;

์ด๋ฅผ ์ƒ๋žตํ•˜๋ฉด ์ฒซ Update Event ์ดํ›„ while (!(TIM2->SR & SR_UIF))๊ฐ€ ๊ณ„์† ๋ฐ”๋กœ ํ†ต๊ณผํ•œ๋‹ค.

2. ๋™์ž‘ ํ๋ฆ„

RCC->APB1ENR
โ”‚
โ””โ”€ TIM2 clock enable
โ”‚
โ–ผ
PSC = 1599
โ”‚
โ–ผ
ARR = 9999
โ”‚
โ–ผ
CEN = 1
โ”‚
โ–ผ
TIM2 counting
โ”‚
โ–ผ
Update Event ๋ฐœ์ƒ
โ”‚
โ–ผ
UIF = 1
โ”‚
โ–ผ
LED toggle
โ”‚
โ–ผ
UIF ์ง์ ‘ clear

3. ์‹ค์ œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ


Ch09_tim/

โ”œโ”€โ”€ Inc/gpio.h

โ”œโ”€โ”€ Src/gpio.c

โ”œโ”€โ”€ Inc/tim.h

โ”œโ”€โ”€ Src/tim.c

โ”œโ”€โ”€ Src/main.c

syscalls.c, sysmem.c, startup file, linker script, CubeIDE metadata/build output์€ Ch04์—์„œ ๋‹ค๋ฃฌ ๊ณตํ†ต ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ ์ด ํŽ˜์ด์ง€์—์„œ๋Š” ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. ์•„๋ž˜์—๋Š” ์ด chapter ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ์ง์ ‘ ์‚ฌ์šฉํ•œ source/header๋ฅผ ์ „๋ถ€ ๊ธฐ๋กํ•œ๋‹ค.

4. ์ „์ฒด ์ฝ”๋“œ

Inc/gpio.h

#ifndef GPIO_H
#define GPIO_H

#include <stdbool.h>

/* ---- LED (PB0, LD1 ๋…น์ƒ‰) ---- */ void led_init(void); void led_on(void); void led_off(void);

/* ---- Push Button (PC13, B1) ---- */ void button_init(void); bool get_btn_state(void);

void led_toggle(void); /* Ch08์—์„œ ์ถ”๊ฐ€ */

#endif /* GPIO_H */

Src/gpio.c

#include "stm32f4xx.h"
#include "gpio.h"

#define LED_PIN 0U /* PB0 = LD1 (๋…น์ƒ‰) / #define BTN_PIN 13U / PC13 = B1 */

void led_init(void) { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;

GPIOB-&gt;MODER &amp;= ~(0x3UL &lt;&lt; (LED_PIN * 2));
GPIOB-&gt;MODER |=  (0x1UL &lt;&lt; (LED_PIN * 2));

}

void led_on(void) { GPIOB->BSRR = (1UL << LED_PIN); /* Set */ }

void led_off(void) { GPIOB->BSRR = (1UL << (LED_PIN + 16)); /* Reset */ }

void button_init(void) { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;

GPIOC-&gt;MODER &amp;= ~(0x3UL &lt;&lt; (BTN_PIN * 2));  /* Input */
GPIOC-&gt;PUPDR &amp;= ~(0x3UL &lt;&lt; (BTN_PIN * 2));  /* No pull (๋ณด๋“œ๊ฐ€ ์ž์ฒด ์ฒ˜๋ฆฌ) */

}

bool get_btn_state(void) { return (GPIOC->IDR & (1UL << BTN_PIN)) != 0U; /* active-HIGH */ }

void led_toggle(void) { GPIOB->ODR ^= (1UL << 0); /* PB0 = LD1 */ }

Inc/tim.h

#ifndef TIM_H_
#define TIM_H_

#include "stm32f4xx.h"

#define SR_UIF (1U << 0)

void tim2_1hz_init(void);

#endif /* TIM_H_ */

Src/tim.c

#include "tim.h"

#define TIM2EN (1U << 0) #define CR1_CEN (1U << 0)

void tim2_1hz_init(void) { RCC->APB1ENR |= TIM2EN;

TIM2-&gt;PSC = 1600 - 1;   /* 16MHz -&gt; 10kHz */
TIM2-&gt;ARR = 10000 - 1;  /* 10kHz -&gt; 1์ดˆ */
TIM2-&gt;CNT = 0;
TIM2-&gt;CR1 = CR1_CEN;

}

Src/main.c

#include "gpio.h"
#include "tim.h"

int main(void) { led_init(); tim2_1hz_init();

while (1)
{
    led_toggle();

    while (!(TIM2-&gt;SR &amp; SR_UIF)) { }
    TIM2-&gt;SR &amp;= ~SR_UIF;
}

}

5. ๊ฒ€์ฆ ๊ธฐ๋ก

Notion ๊ธฐ๋ก ๊ธฐ์ค€:

text = 764 bytes
data = 0 bytes
bss  = 2560 bytes
warning ์—†์Œ

์ด ํŽ˜์ด์ง€์˜ Notion ๊ธฐ๋ก์—๋Š” build ๊ฒฐ๊ณผ๊ฐ€ ์ •๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋ณ„๋„์˜ ์‹ค์ œ ๋ณด๋“œ ๋™์ž‘ ๊ฒฐ๊ณผ ๋ฌธ๊ตฌ๋Š” ๊ธฐ๋ก๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

6. ํ•ต์‹ฌ ์ •๋ฆฌ

  • TIM ์ฃผ๊ธฐ๋Š” Timer Clock / ((PSC+1)*(ARR+1))๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.

  • TIM์˜ UIF๋Š” software์—์„œ ์ง์ ‘ clearํ•œ๋‹ค.

  • TIM์€ SysTick๊ณผ ๋‹ฌ๋ฆฌ STM32 peripheral์ด๋ฉฐ ์—ฌ๋Ÿฌ timer์™€ PWM/Input Capture ๊ธฐ๋Šฅ์œผ๋กœ ํ™•์žฅ๋œ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ