Raspberry Pi 3에서 BareMetal 해봤다 ~ L 치카 ~

6036 단어 Raspberrypi3Baremetal

소개



지난번 환경 구축을 할 수 있었으므로, 전자 공작의 정평 L치카를 해 보고 싶습니다.

사용할 레지스터 정보



L 치카하기 위해 GPFSEL, GPSET, GPCLR 라는 3 개의 레지스터를 사용합니다.
이 레지스터에 대한 자세한 내용은 다음 문서의 90 페이지 당 참조됩니다.

BCM2837 ARM Peripherals

그러나이 문서에서는 BCM2835 데이터가 남아 있기 때문에 기본 주소를 0x7E000000에서 0x3F000000로 읽어야합니다.
6 페이지 근처에 그것 같은 것이 쓰여있다 ...?

이하, 간략하게 설명

GPFSEL (GPIO Function Select)



GPIO의 기능을 설정하는 레지스터
문서 90페이지의 표에서 GPFSEL0 ~ GPFSEL5의 6개의 레지스터가 있음을 알 수 있습니다.

이번에는 GPIO16을 사용하므로 GPFSEL1 레지스터의 FSEL16 비트를 Output (0b001)으로 설정합니다.
문서 92페이지의 Table 6-3 – GPIO Alternate function select register 1를 참조하십시오.

프로그램으로 하면 다음과 같이 됩니다.
#define GPFSEL1 *(volatile unsigned int *)0x3F200004
GPFSEL1 = 0x01 << 18; // 18〜20ビットがFSEL16

GPSET / GPCLR



GPIO 출력을 설정하는 레지스터 (자세한 내용은 95 페이지 참조)
GPSET에서 출력을 High로, GCPLR에서 Low로 각각 설정합니다.
레지스터의 각 비트가 GPIO 핀에 해당하므로 GPIO16을 High로 설정하면 다음과 같은 코드가됩니다.
#define GPSET0  *(volatile unsigned int *)0x3F20001C
GPSET0 = 0x01 << 16;

GPIO16을 Low로 하는 경우는 다음과 같은 코드가 됩니다.
#define GPCLR0  *(volatile unsigned int *)0x3F200028
GPCLR0 = 0x01 << 16;

프로그램



L치카 프로그램은 다음과 같습니다.
현 단계에서는 sleep 라든지 delay 아무것도 사용할 수 없기 때문에, 적당히 루프 돌려 고리 누르고 있습니다・・・.

main.c
// RaspberryPi3 Memory Mapped I/O Base Address
#define MMIO_BASE 0x3F000000

// Memory Mapped I/O
#define IOREG(X)  (*(volatile unsigned int *) (X))

// GPIO16 control register
#define GPFSEL1 IOREG(MMIO_BASE + 0x00200004)  // GPIO Function Select
#define GPSET0  IOREG(MMIO_BASE + 0x0020001C)  // GPIO16 High
#define GPCLR0  IOREG(MMIO_BASE + 0x00200028)  // GPIO16 Low

// Sleep count
#define MAX_CNT 3000000

///
// Main Function

void main(void){
    volatile unsigned int i;

    // ピンに割り当てられた機能をGPIOに設定する
    GPFSEL1 = 0x01 << 18;

    while(1){
        GPSET0 = 0x01 << 16;           // GPIO16 High
        for(i = 0; i < MAX_CNT; i++);  // Sleep
        GPCLR0 = 0x01 << 16;           // GPIO16 Low
        for(i = 0; i < MAX_CNT; i++);  // Sleep
    }
}

컴파일



마지막 환경 설정이 제대로 만들어지면 make 명령을 실행하기 만하면 컴파일 할 수 있다고 생각합니다.
나중에, "kernel8.img"를 다음 파일과 함께 FAT32 포맷 SD 카드에 넣고 Raspberry Pi 3에 전원을 켜면 프로그램이 실행됩니다.
  • bootcode.bin (부트 로더)
  • start.elf (펌웨어)
  • config.txt (구성 파일)

  • 회로도



    사용한 전자부품은
  • 적색 LED
  • 저항 330Ω (주황색 다금)



  • 실행



    이하 실행중인 모습



    마지막으로



    여러가지 조사해 드디어 L치카 할 수 있었습니다···.
    어째서 공식 자료가 BCM2837가 아니고 BCM2835의 데이터 그대로 야넨···.
    타이틀은 BCM2837이 되어 있는데・・・.
    sleep 라든지 delay 같은 것을 사용할 수있게하려면 아직 공부가 필요하네요.

    이 기사의 소스 코드는 Github에 넣어 있기 때문에, 좋으면 부디 ~
    RaspberryPiBareMetal

    좋은 웹페이지 즐겨찾기