pi gpio 内存映射 自带led闪烁示例

文章介绍了如何使用pigpio库在树霉开发板上通过/dev/mem和/dev/gpiomem进行GPIO内存映射,强调了/dev/gpiomem无需root权限的优点,并展示了如何控制GPIO16LED的闪烁操作。
摘要由CSDN通过智能技术生成

树霉pi gpio内存映射
/dev/mem 需root权限
/dev/gpiomem 不需要

#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdlib.h>

#define BCM2837_PERI_BASE  0x3F000000
#define BCM2835_PERI_BASE  0x20000000 
#define GPIO_BASE   (BCM2835_PERI_BASE + 0x200000)
#define PAGE_SIZE 4096
int main() {
        char* fname = "/dev/gpiomem";
        int fd = open(fname,O_RDWR);
        printf("fd = %d\n", fd);

        unsigned int * adr =  mmap(0,PAGE_SIZE,PROT_READ | PROT_WRITE,MAP_SHARED,fd,GPIO_BASE);
        printf("gpio addr %p\n",adr);
		// manipulate 
        munmap(adr,PAGE_SIZE);
        close(fd);
}

闪烁自带led
gpio16

#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>

#define BCM2837_PERI_BASE  0x3F000000
#define BCM2835_PERI_BASE  0x20000000 
#define GPIO_BASE   (BCM2835_PERI_BASE + 0x200000)
#define PAGE_SIZE 4096
// int offset 4byte 
#define SEL0 0 //gpio0-9
#define SEL1 1 //gpio10-19
#define SET0 7 
#define SET1 8 
#define CLR0 10  
#define CLR1 11
#define LEDPIN 16   // builtin status led pin gpio num
int main() {
        char* fname = "/dev/gpiomem";
        int fd = open(fname,O_RDWR);
        printf("fd = %d\n", fd);

        uint32_t*  adr  =  mmap(0,PAGE_SIZE,PROT_READ | PROT_WRITE,MAP_SHARED,fd,GPIO_BASE);
        printf("gpio addr %p\n",adr);

		unsigned int offset = LEDPIN / 10;
		unsigned int shift = (LEDPIN % 10) * 3;         
        *(adr + SEL0 + offset) &= ~(0x7<< shift); //clear gpio 16  mode   (16-10)*3  
        *(adr + SEL0 + offset) |= (1 << shift); // set gpio 16 as output
        offset = LEDPIN /32;
        shift = LEDPIN % 32;
        for(int i = 0; i < 10; i++) {
                *(adr+SET0 +offset) = (1 << shift);  // set gpio16 1
                usleep(300*1000);
                *(adr+CLR0 +offset) = (1 << shift);  // set gpio16 0
                usleep(300*1000);
        }

        munmap(adr,PAGE_SIZE);
        close(fd);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yvee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值