【STM32】GPIO的工作原理和配置

news2024/11/26 22:37:26

目录

  • 一、GPIO是什么?
  • 二、GPIO的8种工作模式
    • 1. 浮空输入模式(GPIO_Mode_IN_FLOATING)
    • 2. 上拉输入模式(GPIO_Mode_IPU)
    • 3. 下拉输入模式(GPIO_Mode_IPD)
    • 4. 模拟输入模式(GPIO_Mode_AIN)
    • 5. 开漏输出模式(GPIO_Mode_Out_OD)
    • 6. 开漏复用输出模式(GPIO_Mode_AF_OD)
    • 7. 推挽输出模式(GPIO_Mode_Out_PP)
    • 8. 推挽复用输出模式(GPIO_Mode_AF_PP)
  • 三、GPIO寄存器
    • 1. GPIO端口模式寄存器(GPIOx_MODER)
    • 2. GPIO端口输出类型寄存器(GPIOx_OTYPER)
    • 3. GPIO端口输出速度寄存器(GPIOx_OSPEEDR)
    • 4. GPIO端口上拉/下拉寄存器(GPIOx_PUPDR)
    • 5. 端口输入数据寄存器(GPIOx_IDR)
    • 6. 端口输出数据寄存器(GPIOx_ODR)
    • 7. 端口置位/复位寄存器(GPIOx_BSRR)
    • 8. 端口配置锁定寄存器(GPIOx_LCKR)
    • 9. 复用功能寄存器(GPIOx_AFRL、GPIOx_AFRH)



一、GPIO是什么?

  GPIO,全称为General Purpose Input Output Ports(通用输入输出端口),也就是通用IO口。

  GPIO是控制或者采集外部器件的信息的外设,可以由软件程序控制,用于输出或者输入高低电平。

  GPIO的使用非常广泛。可以与硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。

  GPIO按组分配,每组16个I/O口,组数视芯片而定。
  以STM32F429IGT6为例:
    ① 一共有9组IO,PA~PI。
    ② 一共有140个IO口,其中PA~PH每组有16个IO,PI只有12个IO口。

  注意:芯片的数据手册中,引脚标注为 FT 的,是可以兼容 5V 电平的。

ST官方提供的GPIO基本结构图

GPIO基本结构图


二、GPIO的8种工作模式

  8种工作模式,分为4种输入模式和4种输出模式。

1. 浮空输入模式(GPIO_Mode_IN_FLOATING)

  浮空输入模式下,上拉/下拉电阻为断开状态,施密特触发器为开启状态,I/O引脚的输出功能被禁止。

  该模式下,外部的电平信号通过①(I/O引脚)进入MCU,先经过②(施密特触发器)的整形后,再进入③(输入数据寄存器),最后MCU可以在④(输入数据寄存器的另一端)随时读取I/O引脚的电平。
  即,整形后的I/O引脚的电平信号直接进入输入数据寄存器,MCU直接读取I/O引脚的电平。

  如果I/O引脚无输入时,MCU读取到的电平状态是不确定的。所以引脚不建议悬空,易受干扰。
  如果I/O引脚输入高电平时,MCU读取到高电平1。
  如果I/O引脚输入低电平时,MCU读到低电平0。

  总结,浮空输入模式:
    I/O引脚输入什么电平信号,MCU就读取到什么电平信号;
    无信号输入(默认)时,MCU读取到的电平信号是不确定的。

  浮空输入模式,可以用于KEY识别,RX1等。

浮空输入模式

2. 上拉输入模式(GPIO_Mode_IPU)

  上拉输入模式下,上拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。
  GPIO的内部上拉电阻的阻值较大,所以通过内部上拉输出的电流是很弱的,即“弱电流”。
  如果需要大电流用作电流型驱动输出,还是要用外部上拉电阻。

  上拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个上拉电阻,将电位拉高,比如拉到VCC。

  如果I/O引脚无输入时,I/O引脚处相当于断开,上拉电阻的电流直接流向④,MCU读取到高电平1。
  如果I/O引脚输入高电平时,I/O引脚的电压等于VDD的电压,电流还是流向④,MCU读取到高电平1。
  如果I/O引脚输入低电平时,I/O引脚处相当于接地,上拉电阻的电流直接流向I/O引脚,MCU读到低电平0。

  总结,上拉输入模式:
    无信号输入(默认)或输入高电平时,MCU都是读取到高电平1;
    输入低电平时,MCU读取到低电平0。

  上拉输入模式,可以用于按键检测。

