Bare metal C Ch07 GPIO - Hongjayeong-02/Basic_SoC_implementation GitHub Wiki

Ch07. GPIO

๋ชฉํ‘œ
GPIO code๋ฅผ gpio.c / gpio.h๋กœ ๋ชจ๋“ˆํ™”ํ•˜๊ณ , PB0 LED ์ถœ๋ ฅ๊ณผ PC13 Button ์ž…๋ ฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.


1. ์‚ฌ์šฉ Pin

๊ธฐ๋Šฅ | Pin -- | -- LD1 Green LED | PB0 B1 User Button | PC13

3. BSRR๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

GPIOB->BSRR = (1UL << LED_PIN);

์€ read ์—†์ด ํ•œ ๋ฒˆ์˜ write๋กœ pin์„ setํ•œ๋‹ค.

bit  0~15 : Set
bit 16~31 : Reset

PB0:

GPIOB->BSRR = (1UL << 0);
GPIOB->BSRR = (1UL << 16);

4. ๋ชจ๋“ˆํ™”

main.c  โ†’ ๋ฌด์—‡์„ ํ• ์ง€
gpio.c  โ†’ GPIO๋ฅผ ์–ด๋–ป๊ฒŒ ์ œ์–ดํ• ์ง€
gpio.h  โ†’ ์™ธ๋ถ€์— ๊ณต๊ฐœํ•  interface

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

Ch07_gpio/
โ”œโ”€โ”€ Inc/
โ”‚   โ””โ”€โ”€ gpio.h
โ””โ”€โ”€ Src/
    โ”œโ”€โ”€ gpio.c
    โ””โ”€โ”€ main.c

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

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);

#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 */ }

Src/main.c

#include "gpio.h"

int main(void) { bool btn_state;

led_init();
button_init();

while (1)
{
    btn_state = get_btn_state();

    if (btn_state)
    {
        led_on();
    }
    else
    {
        led_off();
    }
}

}


7. ์ฝ”๋“œ ๋™์ž‘

led_init()

GPIOB clock์„ ์ผœ๊ณ  PB0์„ output์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

led_on()

GPIOB->BSRR = (1UL << LED_PIN);

led_off()

GPIOB->BSRR = (1UL << (LED_PIN + 16));

button_init()

GPIOC clock์„ ์ผœ๊ณ  PC13์„ input/no-pull๋กœ ์„ค์ •ํ•œ๋‹ค.

get_btn_state()

return (GPIOC->IDR & (1UL << BTN_PIN)) != 0U;

PC13 input ์ƒํƒœ๋ฅผ boolean์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


8. Hardware ํ๋ฆ„

B1
โ”‚
โ–ผ
PC13
โ”‚
โ–ผ
GPIOC->IDR
โ”‚
โ–ผ
get_btn_state()
โ”‚
โ”œโ”€ true  โ†’ led_on()
โ”‚
โ””โ”€ false โ†’ led_off()
โ”‚
โ–ผ
GPIOB->BSRR
โ”‚
โ–ผ
PB0
โ”‚
โ–ผ
LD1

9. ์‹ค์Šต ๊ธฐ๋ก

Notion ๊ธฐ๋ก:

text = 800 bytes
data = 0 bytes
bss  = 2560 bytes

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

  • GPIO input์€ IDR๋กœ ์ฝ๋Š”๋‹ค.

  • ์ถœ๋ ฅ set/reset์€ BSRR๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • B1(PC13)์€ project ๊ธฐ๋ก์ƒ active-HIGH๋‹ค.

  • ์ด Chapter๋ถ€ํ„ฐ peripheral driver๋ฅผ .c/.h๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.

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