我真的很难理解数据表部分[BCM2835-ARM-Peripherals.pdf],其中涉及以下内容:
Q1:每个gpio有40个寄存器[参考:表6-1 GPIO寄存器分配]所有gpios都可以使用SET / CLEAR / GPFSEL [0-5]等,但GPIO的用途是什么功能选择寄存器,有10个FSEL(0-9)寄存器[参见:表6-2 - GPIO备用功能选择寄存器0]。
Q2:如何通过内存映射区域到达给定的GPIO? ,就像下面这样 情况#1:具有备用功能5的GPIO4作为输入: as(4< 10)它将使用“0x7E200000”和FSEL4寄存器[参见:表6-2 - GPIO备用功能选择寄存器0]具有000和010 = GPIO引脚9采用备用功能5。
情况#2:GPIO27具有备用功能3作为输出: as(27 <30)它将使用“0x7E20000C”和FSEL3寄存器[参见:表6-2 - GPIO备用功能选择寄存器0]具有001和111 = GPIO引脚9采用备用功能5.
请告诉我我的理解是否正确?
问题3:下表的目的是什么
表6-3 - GPIO备用功能选择寄存器1 表6-4 - GPIO备用功能选择寄存器2 表6-5 - GPIO备用功能选择寄存器3 表6-6 - GPIO备用功能选择寄存器4 表6-7 - GPIO备用功能选择寄存器5
BR, &安培; Sanumala
答案 0 :(得分:1)
http://elinux.org/RPi_GPIO_Code_Samples
//
// Set up a memory regions to access GPIO
//
void setup_io()
{
/* open /dev/mem */
if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) {
printf("can't open /dev/mem \n");
exit(-1);
}
/* mmap GPIO */
gpio_map = mmap(
NULL, //Any adddress in our space will do
BLOCK_SIZE, //Map length
PROT_READ|PROT_WRITE,// Enable reading & writting to mapped memory
MAP_SHARED, //Shared with other processes
mem_fd, //File to map
GPIO_BASE //Offset to GPIO peripheral
);
close(mem_fd); //No need to keep mem_fd open after mmap
if (gpio_map == MAP_FAILED) {
printf("mmap error %d\n", (int)gpio_map);//errno also set!
exit(-1);
}
// Always use volatile pointer!
gpio = (volatile unsigned *)gpio_map;
} // setup_io