上拉输入模式

3. 下拉输入模式(GPIO_Mode_IPD)

  下拉输入模式下,下拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。

    下拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个下拉电阻,将电位拉低,比如拉到GND。

  如果I/O引脚无输入时,I/O引脚处相当于断开,I/O引脚的电压等于VSS的电压,MCU读取到低电平0。
  如果I/O引脚输入高电平时,由于下拉电阻阻值比通道④的阻值大,所以电流流向④,MCU读取到高电平1。
  如果I/O引脚输入低电平时,I/O引脚处相当于接地,I/O引脚的电压等于VSS的电压,MCU读到低电平0。

  总结,下拉输入模式:
    无信号输入(默认)或输入低电平时,MCU都是读取到低电平0;
    输入高电平时,MCU读取到高电平1。

  下拉输入模式,和上拉输入模式相似,可以用于按键检测。

下拉输入模式

4. 模拟输入模式(GPIO_Mode_AIN)

  模拟模式下,上拉/下拉电阻为断开状态,施密特触发器为关闭状态,输出部分的双MOS管也断开。

  模拟输入模式下,外部的电平信号通过①(I/O引脚的模拟输入通道)进入MCU,MCU可以直接在③(模拟输出口)随时读取I/O引脚的电平。

  由于施密特触发器断开,所以电信号也无法进入输入数据寄存器,所以MCU无法在“输入数据寄存器”中读取到有效的数据。

  总结,模拟输入模式:
    输入的电信号为模拟电压信号,而不是数字电平信号。
    模拟输入的模拟电压信号,直接送到片上外设,一般是ADC。
    除了 ADC 和 DAC 要将 I/O 配置为模拟通道之外,其他外设功能一律要配置为复用功能模式。

  模拟输入模式,可以用于ADC采集或DAC输出,或者低功耗下省电。

模拟输入模式

5. 开漏输出模式(GPIO_Mode_Out_OD)

  开漏输出模式下,P-MOS管一直处于断开状态。

  开漏输出模式下,MCU通过左边的①(位设置/清除寄存器)或(输出数据寄存器)写入数据后,该数据位将通过②(输出控制电路)传送到④(I/O引脚)。
  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态。

  当MCU输出低电平0时,经过“非门”后,转换为高电平1,N-MOS管导通,使I/O引脚输出低电平。
  当MCU输出高电平1时,经过“非门”后,转换为低电平0,N-MOS管断开,I/O引脚处于悬空状态,此时I/O引脚输出的电平高低是由I/O引脚外部的上拉或者下拉决定。

  开漏输出,输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对较强,一般20mA以内。

开漏输出模式

6. 开漏复用输出模式(GPIO_Mode_AF_OD)

  GPIO可以是通用的IO口功能,还可以是其他外设的特殊功能引脚,这就是GPIO的复用功能。

  GPIO复用为其他外设,输出数据寄存器无效,④(I/O引脚)输出的高低电平由①(其他外设的输出)决定。
  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态,同时外设可以读取IO引脚的信息。

  开漏复用输出模式与开漏输出模式的配置基本相同,除了输出信号的来源不同,其他与开漏输出模式的功能相同。
  即,②(输出控制电路)的输入,开漏输出模式是由输出数据寄存器输出,开漏复用输出模式是由其他外设输出。

开漏复用输出模式

7. 推挽输出模式(GPIO_Mode_Out_PP)

  推挽输出模式,从结果上看它会输出低电平VSS或者高电平VDD。推挽输出跟开漏输出不同的是,推挽输出模式P-MOS管和N-MOS管都用上,可以把“输出控制”简单地等效为一个非门。

  当MCU输出低电平0时,经过“非门”后,转换为高电平1,P-MOS管截止,N-MOS管导通,使I/O引脚下拉到VSS,即I/O引脚输出低电平。
  当MCU输出高电平1时,经过“非门”后,转换为低电平0,P-MOS管导通,N-MOS管截止,使I/O引脚上拉到VDD,即I/O引脚输出高电平。
  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态。

  总结,推挽输出模式下,P-MOS管和N-MOS管同一时间只能有一个MOS管是导通的。当引脚高低电平切换时,两个管子轮流导通,一个负责灌电流,一个负责拉电流,使其负载能力和开关速度都有很大的提高。

  由于推挽输出模式输出高电平时,是直接连接VDD,所以驱动能力较强,可以做电流型驱动,驱动电流最大可达25mA。该模式也是最常用的输出模式。

