반응형

지난번 올렸던 C언어로 라즈베리파이 3의 LED제어 했던 것에 이어서 글을 올립니다.

 

C언어로 Raspberry Pi 3의 GPIO 레지스터 접근하여 LED켜보기

https://webnautes.tistory.com/1915




이번엔 버튼을 하나 추가하여 버튼을 누른 동안에는 LED가 켜지고 손을 떼면 LED가 꺼지게 됩니다.. 

GPIO18번에 LED가 연결되어 있고 아래 사진처럼  GPIO17번에는 버튼을 연결하고 풀다운저항을 추가했습니다. 





GPFSEL1레지스터를 접근하여 핀을 입력으로 쓸지 출력으로 쓸지 결정해주어야 합니다. 

입력의 경우에 디폴드값이 000이므로 아래 FSEL17는 건드릴 필요가 없습니다. 

LED를 켜야하므로 FSEL18은 001로 해주어 출력으로 해주어야 합니다. 



핀으로부터 입력을 읽어오는 레지스터의 오프셋은 0034입니다.

따라서 이 레지스터의 위치는 GPIO레지스터 시작위치 + 0034가 되겠죠.

하지만 mmap할때 레지스터의 시작위치부터 0이 되버리므로 0034만 알고 있으면 됩니다. 

 




GPIO17번으로 부터 값을 읽어 올거기 때문에 17번 비트의 값이 1인지 여부를 체크하면 됩니다.

버튼을 누르게 되면 5V가 핀으로 입력되기 때문에 해당 핀에 대응되는 비트는 1로 바뀌기 때문입니다. 

 



실행시켜보면 버튼 누를때 마다 LED가 켜집니다. 

 

pi@raspberrypi:~ $ gcc button.c -o button

pi@raspberrypi:~ $ sudo ./button



아래는 전체 소스 코드 입니다.

 

#include <stdlib.h>   
#include <stdio.h>   
#include <sys/types.h>   
#include <sys/stat.h>   
#include <fcntl.h>   
#include <sys/mman.h>   
     
     
#define GPIO_BASE 0x3F200000   
#define GPFSEL1   0x04 
#define GPLEV0    0x34 
#define GPSET0    0x1C 
#define GPCLR0    0x28   
     
     
int main()   
{   
    int fd = open( "/dev/mem", O_RDWR|O_SYNC );   
    if ( fd < 0 ){   
        printf( "can't open /dev/mem \n" );   
        exit(-1);   
    }   
     
     
    char *gpio_memory_map = (char *)mmap( 0, 4096, PROT_READ|PROT_WRITE,   
        MAP_SHARED, fd, GPIO_BASE );   
     
    if ( gpio_memory_map == MAP_FAILED )   
    {   
        printf( " Error : mmap \n" );   
        exit(-1);   
    }   
     
         
    volatile unsigned int* gpio = (volatile unsigned int*)gpio_memory_map;   
 
    gpio[GPFSEL1/4] |= (1<<24);   
     
    while(1)   
    {  
        int input = gpio[GPLEV0/4] & (0x01<<17); 
 
        if ( input > 0 )  
            gpio[GPSET0/4] |= (1<<18);  
        else 
            gpio[GPCLR0/4] |= (1<<18); 
    }   
     
    munmap( gpio_memory_map, 4096);   
 
    return 0;   
}   



마지막 업데이트 2019. 2. 18





반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts