前提


芯片引脚数量


  STM32F103ZET6为:144脚芯片。一共有7组IO口(GPIOA~GPIOG),每组IO口有16个IO(PA0 ~ PA16),共计16*7=112个IO.
在这里插入图片描述
   STM32的大部分引脚除了当GPIO使用外,还有一些特殊功能
   1、端口复用功能:所谓复用,就是一些端口不仅仅可以做为通用IO口,还可以复用为一些外设引脚,比如PA9,PA10可以复用为STM32的串口1引脚。
   作用:最大限度的利用端口资源。
在这里插入图片描述
   2、端口重映射功能:就是可以把某些功能引脚映射到其他引脚。 比如串口1默认引脚是PA9,PA10可以通过配置重映射映射到PB6,PB7
  作用:方便布线
在这里插入图片描述
   3、所有IO口都可以作为中断输入


GPIO工作方式(8种)


  4种输入模式:


     输入浮空:GPIO_Mode_IN_FLOATING
     输入上拉:GPIO_Mode_IPU
     输入下拉:GPIO_Mode_IPD
     模拟输入:GPIO_Mode_AIN


  4种输出模式:


     开漏输出:GPIO_Mode_Out_OD
(开漏,就等于输出口接了个NPN三极管,并且只接了e,b. c极 是开路的,你可以接一个电阻到3.3V,也可以接一个电阻到5V,这样,在输出1的时候,就可以是5V电压,也可以是3.3V电压了.但是不接电阻上拉的时候,这个输出高就不能实现了. )
(只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)

     开漏复用功能:GPIO_Mode_AF_OD
     推挽式输出:GPIO_Mode_Out_PP
(推挽,就是有推有拉,任何时候IO口的电平都是确定的,不需要外接上拉或者下拉电阻. )
(推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。 )
(可以输出强高低电平,连接数字器件

     推挽式复用功能:GPIO_Mode_AF_PP


  3种最大翻转速度:


     -2MHZ
     -10MHz
     -50MHz
参考网址:http://www.openedv.com/posts/list/21980.htm(有空在回来看)


GPIO基本结构


在这里插入图片描述


GPIO的输入工作模式1—输入浮空模式


在这里插入图片描述


GPIO的输入工作模式2—输入上拉模式


在这里插入图片描述


GPIO的输入工作模式3—输入下拉模式


在这里插入图片描述


GPIO的输入工作模式4—模拟模式


在这里插入图片描述


GPIO的输出工作模式1—开漏输出模式


在这里插入图片描述


GPIO的输出工作模式2—开漏复用输出模式


在这里插入图片描述


GPIO的输出工作模式3—推挽输出模式


在这里插入图片描述


GPIO的输出工作模式4—推挽复用输出模式


在这里插入图片描述
上电复位后,GPIO默认为浮空状态,部分特殊功能引脚为特定状态。
在这里插入图片描述


GPIO相关配置寄存器


  是每组IO口含下面7个寄存器。也就是7个寄存器,一共可以控制一组GPIO的16个IO口。


  每组GPIO端口的寄存器包括:
    两个32位配置寄存器(GPIOx_CRL ,GPIOx_CRH) ,
    两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR),
    一个32位置位/ 复位寄存器(GPIOx_BSRR),
    一个16位复位寄存器(GPIOx_BRR),
    一个32位锁定寄存器(GPIOx_LCKR)。
每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)
两个32位配置寄存器,每个IO口只需要4位,64/4=16个IO。


    - GPIOx_CRL :端口配置低寄存器
    - GPIOx_CRH:端口配置高寄存器
    - GPIOx_IDR:端口输入寄存器
    - GPIOx_ODR:端口输出寄存器
    - GPIOx_BSRR:端口位设置/清除寄存器
     - GPIOx_BRR :端口位清除寄存器
    - GPIOx_LCKR:端口配置锁存寄存器


端口配置低寄存器(GPIOx_CRL)


在这里插入图片描述
  已知配置寄存器为32位,两位为一个空格。可分为上图的16个空格,每两个空格(4位)设置IO口,寄存器CRL可控制0~7的口,下面寄存器CRH可控制8 ~15的口。
  具体的位根据不同的数值可设置为不同的模式,根据上下图可知。
  根据图可知,上下拉电阻是根据寄存器ODR进行设置的。
在这里插入图片描述


端口配置高寄存器(GPIOx_CRH)


在这里插入图片描述
在这里插入图片描述


端口输入数据寄存器(GPIOx_IDR)


在这里插入图片描述
  每一组IO都有这样的一个寄存器(一组16个IO口),输入数据寄存器IDR(控制IO口输入)是32位,低16位的每位都是代表的对应组的IO口,输入为0则对应IO口输入为低电平,输入为1则对应IO口输入为高电平。


端口输出数据寄存器(GPIOx_ODR)


在这里插入图片描述
在这里插入图片描述
  当为输出模式时,每一组IO都有这样的一个寄存器(一组16个IO口),输出数据寄存器ODR(控制IO口输出)是32位,低16位的每位都是代表的对应组的IO口,输出为0则对应IO口输出为低电平,输出为1则对应IO口输出为高电平。
  当为输入模式时,用寄存器ODR进行设置上拉电阻还是下拉电阻。


端口位设置/清除寄存器(GPIOx_BSRR)


在这里插入图片描述
  该寄存器也是用来设置IO口的高低电平。
  BSRR寄存器低16位,对应位设置为1,那么IO扣输出为高电平,对应位设置为0,对应IO口不产生任何影响。
  高16位作用相反。
  可查看开漏输出模式的原理图,通过寄存器BSRR来间接设置寄存器ODR
可知道我们只需要设置为0则不产生任何影响的作用就是可以帮助我们简单的单独对应引脚的高低电平且不对其他引脚有影响


端口位清除寄存器(GPIOx_BRR)


在这里插入图片描述
  寄存器BRR低16位的作用与寄存器BSRR高16位的作用是一样的,所以一般我们都是用寄存器BRR和寄存器BSRR两个的低16位进行设置。