推挽输出模式

8. 推挽复用输出模式(GPIO_Mode_AF_PP)

  GPIO可以是通用的IO口功能,还可以是其他外设的特殊功能引脚,这就是GPIO的复用功能。

  GPIO复用为其他外设,输出数据寄存器无效,④(I/O引脚)输出的高低电平由①(其他外设的输出)决定。
  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态,同时外设可以读取IO引脚的信息。

  推挽复用输出模式与推挽输出模式的配置基本相同,除了输出信号的来源不同,其他与推挽输出模式的功能相同。
  即,②(输出控制电路)的输入,推挽输出模式是由输出数据寄存器输出,推挽复用输出模式是由其他外设输出。

推挽复用输出模式


三、GPIO寄存器

  每组GPIO的寄存器包括:

    配置寄存器:
      一个端口模式寄存器(GPIOx_MODER)
      一个端口输出类型寄存器(GPIOx_OTYPER)
      一个端口输出速度寄存器(GPIOx_OSPEEDR)
      一个端口上拉下拉寄存器(GPIOx_PUPDR)

    数据寄存器:
      一个端口输入数据寄存器(GPIOx_IDR)
      一个端口输出数据寄存器(GPIOx_ODR)

    置位/复位寄存器:
      一个端口置位/复位寄存器(GPIOx_BSRR)

    锁存寄存器:
      一个端口配置锁存寄存器(GPIOx_LCKR)

    复用功能共寄存器:
      两个复用功能寄存器(低位GPIOx_AFRL & 高位GPIOx_AFRH)


  注意:
    ① 每组GPIO由10个寄存器组成,如果芯片有 GPIOA ~ GPIOI 9个组,那么一共有对应90个寄存器。

    ② 如果配置一个I/O口需要2个位,那么刚好32位寄存器配置一组16个I/O口。

    ③ 如果配置一个I/O口只需要1个位,一般高16位保留。

    ④ BSRR寄存器32位分为低16位BSRRL和高16位BSRRH,
      BSRRL配置一组16个I/O口的置位状态(1),
      BSRRH配置一组16个I/O口的复位状态(0)。

    ⑤ rw表示可读可写;r表示只可读;w表示只可写;Res.表示保留位,必须保持复位值。

配置8种工作模式
GPIO 工作模式模式寄存器
MODER[0:1]
输出类型寄存器
OTYPER
输出速度寄存器
OSPEEDR[0:1]
上拉/下拉寄存器
PUPDR[0:1]
输入浮空00 - 输入模式无效无效

00 - 无上拉或下拉

输入上拉

01 - 上拉

输入下拉

10 - 下拉

模拟功能11 - 模拟模式

00 - 无上拉或下拉

开漏输出01 - 通用输出1 - 开漏输出

00 - 低速
01 - 中速
10 - 高速
11 - 超高速

00 - 无上拉或下拉
01 - 上拉
10 - 下拉
11 - 保留

推挽输出0 - 推挽输出
开漏式复用功能10 - 复用功能1 - 开漏输出
推挽式复用功能0 - 推挽输出

1. GPIO端口模式寄存器(GPIOx_MODER)

  该寄存器是GPIO的模式控制寄存器,用于控制GPIO的工作模式。
  该寄存器共32位,每2个位控制1个I/O口。

  以 GPIOA = 0xABFFFFFF 为例:
    ① 低16位的值是FFFF,都是1,即 PA0 ~ PA7 默认都是模拟模式。
    ② 高16位的值是0xABFF,即 PA8 ~ PA12 是模拟模式,PA13 ~ PA15 是复用功能模式。

