์›์‹œ MMIO

๋Œ€๋ถ€๋ถ„์˜ ๋งˆ์ดํฌ๋กœ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ IO๋ฅผ ํ†ตํ•ด ์ฃผ๋ณ€๊ธฐ๊ธฐ์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค. micro:bit์—์„œ LED๋ฅผ ์ผœ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#![no_main]
#![no_std]

extern crate panic_halt as _;

mod interrupts;

use core::mem::size_of;
use cortex_m_rt::entry;

/// GPIO ํฌํŠธ 0 ์ฃผ๋ณ€๊ธฐ๊ธฐ ์ฃผ์†Œ
const GPIO_P0: usize = 0x5000_0000;

// GPIO ์ฃผ๋ณ€๊ธฐ๊ธฐ ์˜คํ”„์…‹
const PIN_CNF: usize = 0x700;
const OUTSET: usize = 0x508;
const OUTCLR: usize = 0x50c;

// PIN_CNF ํ•„๋“œ
const DIR_OUTPUT: u32 = 0x1;
const INPUT_DISCONNECT: u32 = 0x1 << 1;
const PULL_DISABLED: u32 = 0x0 << 2;
const DRIVE_S0S1: u32 = 0x0 << 8;
const SENSE_DISABLED: u32 = 0x0 << 16;

#[entry]
fn main() -> ! {
    // GPIO 0 ํ•€ 21 ๋ฐ 28์„ ํ‘ธ์‹œ-ํ’€ ์ถœ๋ ฅ์œผ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    let pin_cnf_21 = (GPIO_P0 + PIN_CNF + 21 * size_of::<u32>()) as *mut u32;
    let pin_cnf_28 = (GPIO_P0 + PIN_CNF + 28 * size_of::<u32>()) as *mut u32;
    // ์œ ํšจํ•œ ์ฃผ๋ณ€๊ธฐ๊ธฐ ์ œ์–ด ๋ ˆ์ง€์Šคํ„ฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ด๊ณ 
    // ๋ณ„์นญ์ด ์—†์œผ๋ฏ€๋กœ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
    unsafe {
        pin_cnf_21.write_volatile(
            DIR_OUTPUT
                | INPUT_DISCONNECT
                | PULL_DISABLED
                | DRIVE_S0S1
                | SENSE_DISABLED,
        );
        pin_cnf_28.write_volatile(
            DIR_OUTPUT
                | INPUT_DISCONNECT
                | PULL_DISABLED
                | DRIVE_S0S1
                | SENSE_DISABLED,
        );
    }

    // ํ•€ 28์„ ๋‚ฎ๊ฒŒ, ํ•€ 21์„ ๋†’๊ฒŒ ์„ค์ •ํ•˜์—ฌ LED๋ฅผ ์ผญ๋‹ˆ๋‹ค.
    let gpio0_outset = (GPIO_P0 + OUTSET) as *mut u32;
    let gpio0_outclr = (GPIO_P0 + OUTCLR) as *mut u32;
    // ์œ ํšจํ•œ ์ฃผ๋ณ€๊ธฐ๊ธฐ ์ œ์–ด ๋ ˆ์ง€์Šคํ„ฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ด๊ณ 
    // ๋ณ„์นญ์ด ์—†์œผ๋ฏ€๋กœ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
    unsafe {
        gpio0_outclr.write_volatile(1 << 28);
        gpio0_outset.write_volatile(1 << 21);
    }

    loop {}
}
  • GPIO 0 ํ•€ 21์€ LED ๋งคํŠธ๋ฆญ์Šค์˜ ์ฒซ ๋ฒˆ์งธ ์—ด์— ์—ฐ๊ฒฐ๋˜๊ณ  ํ•€ 28์€ ์ฒซ ๋ฒˆ์งธ ํ–‰์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.

cargo embed --bin mmio