关于GPIO口分组的问题

时间:2022-04-21 17:55:03
看到GPIOA,GPIOB,GPIOC。。。。。一开始不懂,上网查了后看到说这是GPIO的分组,那GPIO口分组的意义是什么,还有每一组中的内容是什么?我原先理解从字面意思理解的是里面有很多GPIO口,但是看到GPIO_TypeDef* GPIOx这个定义,而GPIO_TypeDef的定义是
typedef struct
{
  __IO uint32_t CRL;       
  __IO uint32_t CRH;        
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;      
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;
这是一组关于寄存器的定义,那GPIO组里面的到底是寄存器还是不同的GPIO口?
刚开始自学,拜托各位了!!!!!

8 个解决方案

#1


先从最基本的理解起, 以51为例, IO口的状态只需要一位就够了, 如果这位置1,那就是输出高,反之则输出1.
那么问题就来了, 
如果有8个IO口,那么其控制位就是8位了, 正好可以凑一个字节.
你问为什么非要凑一个字节? 不是每一位占用一个字节,其余7位闲置?
一是片内reg区域是有限的,能挤在一起就挤在一起, 多出来的空间可以当RAM用
另外很重要的一点是,放在一个字节的话,要对IO进行批量操作的时候会简单很多,比如你要这8个IO同时拉低, 直接向该字节写0就行了,不用一个一个的挨着来.
于是这8个IO口就可以称为一组了,可以记PA,或者PB,PC什么的


引用
这是一组关于寄存器的定义,那GPIO组里面的到底是寄存器还是不同的GPIO口?

你这个问题问的是有问题的,不知道怎么回答

#2


我大概懂了,就是说一个GPIO口可携带的信息量太小无法完成很多功能。
那指向结构体内容的方式就是给一个组中的每个IO口配置一个值然后这一个字节的数据就可以指向一个寄存器是吧?
还有我看书上说IO口通信有等待队列,就是FIFO队列,可以起缓冲作用,那这个FIFO队列在硬件上是怎么实现的?

#3


引用 1 楼 wangfan027 的回复:
引用
这是一组关于寄存器的定义,那GPIO组里面的到底是寄存器还是不同的GPIO口?

你这个问题问的是有问题的,不知道怎么回答


GPIO脚实际是和一个寄存器相连(口寄存器)LZ想向外部输出,都是写这个寄存器,因此,LZ可以认为两者是等效的
但读一般是读脚,不是读该口寄存器

#4


引用 2 楼 zz1559152814 的回复:
我大概懂了,就是说一个GPIO口可携带的信息量太小无法完成很多功能。
那指向结构体内容的方式就是给一个组中的每个IO口配置一个值然后这一个字节的数据就可以指向一个寄存器是吧?
还有我看书上说IO口通信有等待队列,就是FIFO队列,可以起缓冲作用,那这个FIFO队列在硬件上是怎么实现的?

我也不知道了,没留意过IO FIFO

#5


GPIO_TypeDef 定义的是一组I/O的控制寄存器。I/O的配置要通过这些寄存器来进行,比如输入/输出,上拉/下拉,推挽/开漏输出等等。

I/O没有FIFO缓冲的,是通讯模块才有,比如UART,I2C

#6


引用 5 楼 u012586257 的回复:
GPIO_TypeDef 定义的是一组I/O的控制寄存器。I/O的配置要通过这些寄存器来进行,比如输入/输出,上拉/下拉,推挽/开漏输出等等。

I/O没有FIFO缓冲的,是通讯模块才有,比如UART,I2C


那UART,I2C这些也都是属于外设是吧,那肯定也需要和GPIO口连接吧?是不是说通过GPIO数据指向的寄存器实现了FIFO缓冲功能的?

#7


引用 6 楼 zz1559152814 的回复:
Quote: 引用 5 楼 u012586257 的回复:

GPIO_TypeDef 定义的是一组I/O的控制寄存器。I/O的配置要通过这些寄存器来进行,比如输入/输出,上拉/下拉,推挽/开漏输出等等。

I/O没有FIFO缓冲的,是通讯模块才有,比如UART,I2C


那UART,I2C这些也都是属于外设是吧,那肯定也需要和GPIO口连接吧?是不是说通过GPIO数据指向的寄存器实现了FIFO缓冲功能的?

应该说是UART,I2C 这些外设的寄存器实现FIFO,只是输入/输出信号连到了GPIO上

#8


也都是 并列存在的     只是IP的时候只用了一个ip核

#1


先从最基本的理解起, 以51为例, IO口的状态只需要一位就够了, 如果这位置1,那就是输出高,反之则输出1.
那么问题就来了, 
如果有8个IO口,那么其控制位就是8位了, 正好可以凑一个字节.
你问为什么非要凑一个字节? 不是每一位占用一个字节,其余7位闲置?
一是片内reg区域是有限的,能挤在一起就挤在一起, 多出来的空间可以当RAM用
另外很重要的一点是,放在一个字节的话,要对IO进行批量操作的时候会简单很多,比如你要这8个IO同时拉低, 直接向该字节写0就行了,不用一个一个的挨着来.
于是这8个IO口就可以称为一组了,可以记PA,或者PB,PC什么的


引用
这是一组关于寄存器的定义,那GPIO组里面的到底是寄存器还是不同的GPIO口?

你这个问题问的是有问题的,不知道怎么回答

#2


我大概懂了,就是说一个GPIO口可携带的信息量太小无法完成很多功能。
那指向结构体内容的方式就是给一个组中的每个IO口配置一个值然后这一个字节的数据就可以指向一个寄存器是吧?
还有我看书上说IO口通信有等待队列,就是FIFO队列,可以起缓冲作用,那这个FIFO队列在硬件上是怎么实现的?

#3


引用 1 楼 wangfan027 的回复:
引用
这是一组关于寄存器的定义,那GPIO组里面的到底是寄存器还是不同的GPIO口?

你这个问题问的是有问题的,不知道怎么回答


GPIO脚实际是和一个寄存器相连(口寄存器)LZ想向外部输出,都是写这个寄存器,因此,LZ可以认为两者是等效的
但读一般是读脚,不是读该口寄存器

#4


引用 2 楼 zz1559152814 的回复:
我大概懂了,就是说一个GPIO口可携带的信息量太小无法完成很多功能。
那指向结构体内容的方式就是给一个组中的每个IO口配置一个值然后这一个字节的数据就可以指向一个寄存器是吧?
还有我看书上说IO口通信有等待队列,就是FIFO队列,可以起缓冲作用,那这个FIFO队列在硬件上是怎么实现的?

我也不知道了,没留意过IO FIFO

#5


GPIO_TypeDef 定义的是一组I/O的控制寄存器。I/O的配置要通过这些寄存器来进行,比如输入/输出,上拉/下拉,推挽/开漏输出等等。

I/O没有FIFO缓冲的,是通讯模块才有,比如UART,I2C

#6


引用 5 楼 u012586257 的回复:
GPIO_TypeDef 定义的是一组I/O的控制寄存器。I/O的配置要通过这些寄存器来进行,比如输入/输出,上拉/下拉,推挽/开漏输出等等。

I/O没有FIFO缓冲的,是通讯模块才有,比如UART,I2C


那UART,I2C这些也都是属于外设是吧,那肯定也需要和GPIO口连接吧?是不是说通过GPIO数据指向的寄存器实现了FIFO缓冲功能的?

#7


引用 6 楼 zz1559152814 的回复:
Quote: 引用 5 楼 u012586257 的回复:

GPIO_TypeDef 定义的是一组I/O的控制寄存器。I/O的配置要通过这些寄存器来进行,比如输入/输出,上拉/下拉,推挽/开漏输出等等。

I/O没有FIFO缓冲的,是通讯模块才有,比如UART,I2C


那UART,I2C这些也都是属于外设是吧,那肯定也需要和GPIO口连接吧?是不是说通过GPIO数据指向的寄存器实现了FIFO缓冲功能的?

应该说是UART,I2C 这些外设的寄存器实现FIFO,只是输入/输出信号连到了GPIO上

#8


也都是 并列存在的     只是IP的时候只用了一个ip核