비글본 블랙 P8의 2번과 8번에 LED를 연결하고 10번핀에는 스위치를 아래 회로처럼 연결했습니다.

스위치를 눌러서 Gpio2_4인 10번핀에 5V가 흐르게 되면 Gpio2_3인 10번핀의 값을 5V(?)로 변경해서 LED가 켜지도록 해보았습니다.

 





 

이미지 출처 : http://www.ctrlinux.com/blog/?p=87

 

 

AM335x Sitara™ Processors데이터 시트의 Memory Map에서 확인한 GPIO2 시작 주소는 0x481AC000이고 크기는 4K입니다.

 

GPIO를 입력으로 사용할지 출력으로 사용할지 결정하기 위해서 필요한 레지스터로 원하는 비트를 0으로 설정하면 출력상태가 되고 디폴트 값은 입력입니다. LED가 연결되어 있는 8번핀은 출력상태로 만들고 스위치가 연결되어 있는 10번핀은 입력상태로 만들었습니다.

 

GPIO 출력 핀의 값을 설정하기 위해서 사용되는 레지스터입니다. 1로 세팅하면 LED가 켜지고 0으로 세팅하면 LED가 꺼지게 됩니다.

 

10번핀에 5V가 흐르면 해당되는 레지스트의 비트가 1로 세팅됩니다.

 

전체 소스코드입니다.

  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3. #include <sys/types.h>  
  4. #include <sys/stat.h>  
  5. #include <fcntl.h>  
  6. #include <sys/mman.h>  
  7.     
  8.     
  9. #define GPIO2_BASE 0x481AC000  
  10. #define GPIO_OE 0x134  
  11. #define GPIO_OUT 0x13c  
  12. #define GPIO_IN 0x138  
  13.     
  14. #define PIN8 (1<<3)  
  15. #define PIN10 (1<<4)  
  16.     
  17.     
  18. int main()  
  19. {  
  20.     system("echo 5 > /sys/class/gpio/export");  
  21.     system("echo 65 > /sys/class/gpio/export");  
  22.     system("echo 105 > /sys/class/gpio/export");  
  23.     
  24.     int fd = open( "/dev/mem", O_RDWR|O_SYNC );  
  25.     if ( fd < 0 ){  
  26.         printf( "can't open /dev/mem \n" );  
  27.         exit(-1);  
  28.     }  
  29.     
  30.     
  31.     char *gpio_memory_map = (char *)mmap( 0, 4096, PROT_READ|PROT_WRITE,  
  32.         MAP_SHARED, fd, GPIO2_BASE );  
  33.     
  34.     if ( gpio_memory_map == MAP_FAILED )  
  35.     {  
  36.         printf( " Error : mmap \n" );  
  37.         exit(-1);  
  38.     }  
  39.     
  40.         
  41.     volatile unsigned int* gpio = (volatile unsigned int*)gpio_memory_map;  
  42.     gpio[GPIO_OE/4] &= (~PIN8);  
  43.     
  44.     
  45.     while(1){  
  46.         int pin = gpio[GPIO_IN/4] & PIN10;  
  47.     
  48.         if ( pin != 0 )  
  49.             gpio[GPIO_OUT/4] |= PIN8;  
  50.         else  
  51.             gpio[GPIO_OUT/4] &= (~PIN8);  
  52.     
  53.         sleep(1);  
  54.     }  
  55.     
  56.     
  57.     munmap( gpio_memory_map, 4096);  
  58.     
  59.     return 0;  
  60. }  


포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

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

유튜브 구독하기


후원계좌 카카오뱅크 3355112417955

+ Recent posts