31302928272625242322212019181716
MODER15[1:0]MODER14[1:0]MODER13[1:0]MODER12[1:0]MODER11[1:0]MODER10[1:0]MODER9[1:0]MODER8[1:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
MODER7[1:0]MODER6[1:0]MODER5[1:0]MODER4[1:0]MODER3[1:0]MODER2[1:0]MODER1[1:0]MODER0[1:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

位 2y+1:2y MODERy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)
         这些位通过软件写入,用于配置 I/O 模式。
          00:输入模式(复位状态)
          01:通用输出模式
          10:复用功能模式
          11:模拟模式


2. GPIO端口输出类型寄存器(GPIOx_OTYPER)

  该寄存器用于控制GPIO的输出类型,仅用于输出模式,在输入模式(MODER[1:0] = 00 / 11 时)下不起作用。
  该寄存器的低16位有效,每1个位控制1个I/O口。

  复位后,该寄存器的值均为0,即I/O口在输出模式下默认为推挽输出。

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
OT15OT14OT13OT12OT11OT10OT9OT8OT7OT6OT5OT4OT3OT2OT1OT0
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

位 31:16 :保留,必须保持复位值。

位 15:0  OTy:端口x配置位(Port x configuration bits)(y=0…15)
       这些位通过软件写入,用于配置 I/O 输出类型。
        0:推挽输出(复位状态)
        1:开漏输出


3. GPIO端口输出速度寄存器(GPIOx_OSPEEDR)

  该寄存器用于控制GPIO的输出速度,仅用于输出模式,在输入模式(MODER[1:0] = 00 / 11 时)下不起作用。
  该寄存器共32位,每2个位控制1个I/O口。

  复位后,该寄存器的值均为0,即I/O口在输出模式下默认为推挽输出。

31302928272625242322212019181716
OSPEEDR15 [1:0]OSPEEDR14 [1:0]OSPEEDR13 [1:0]OSPEEDR12 [1:0]OSPEEDR11 [1:0]OSPEEDR10 [1:0]OSPEEDR9 [1:0]OSPEEDR8 [1:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
OSPEEDR7 [1:0]OSPEEDR6 [1:0]OSPEEDR5 [1:0]OSPEEDR4 [1:0]OSPEEDR3 [1:0]OSPEEDR2 [1:0]OSPEEDR1 [1:0]OSPEEDR0 [1:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

位 2y+1:2y OSPEEDRy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)
         这些位通过软件写入,用于配置 I/O 输出速度。
          00:低速 ( 2MHz)
          01:中速 ( 25MHz)
          10:高速 ( 50MHz)
          11:超高速(100MHz)
         注:  有关 OSPEEDRy 位以及 V D D V_{DD} VDD 范围和外部负载的值,请参见产品数据手册。


4. GPIO端口上拉/下拉寄存器(GPIOx_PUPDR)

  该寄存器用于控制GPIO的上拉/下拉。
  该寄存器共32位,每2个位控制1个I/O口。

  复位后,该寄存器的值一般为0,即无上拉或下拉。

31302928272625242322212019181716
PUPDR15 [1:0]PUPDR14 [1:0]PUPDR13 [1:0]PUPDR12 [1:0]PUPDR11 [1:0]PUPDR10 [1:0]PUPDR9 [1:0]PUPDR8 [1:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
PUPDR7 [1:0]PUPDR6 [1:0]PUPDR5 [1:0]PUPDR4 [1:0]PUPDR3 [1:0]PUPDR2 [1:0]PUPDR1 [1:0]PUPDR0 [1:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

位 2y+1:2y PUPDRy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)
         这些位通过软件写入,用于配置 I/O 上拉或下拉。
          00:无上拉或下拉
          01:上拉
          10:下拉
          11:保留


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

  该寄存器用于控制GPIO的输入高电平或者低电平。
  该寄存器的低16位有效,每1个位控制1个I/O口。

  该寄存器是只读权限,当CPU读访问该寄存器时:
    如果对应的某位为0,则表示设置该I/O口输入的是低电平;
    如果对应的某位为1,则表示设置该I/O口输入的是高电平。

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
IDR
15
IDR
14
IDR
13
IDR
12
IDR
11
IDR
10
IDR
9
IDR
8
IDR
7
IDR
6
IDR
5
IDR
4
IDR
3
IDR
2
IDR
1
IDR
0
rrrrrrrrrrrrrrrr

位 31:16 :保留,必须保持复位值。

位 15:0  :IDRy:端口输入数据(Port input data)(y=0…15)
        这些位为只读。它们包含相应 I/O 端口的输入值。


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

  该寄存器用于控制GPIO的输出高电平或者低电平。
  该寄存器的低16位有效,每1个位控制1个I/O口。

  当CPU写访问该寄存器时:
    如果对应的某位写0,则表示设置该I/O口输出的是低电平;
    如果对应的某位写1,则表示设置该I/O口输出的是高电平。

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
ODR
15
ODR
14
ODR
13
ODR
12
ODR
11
ODR
10
ODR
9
ODR
8
ODR
7
ODR
6
ODR
5
ODR
4
ODR
3
ODR
2
ODR
1
ODR
0
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

位 31:16 :保留,必须保持复位值。

位 15:0  :ODRy:端口输出数据(Port output data)(y=0…15)
      这些位可通过软件读取和写入。
      注: 对于原子置位/复位,通过写入 GPIOx_BSRR 或 GPIOx_BRR 寄存器,可分别置位和/或复位 ODR 位(x=A…F)。


7. 端口置位/复位寄存器(GPIOx_BSRR)

  该寄存器也用于控制GPIO的输出高电平或者低电平。

  BSRR寄存器32位有效。
    对于低16位(0 ~ 15):
      我们往相应的位写1,那么对应的IO口会输出高电平;
      我们往相应的位写0,对IO口没有任何影响。
    对于高16位(16 ~ 31)作用刚好相反:
      我们往相应的位写1,那么对应的IO口会输出低电平;
      我们往相应的位写0,对IO口没有任何影响。

  总结:
    对于BSRR寄存器,写0时,对I/O口电平无影响。
    如需输出高电平,则将对应的BS位写1;
    如需输出低电平,则将对应的BR位写1。

  ODR寄存器和BSRR寄存器的不同之处:
    ODR是可读可写权限,而BSRR是只写权限。
    ODR寄存器,我们要设置某个IO口电平,我们首先需要读出来ODR寄存器的值,然后对整个ODR寄存器重新赋值来达到设置某个或者某些IO口的目的。
    BSRR寄存器,我们就不需要先读,而是直接设置即可,这在多任务实时操作系统中作用很大。
    BSRR寄存器比ODR寄存器更好的地方,就是BSRR寄存器改变引脚状态的时候,不会被中断打断。而ODR寄存器有被中断打断的风险。

31302928272625242322212019181716
BR15BR14BR13BR12BR11BR10BR9BR8BR7BR6BR5BR4BR3BR2BR1BR0
wwwwwwwwwwwwwwww
1514131211109876543210
BS15BS14BS13BS12BS11BS10BS9BS8BS7BS6BS5BS4BS3BS2BS1BS0
wwwwwwwwwwwwwwww

位 31:16 BRy:端口x复位位y(Port x reset bit y)(y=0…15)
        这些位为只写。读取这些位可返回值 0x0000。
         0:不会对相应的 ODRx 位执行任何操作
         1:复位相应的 ODRx 位
        注:  如果同时对 BSx 和 BRx 置位,则 BSx 的优先级更高。

位 15:0  BSy:端口x置位位y(Port x set bit y)(y=0…15)
        这些位为只写。读取这些位可返回值 0x0000。
         0:不会对相应的 ODRx 位执行任何操作
         1:置位相应的 ODRx 位


8. 端口配置锁定寄存器(GPIOx_LCKR)

  该寄存器的每个锁定位冻结一个特定的配置寄存器(控制寄存器和复用功能寄存器)。

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.LCKK
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.rw
1514131211109876543210
ODR
15
ODR
14
ODR
13
ODR
12
ODR
11
ODR
10
ODR
9
ODR
8
ODR
7
ODR
6
ODR
5
ODR
4
ODR
3
ODR
2
ODR
1
ODR
0
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

位 31:17 :保留,必须保持复位值。

位 16 LCKK:锁定键(Lock key)
     可随时读取此位。可使用锁定键写序列对其进行修改。
      0:端口配置锁定键未激活
      1:端口配置锁定键已激活。在下一次 MCU 复位或外设复位之前,GPIOx_LCKR 寄存器始终处于锁定状态。

位 15:0  LCKy:端口x锁定位y(Port x lock bit y)(y=0…15)
        这些位都是读/写位,但只能在 LCKK 位等于 “0” 时执行写操作。
         0:端口配置未锁定
         1:端口配置已锁定


9. 复用功能寄存器(GPIOx_AFRL、GPIOx_AFRH)

  该寄存器分为高位AFRH和低位AFRL,分别控制16位,即分别控制8个I/O口。

  复用功能寄存器有2个,都是32位有效的寄存器,分高位(AFRH)和低位(AFRL)。复用器采用16路复用功能输入AF0~AF15,通过GPIOx_AFRL(引脚 0~7)、GPIOx_AFRH(引脚 8~15)寄存器对复用功能输入进行配置,每四位控制1路复用。

  I/O口并不能随意复用功能,而是有规定的,可以通过查阅数据手册来获取每个I/O引脚的复用功能。

31302928272625242322212019181716
AFR7[3:0]AFR6[3:0]AFR5[3:0]AFR4[3:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
AFR3[3:0]AFR2[3:0]AFR1[3:0]AFR0[3:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

位 31:0  AFRy[3:0]:端口x引脚y的复用功能选择(Alternate function selection for port x pin y)(y=0…7)
        这些位通过软件写入,用于配置复用功能 I/O 。

        AFSELy 选择:
         0000:AF0             1000:AF8
         0001:AF1             1001:AF9
         0010:AF2             1010:AF10
         0011:AF3             1011:AF11
         0100:AF4             1100:AF12
         0101:AF5             1101:AF13
         0110:AF6             1110:AF14
         0111:AF7             1111:AF15


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kubernetes学习之路--BadPods(Part2)

在我看来,现在关于k8s的攻击面很小,除了容器逃逸,敏感信息和配置不当,很难有其他有效的横向移动的手段了吧,反正据我了解暂时是这样子的,慢慢积累吧还是。 回顾一下Pod中那几项不安全的配置 : …

原地起飞,华为内部都在强推的435页网络协议文档,附讲解

#为什么要学习网络协议? 相信大家都听过通天塔的故事,上帝为了阻止人类联合起来,让人类说不同的语言,人类没法沟通,达不成“协议”,通天塔的计划就失败了。 但是千年以后,有一种叫“程序猿”的…

基于VBA实现电缆结构自动出图(三) —— 多芯线

大家敢相信吗,原来VBA竟然可以实现电缆结构自动出图,换句话说,只要输入数据,VBA会自动将电缆的结构画出来,同时还可以渲染,结果竟然不输画图软件,真真让我刮目相看。这里我就不过多介绍VBA了&am…

重点| 系统集成项目管理工程师考前50个知识点(5)

本文章总结了系统集成项目管理工程师考试背记50个知识点!!! 帮助大家更好的复习,希望能对大家有所帮助 比较长,放了部分,需要可私信!! 30、活动之间的四种依赖关系: 强…

[附源码]Node.js计算机毕业设计高校互联网班级管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

Redis 压力测试 服务监控

Redis 压力测试 & 服务监控 Redis 压力测试 Redis 安装成功后,会在 /usr/local/bin/目录下生成redis-benchmark压测工具。该工具模拟N个客户端同时执行Redis指令,默认提供一组默认测试参数,用户可以自定义其属性,更改测试行…

java开发必备技能:mysql

mysql 架构 连接器 mysql的连接器负责处理mysql客户端的连接请求及维护连接。 传输协议 mysql支持多种传输协议,不同的平台可以选择不同的协议: 连接压缩控制 mysql建立的连接可以对客户端和服务器之间的流量进行压缩,以减少通过连接发…

Rock派(基于瑞芯微RK3308B)开发记录-上篇

本文作者:Linux兵工厂,一个嵌入式软件领域的攻城狮。欢迎指教公一众-号:Linux兵工厂,获取硬核Linux资料和文章 前言 根据项目需求并且经过各方面评估最终选择了这款Rock Pi(Rock派)系列中的Rock Pi S产品。正式它的各方面的特性…

马士兵-郑金维—并发编程—6.JUC并发工具

JUC并发工具 一、CountDownLatch应用&源码分析 1.1 CountDownLatch介绍 CountDownLatch就是JUC包下的一个工具,整个工具最核心的功能就是计数器。 如果有三个业务需要并行处理,并且需要知道三个业务全部都处理完毕了。 需要一个并发安全的计数器来操作。 CountDown…

Web大学生网页作业成品 :黑色主题个人博客网站设计与实现(HTML+CSS+JavaScript)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

基于java+springmvc+mybatis+vue+mysql的农业信息管理系统

项目介绍 农业信息的需求和管理上的不断提升,农业信息管理的潜力将无限扩大,农业信息管理系统在业界被广泛关注,本系统对此进行总体分析,将农业信息管理的发展提供参考。农业信息管理系统对农业信息有着明显的带动效应&#xff0…

【统一融合:拉普拉斯算子:GAN框架】

UIFGAN: An unsupervised continual-learning generative adversarial network for unified image fusion (UIFGAN:一个无监督不断学习生成对抗网络统一的图像融合) 本文提出了一种新的无监督连续学习生成对抗网络(UIFGAN)用于统…

阿里资深架构师熬夜纯手写的238页微服务容器化开发实战笔记

本文将分为目录、主要内容和大牛对本文的高度评价三部分组成,因为内容比较多,小编只能把部分知识点和目录拿出来给大家介绍,希望大家能够理解!!! 本文目录 本文包括的主要内容 微服务和 Docker容器技术是目…

怎么安装 Arch Linux?

Arch Linux 是一个 x86-64 通用发行版,它流行于那些喜欢 DIY Linux 系统的用户和 Linux 铁杆粉丝当中。 本文导航 ◈ 如何安装 Arch Linux11% ◈ 安装 Arch Linux 的条件:14% ◈ 第一步:下载 ISO 文件18% ◈ 第二步:创建一个 …

磨金石教育摄影技能干货分享|世界顶级的手机摄影作品欣赏

随着手机像素越来越高,拍照功能越来越完善,手机摄影成为了越来越多人的首选,大家不再执着于单反相机。手机的方便与简捷更受非专业人士的青睐。 每到一个地方,见到不同的景色和人文,我们都可以随手掏出手机记录这些美好…

前端模板-2【vue部分小功能】

前端模板【vue部分小功能】 1 Vue部分模板 1.1 vue实现store【存储当前选中页面】 我的习惯用法,大家可自行调整【以存储当前页面名称为例】 ①在src下新建文件夹store,并创建configure.js、index.js configure.js const configure {state: {HOST: h…

LeetCode 每日一题——1945. 字符串转化后的各位数字之和

1.题目描述 1945. 字符串转化后的各位数字之和 给你一个由小写字母组成的字符串 s ,以及一个整数 k 。 首先,用字母在字母表中的位置替换该字母,将 s 转化 为一个整数(也就是,‘a’ 用 1 替换,‘b’ 用 …

React 入门:实战案例 TodoList 底部功能实现

文章目录目标实现效果实现已完成和全部数量统计和显示实现全选和全不选实现清除已完成功能完整代码App 组件完整代码Footer 组件完整代码通过前面的章节已经完成 TodoList 的增删改的功能,本文我们来实现底部相关功能:已完成和全部数量实时统计&#xff…

【Linux】文件系统/inode/软硬链接

目录 一.了解磁盘 1.磁盘的概念 2.磁盘的物理结构 3.磁盘的逻辑结构 4.磁盘区域的划分 二.linux文件系统 三.inode 四.软硬链接 1.软链接 2.硬链接 一.了解磁盘 前言: 一般情况下, 系统中存在大量的未被打开的文件, 这些文件全部存储在磁盘上, 也简称磁盘级文件 在li…

功能测试进阶自动化测试,一个女测试工的坎坷之路

绝大多数测试工程师都是从功能测试做起的,工作忙忙碌碌,每天在各种业务需求学习和点点中度过,过了好多年发现自己还只是一个功能测试工程师。 随着移动互联网的发展,从业人员能力的整体进步,软件测试需要具备的能力要…