// Memory Mapped GPIO example // mmgpio.cpp // http:elinux.org/RPi_GPIO_Code_Samples // How to access GPIO registers from C-code on the Raspberry-Pi // Example program // 15-January-2012 // Dom and Gert // Revised: 15-Feb-2013 // Raspberry Pi 1, Raspberry Pi 2, or Raspberry Pi 3 //#define BCM2708_PERI_BASE 0x20000000 /* Pi 1 */ #define BCM2708_PERI_BASE 0x3F000000 /* Pi 2 & Pi 3 */ #define GPIO_BASE (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */ #include #include #include #include #include #define PAGE_SIZE (4*1024) #define BLOCK_SIZE (4*1024) int mem_fd; void *gpio_map; // I/O access volatile unsigned *gpio; // GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x) or SET_GPIO_ALT(x,y) #define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3)) #define OUT_GPIO(g) *(gpio+((g)/10)) |= (1<<(((g)%10)*3)) #define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3)) #define GPIO_SET *(gpio+7) // sets bits which are 1 ignores bits which are 0 #define GPIO_CLR *(gpio+10) // clears bits which are 1 ignores bits which are 0 #define GET_GPIO(g) (*(gpio+13)&(1< bit is 1 <- port is HIGH=3.3V printf("Button pressed!\n"); else // port is LOW=0V printf("Button released!\n"); } int main(int argc, char **argv) { int g,rep; // Set up gpi pointer for direct register access setup_io(); // Switch GPIO 7..11 to output mode /************************************************************************\ * You are about to change the GPIO settings of your computer. * * Mess this up and it will stop working! * * It might be a good idea to 'sync' before running this program * * so at least you still have your code changes written to the SD-card! * \************************************************************************/ // Jim's version - gpio 17 only INP_GPIO(MY_GPIO); // must use INP_GPIO before we can use OUT_GPIO OUT_GPIO(MY_GPIO); for (rep=0; rep<10; rep++) { GPIO_SET = 1<