volatile unsigned int* GPFSELx; GPFSELx = (volatile void *)(io_addr+gpio/10*4); iowrite32(~(7<<(gpio%10*3)) & ioread32(GPFSELx),GPFSELx); iowrite32((config<<(gpio%10*3))|ioread32(GPFSELx),GPFSELx);
时间: 2023-12-18 20:02:20 浏览: 23
这段代码是用来配置 GPIO 口功能的。首先定义了一个指向 GPIO 控制寄存器的指针 GPFSELx,然后通过计算得到要操作的寄存器地址,计算公式是 io_addr+gpio/10*4。其中 io_addr 是 GPIO 控制寄存器的基地址,gpio 是要操作的 GPIO 口编号。然后将 GPFSELx 指向的寄存器的值读取出来,通过位运算将要设置的功能插入到对应的位上,然后将新的值写回到 GPFSELx 指向的寄存器中,实现了 GPIO 口功能的设置。其中 ~(7<<(gpio%10*3)) 用来生成掩码,config<<(gpio%10*3) 用来将要设置的功能插入到对应的位上。
相关问题
void bcm_gpio_cfgpin(unsigned int gpio, unsigned int config) { volatile unsigned int* GPFSELx; GPFSELx = (volatile void *)(io_addr+gpio/10*4); iowrite32(~(7<<(gpio%10*3)) & ioread32(GPFSELx),GPFSELx); iowrite32((config<<(gpio%10*3))|ioread32(GPFSELx),GPFSELx); } void gpio_set_usr(unsigned gpio, int value) { volatile unsigned int* GPSETx; volatile unsigned int* GPCLRx; GPSETx = (volatile void *)(io_addr+0x1C+gpio/32*4); GPCLRx = (volatile void *)(io_addr+0x28+gpio/32*4); if(value) iowrite32(1<<(gpio%32),GPSETx); else iowrite32(1<<(gpio%32),GPCLRx); }
这段代码是用来控制树莓派GPIO口的,第一个函数 bcm_gpio_cfgpin 用来设置 GPIO 口的功能,第二个函数 gpio_set_usr 用来设置 GPIO 口的输出状态。其中,bcm_gpio_cfgpin 函数中的参数 gpio 是要设置的 GPIO 口编号,config 是要设置的功能,例如输入、输出、PWM 等;gpio_set_usr 函数中的参数 gpio 是要控制的 GPIO 口编号,value 是要设置的输出状态,1 表示输出高电平,0 表示输出低电平。
void gpio_set_usr(unsigned gpio, int value) { volatile unsigned int* GPSETx; volatile unsigned int* GPCLRx; GPSETx = (volatile void *)(io_addr+0x1C+gpio/32*4); GPCLRx = (volatile void *)(io_addr+0x28+gpio/32*4); if(value) iowrite32(1<<(gpio%32),GPSETx); else iowrite32(1<<(gpio%32),GPCLRx); }
这段代码是用来控制树莓派GPIO口输出的,其中gpio参数是指定GPIO口编号,value参数是指定输出的电平值(1表示高电平,0表示低电平)。具体实现是通过修改相应的GPSETx和GPCLRx寄存器来设置或清除GPIO口的输出电平。其中,GPSETx寄存器用于设置GPIO口为高电平,GPCLRx寄存器用于清除GPIO口为低电平。通过位运算的方式,可以将要设置或清除的GPIO口对应的位设置为1,从而实现控制GPIO口输出电平的目的。