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에 전원을 켜면 프로그램이 실행됩니다.
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에 전원을 켜면 프로그램이 실행됩니다.
// 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에 전원을 켜면 프로그램이 실행됩니다.
회로도
사용한 전자부품은
실행
이하 실행중인 모습
마지막으로
여러가지 조사해 드디어 L치카 할 수 있었습니다···.
어째서 공식 자료가 BCM2837가 아니고 BCM2835의 데이터 그대로 야넨···.
타이틀은 BCM2837이 되어 있는데・・・.
sleep
라든지 delay
같은 것을 사용할 수있게하려면 아직 공부가 필요하네요.
이 기사의 소스 코드는 Github에 넣어 있기 때문에, 좋으면 부디 ~
RaspberryPiBareMetal
Reference
이 문제에 관하여(Raspberry Pi 3에서 BareMetal 해봤다 ~ L 치카 ~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fireflower0/items/1d313b595819344231ba
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
여러가지 조사해 드디어 L치카 할 수 있었습니다···.
어째서 공식 자료가 BCM2837가 아니고 BCM2835의 데이터 그대로 야넨···.
타이틀은 BCM2837이 되어 있는데・・・.
sleep
라든지 delay
같은 것을 사용할 수있게하려면 아직 공부가 필요하네요.이 기사의 소스 코드는 Github에 넣어 있기 때문에, 좋으면 부디 ~
RaspberryPiBareMetal
Reference
이 문제에 관하여(Raspberry Pi 3에서 BareMetal 해봤다 ~ L 치카 ~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/fireflower0/items/1d313b595819344231ba텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)