반응형


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


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

https://webnautes.tistory.com/728




이번엔 버튼을 하나 추가하여 버튼을 누른 동안에는 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




반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 ~~

유튜브 구독하기


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

  1. dd 2018.07.03 15:37

    혹시 BCM2837 이용해서 pwm 제어 올려주실수 있을까요?

    datasheet를 봐도 잘 이해가 안되서요..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.07.03 18:06 신고

      avr 카데고리에 있는 pwm 관련 포스팅과 비교하며 데이터시트를 다시 확인 해보면 도움이 될듯합니다...

+ Recent posts