一、GPIO是什么? GPIO,全称为General Purpose Input Output Ports(通用输入输出端口),也就是通用IO口。7 X% {0 f. T9 c0 P1 w; u: A GPIO是控制或者采集外部器件的信息的外设,可以由软件程序控制,用于输出或者输入高低电平。, ^0 } ?7 [7 { GPIO的使用非常广泛。可以与硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。. _! S- {* G/ l; s2 } GPIO按组分配,每组16个I/O口,组数视芯片而定。 以STM32F429IGT6为例: ① 一共有9组IO,PA~PI。 ② 一共有140个IO口,其中PA~PH每组有16个IO,PI只有12个IO口。+ t# w# R7 X+ x+ J5 O' G 注意:芯片的数据手册中,引脚标注为 FT 的,是可以兼容 5V 电平的。 4 D! l5 s# T/ E7 z5 r l* u& [$ V8 O ST官方提供的GPIO基本结构图 , A0 T% z' x* b2 I. H% f; \ & L6 M# F* [# X: K 二、GPIO的8种工作模式 8种工作模式,分为4种输入模式和4种输出模式。 + x2 g; I6 E3 i: [' N! h# i' w 1. 浮空输入模式(GPIO_Mode_IN_FLOATING) 浮空输入模式下,上拉/下拉电阻为断开状态,施密特触发器为开启状态,I/O引脚的输出功能被禁止。 该模式下,外部的电平信号通过①(I/O引脚)进入MCU,先经过②(施密特触发器)的整形后,再进入③(输入数据寄存器),最后MCU可以在④(输入数据寄存器的另一端)随时读取I/O引脚的电平。 即,整形后的I/O引脚的电平信号直接进入输入数据寄存器,MCU直接读取I/O引脚的电平。, H6 u: h, U1 g; [# n3 Q 如果I/O引脚无输入时,MCU读取到的电平状态是不确定的。所以引脚不建议悬空,易受干扰。 如果I/O引脚输入高电平时,MCU读取到高电平1。 如果I/O引脚输入低电平时,MCU读到低电平0。 总结,浮空输入模式:1 t5 e" |+ {, ^0 s- Z I/O引脚输入什么电平信号,MCU就读取到什么电平信号;% Y( `4 Q8 {- O1 O6 ~6 M 无信号输入(默认)时,MCU读取到的电平信号是不确定的。 浮空输入模式,可以用于KEY识别,RX1等。( |! E, f0 J' R2 m' b! }; b# G / }$ t! n7 r8 T. p5 C# a3 c $ B& w/ C/ ?' N J! {9 Z 2. 上拉输入模式(GPIO_Mode_IPU) 上拉输入模式下,上拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。 GPIO的内部上拉电阻的阻值较大,所以通过内部上拉输出的电流是很弱的,即“弱电流”。3 i% m$ K: _5 B/ ~* v% f4 I 如果需要大电流用作电流型驱动输出,还是要用外部上拉电阻。 上拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个上拉电阻,将电位拉高,比如拉到VCC。 6 Q0 l' W7 M `( V& r) c8 f 如果I/O引脚无输入时,I/O引脚处相当于断开,上拉电阻的电流直接流向④,MCU读取到高电平1。 如果I/O引脚输入高电平时,I/O引脚的电压等于VDD的电压,电流还是流向④,MCU读取到高电平1。 如果I/O引脚输入低电平时,I/O引脚处相当于接地,上拉电阻的电流直接流向I/O引脚,MCU读到低电平0。6 u& a+ x; {+ ?8 p. H% c / [, n% h$ h! Z 总结,上拉输入模式:9 R9 D$ L _+ X; ]( k7 u 无信号输入(默认)或输入高电平时,MCU都是读取到高电平1;+ @5 H$ C4 q. Y/ s9 l8 G/ q0 M5 z1 A 输入低电平时,MCU读取到低电平0。 0 \8 i' P7 @% i% Q6 b 上拉输入模式,可以用于按键检测。: r- n8 l$ z$ X# G1 l1 [ b, M$ D2 i; {- t( G 3. 下拉输入模式(GPIO_Mode_IPD)2 q% o# U( h! U: \* i 下拉输入模式下,下拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。 0 t; K1 |4 `# Z' a8 D" `) T1 ~. v' f 下拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个下拉电阻,将电位拉低,比如拉到GND。' x9 s9 y( E) L: x/ G; z! D* E 3 _& T7 S- [! ^' k1 Q5 k 如果I/O引脚无输入时,I/O引脚处相当于断开,I/O引脚的电压等于VSS的电压,MCU读取到低电平0。! f" i9 W7 K3 [8 O+ i/ k 如果I/O引脚输入高电平时,由于下拉电阻阻值比通道④的阻值大,所以电流流向④,MCU读取到高电平1。 如果I/O引脚输入低电平时,I/O引脚处相当于接地,I/O引脚的电压等于VSS的电压,MCU读到低电平0。* ^- X3 y: R6 E v4 c& w* { 总结,下拉输入模式:: b. v8 M1 n6 Y7 [ 无信号输入(默认)或输入低电平时,MCU都是读取到低电平0; 输入高电平时,MCU读取到高电平1。 - E2 v% {2 A4 A# O 下拉输入模式,和上拉输入模式相似,可以用于按键检测。 : }$ [& @: R/ k! X j 4. 模拟输入模式(GPIO_Mode_AIN) 模拟模式下,上拉/下拉电阻为断开状态,施密特触发器为关闭状态,输出部分的双MOS管也断开。. d7 ]/ s6 ?8 X# x * N% R4 B) z6 x# _0 \ 模拟输入模式下,外部的电平信号通过①(I/O引脚的模拟输入通道)进入MCU,MCU可以直接在③(模拟输出口)随时读取I/O引脚的电平。5 v% _( Z- C5 }1 a. b - i+ u" b$ W% W$ @ 由于施密特触发器断开,所以电信号也无法进入输入数据寄存器,所以MCU无法在“输入数据寄存器”中读取到有效的数据。# I1 I' p6 a: ^7 f( S6 m2 L 总结,模拟输入模式: 输入的电信号为模拟电压信号,而不是数字电平信号。 模拟输入的模拟电压信号,直接送到片上外设,一般是ADC。 除了 ADC 和 DAC 要将 I/O 配置为模拟通道之外,其他外设功能一律要配置为复用功能模式。 模拟输入模式,可以用于ADC采集或DAC输出,或者低功耗下省电。 4 c$ G; Y2 C( x* R5 i 5. 开漏输出模式(GPIO_Mode_Out_OD) 开漏输出模式下,P-MOS管一直处于断开状态。 1 W9 }8 q3 e5 _" ~8 @ 6 l# b2 w. e' K8 I( e: i1 U, v8 V3 m 开漏输出模式下,MCU通过左边的①(位设置/清除寄存器)或(输出数据寄存器)写入数据后,该数据位将通过②(输出控制电路)传送到④(I/O引脚)。1 Y4 I0 O: c3 L2 Q+ x6 d* c 同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态。0 W! H0 h, Y4 j" s: w% O / T# N4 n! d5 u' Z0 Y: r7 } 当MCU输出低电平0时,经过“非门”后,转换为高电平1,N-MOS管导通,使I/O引脚输出低电平。 当MCU输出高电平1时,经过“非门”后,转换为低电平0,N-MOS管断开,I/O引脚处于悬空状态,此时I/O引脚输出的电平高低是由I/O引脚外部的上拉或者下拉决定。 开漏输出,输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对较强,一般20mA以内。- R: b+ v* K: m; l 3 |' E4 s- G1 p/ D 6. 开漏复用输出模式(GPIO_Mode_AF_OD) GPIO可以是通用的IO口功能,还可以是其他外设的特殊功能引脚,这就是GPIO的复用功能。+ K# p4 F# S' P. F$ g8 q7 M # r/ x7 W% j( M GPIO复用为其他外设,输出数据寄存器无效,④(I/O引脚)输出的高低电平由①(其他外设的输出)决定。 F6 V" w- b+ I6 s9 S6 h* ] 同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态,同时外设可以读取IO引脚的信息。3 K1 \- R9 K. n( ~" U# ? 6 k; g9 a7 q: N 开漏复用输出模式与开漏输出模式的配置基本相同,除了输出信号的来源不同,其他与开漏输出模式的功能相同。 即,②(输出控制电路)的输入,开漏输出模式是由输出数据寄存器输出,开漏复用输出模式是由其他外设输出。 4 G w- @" n, h2 x 7. 推挽输出模式(GPIO_Mode_Out_PP) 推挽输出模式,从结果上看它会输出低电平VSS或者高电平VDD。推挽输出跟开漏输出不同的是,推挽输出模式P-MOS管和N-MOS管都用上,可以把“输出控制”简单地等效为一个非门。8 z) {: j' U, h& _/ c 9 }8 H) A' H& t# H6 f/ a0 M; o 当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引脚)的实际电平状态。# q# S2 j$ K( d 总结,推挽输出模式下,P-MOS管和N-MOS管同一时间只能有一个MOS管是导通的。当引脚高低电平切换时,两个管子轮流导通,一个负责灌电流,一个负责拉电流,使其负载能力和开关速度都有很大的提高。1 d$ `+ `4 ]/ E5 L/ X & I' b2 u7 {# W# T' ~ 由于推挽输出模式输出高电平时,是直接连接VDD,所以驱动能力较强,可以做电流型驱动,驱动电流最大可达25mA。该模式也是最常用的输出模式。 # G8 X, W9 @' y6 r, G6 ? 8. 推挽复用输出模式(GPIO_Mode_AF_PP) GPIO可以是通用的IO口功能,还可以是其他外设的特殊功能引脚,这就是GPIO的复用功能。 GPIO复用为其他外设,输出数据寄存器无效,④(I/O引脚)输出的高低电平由①(其他外设的输出)决定。 同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态,同时外设可以读取IO引脚的信息。- N, C5 u2 r2 ? 8 h" F: h! l% L: G5 T) t 推挽复用输出模式与推挽输出模式的配置基本相同,除了输出信号的来源不同,其他与推挽输出模式的功能相同。0 l+ o6 c& C" r' p9 q3 X 即,②(输出控制电路)的输入,推挽输出模式是由输出数据寄存器输出,推挽复用输出模式是由其他外设输出。 三、GPIO寄存器 每组GPIO的寄存器包括: 配置寄存器: 一个端口模式寄存器(GPIOx_MODER)8 P& A# N4 k1 l% L& }0 h 一个端口输出类型寄存器(GPIOx_OTYPER) 一个端口输出速度寄存器(GPIOx_OSPEEDR)2 ]+ f& B c: ~, C3 f 一个端口上拉下拉寄存器(GPIOx_PUPDR)) m) S o9 Z! _' t2 a 7 h, \: y& ]7 A m9 K0 o 数据寄存器:. a0 ^' ]! }: t2 O9 ]# I5 x 一个端口输入数据寄存器(GPIOx_IDR) 一个端口输出数据寄存器(GPIOx_ODR)7 \" m6 R# V, L1 W, m0 J 置位/复位寄存器:3 ?1 K3 z; A8 u$ \3 Z8 y 一个端口置位/复位寄存器(GPIOx_BSRR)7 R$ k E. \9 M3 G* @ 锁存寄存器: |% W- z4 X& E, U9 m 一个端口配置锁存寄存器(GPIOx_LCKR) . D5 P* h2 \" | 复用功能共寄存器:5 ~1 a+ D2 s7 ~6 y5 \ 两个复用功能寄存器(低位GPIOx_AFRL & 高位GPIOx_AFRH) 注意: ① 每组GPIO由10个寄存器组成,如果芯片有 GPIOA ~ GPIOI 9个组,那么一共有对应90个寄存器。1 j/ Q+ H# C1 P# q J/ F ② 如果配置一个I/O口需要2个位,那么刚好32位寄存器配置一组16个I/O口。0 [" p* b8 @/ g, d3 R0 `# X ③ 如果配置一个I/O口只需要1个位,一般高16位保留。 ④ BSRR寄存器32位分为低16位BSRRL和高16位BSRRH,$ d+ I: h$ r1 z5 Y$ M. T; H BSRRL配置一组16个I/O口的置位状态(1), BSRRH配置一组16个I/O口的复位状态(0)。. a0 z* G3 ~' `( _ ⑤ rw表示可读可写;r表示只可读;w表示只可写;Res.表示保留位,必须保持复位值。 " [) F/ T- k/ p! M/ R5 e7 ] 1. GPIO端口模式寄存器(GPIOx_MODER)8 H3 k7 Z( k S9 ]8 | 该寄存器是GPIO的模式控制寄存器,用于控制GPIO的工作模式。' b: I' B8 n; ~' T 该寄存器共32位,每2个位控制1个I/O口。8 n/ i( r, t; J8 \9 p* m; m 以 GPIOA = 0xABFFFFFF 为例: ① 低16位的值是FFFF,都是1,即 PA0 ~ PA7 默认都是模拟模式。 ② 高16位的值是0xABFF,即 PA8 ~ PA12 是模拟模式,PA13 ~ PA15 是复用功能模式。 % }* V3 @# N5 H" g) |" [ " _) F& Q R1 `+ _ 5 @8 o/ W; t* o4 | R1 y2 M/ I, m; g P" x x- M9 v$ K T' r1 U+ C: ? 位 2y+1:2y MODERy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)1 [, Z5 h! A5 D. \: S 这些位通过软件写入,用于配置 I/O 模式。* @- \, b# u1 N8 k( |6 M 00:输入模式(复位状态)5 y% x6 Y _. l' A( S% c 01:通用输出模式 10:复用功能模式. U6 A2 ^6 m- m; I/ R$ d2 d 11:模拟模式+ t: ~* u, l ~3 u& q/ H' ^" [ 4 [' y5 |* f# I% n, z, P 2. GPIO端口输出类型寄存器(GPIOx_OTYPER)$ J. i1 c4 y! [+ ~: o; k9 k4 ? 该寄存器用于控制GPIO的输出类型,仅用于输出模式,在输入模式(MODER[1:0] = 00 / 11 时)下不起作用。4 M6 }5 |8 _" r; F. l- Q 该寄存器的低16位有效,每1个位控制1个I/O口。5 ]5 |. z p5 x {8 {0 \# L 复位后,该寄存器的值均为0,即I/O口在输出模式下默认为推挽输出。* |+ P' j; R8 g* ] 4 y2 m6 D6 c# H) u$ a2 S' m 位 31:16 :保留,必须保持复位值。' Y" w, R2 a! M 位 15:0 OTy:端口x配置位(Port x configuration bits)(y=0…15) 这些位通过软件写入,用于配置 I/O 输出类型。 0:推挽输出(复位状态)! a0 k- \6 `, P [! n6 T, t2 T) _ 1:开漏输出# a' D* x7 a2 j% v8 ]0 d & f2 U, l7 A$ i! t# J5 l 3. GPIO端口输出速度寄存器(GPIOx_OSPEEDR)* U+ ]6 v" O0 s; f' P 该寄存器用于控制GPIO的输出速度,仅用于输出模式,在输入模式(MODER[1:0] = 00 / 11 时)下不起作用。7 C4 I! l* D* Z$ ? 该寄存器共32位,每2个位控制1个I/O口。 复位后,该寄存器的值均为0,即I/O口在输出模式下默认为推挽输出。3 j# _6 d' q0 G8 X " j: g+ o) F" | 位 2y+1:2y OSPEEDRy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)0 D" g0 D, j, g 这些位通过软件写入,用于配置 I/O 输出速度。 00:低速 ( 2MHz)/ n! N/ T5 Q, v" ]: u: t5 X8 r 01:中速 ( 25MHz); m# d- S4 c* }7 u' g 10:高速 ( 50MHz) 11:超高速(100MHz) 注: 有关 OSPEEDRy 位以及 V D D V_{DD}VDD范围和外部负载的值,请参见产品数据手册。, z! G1 D* }& Z; a$ q8 u4 [! p ( ?2 L0 B8 j! v E K 4. GPIO端口上拉/下拉寄存器(GPIOx_PUPDR) 该寄存器用于控制GPIO的上拉/下拉。 `8 x- R4 c) B! q1 U 该寄存器共32位,每2个位控制1个I/O口。 / {3 v- p& L b; o M3 Q 复位后,该寄存器的值一般为0,即无上拉或下拉。 0 J4 t( r, A* ` 位 2y+1:2y PUPDRy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)+ e2 d6 b2 @$ b0 y" N1 v; m 这些位通过软件写入,用于配置 I/O 上拉或下拉。5 \- y f% ^9 R) j) Y+ `! a# } 00:无上拉或下拉 01:上拉/ e# Q! _; {5 r' R* i' E 10:下拉: P5 K# C3 e6 n, X& f/ ]8 m 11:保留 5. 端口输入数据寄存器(GPIOx_IDR) 该寄存器用于控制GPIO的输入高电平或者低电平。 该寄存器的低16位有效,每1个位控制1个I/O口。 : \; ]& `3 }5 r$ v& A5 k 该寄存器是只读权限,当CPU读访问该寄存器时: 如果对应的某位为0,则表示设置该I/O口输入的是低电平;7 i% {" _1 V& D: p 如果对应的某位为1,则表示设置该I/O口输入的是高电平。8 m1 Z3 n8 k# X; ]" h 8 I0 g1 u' l1 `6 S8 v/ r9 | # t, U. \8 o+ Y( A% W+ Y' N7 s d 位 31:16 :保留,必须保持复位值。- Q7 T+ Q5 J& P; z* M ! t" H% t: a# R/ q" `* @" y 位 15:0 :IDRy:端口输入数据(Port input data)(y=0…15) 这些位为只读。它们包含相应 I/O 端口的输入值。 : i; V3 Z2 @6 D 6. 端口输出数据寄存器(GPIOx_ODR)$ }" E4 y6 H, t 该寄存器用于控制GPIO的输出高电平或者低电平。 该寄存器的低16位有效,每1个位控制1个I/O口。 % N/ I5 u) v0 D% f a: h* T5 [% m 当CPU写访问该寄存器时: 如果对应的某位写0,则表示设置该I/O口输出的是低电平; 如果对应的某位写1,则表示设置该I/O口输出的是高电平。: ^# }: ]4 x& G3 y5 Y* f 5 ^7 [0 {1 j" B' _# N4 q2 ?" c 位 31:16 :保留,必须保持复位值。 % Y* M9 H* `9 Q8 s4 ?; b0 q- O) ]$ p 位 15:0 :ODRy:端口输出数据(Port output data)(y=0…15)8 |2 q9 e& h& g$ J: x 这些位可通过软件读取和写入。3 ^6 {9 E9 D0 U" U. m9 c; F 注: 对于原子置位/复位,通过写入 GPIOx_BSRR 或 GPIOx_BRR 寄存器,可分别置位和/或复位 ODR 位(x=A…F)。3 L B k+ F2 o% g1 @6 ?7 C 9 E5 x5 Y% v2 }, S6 } 8 W5 X; ^8 Q( E7 w0 z 7. 端口置位/复位寄存器(GPIOx_BSRR)! \: {2 T0 V- `7 ?! H6 N 该寄存器也用于控制GPIO的输出高电平或者低电平。/ ~% C. u; L" S : n4 Z6 U; w3 u' \3 x* \2 T. J! A BSRR寄存器32位有效。' G3 a% q! |9 w. ]* D5 b 对于低16位(0 ~ 15): 我们往相应的位写1,那么对应的IO口会输出高电平; 我们往相应的位写0,对IO口没有任何影响。 j+ C9 c0 U1 M! Z* h8 E; j% I 对于高16位(16 ~ 31)作用刚好相反: 我们往相应的位写1,那么对应的IO口会输出低电平; 我们往相应的位写0,对IO口没有任何影响。 ]+ R1 G0 F& { Z4 J2 N: Q# R2 Y 总结:! U6 w0 ^7 d* R1 ?3 h 对于BSRR寄存器,写0时,对I/O口电平无影响。 如需输出高电平,则将对应的BS位写1; 如需输出低电平,则将对应的BR位写1。7 N2 V) ]8 d$ J6 L7 I2 g% @ ODR寄存器和BSRR寄存器的不同之处: ODR是可读可写权限,而BSRR是只写权限。 ODR寄存器,我们要设置某个IO口电平,我们首先需要读出来ODR寄存器的值,然后对整个ODR寄存器重新赋值来达到设置某个或者某些IO口的目的。9 Q/ c, f4 p+ G: d* Q2 v: e BSRR寄存器,我们就不需要先读,而是直接设置即可,这在多任务实时操作系统中作用很大。1 F% P- \/ H% q/ k BSRR寄存器比ODR寄存器更好的地方,就是BSRR寄存器改变引脚状态的时候,不会被中断打断。而ODR寄存器有被中断打断的风险。 , r1 H! V. V$ A ' U7 s1 w% y! Z% l) m; v , A( h! W0 s- Q, x 5 ^* {. p! ^- j. l3 k/ m9 j4 Z 位 31:16 BRy:端口x复位位y(Port x reset bit y)(y=0…15)" T+ o, S f5 _; s% @" C& C 这些位为只写。读取这些位可返回值 0x0000。 0:不会对相应的 ODRx 位执行任何操作; X. i; x$ C! U8 O1 E9 x7 u 1:复位相应的 ODRx 位, c c& t( [4 q7 t+ K5 E: z4 `1 n' Y 注: 如果同时对 BSx 和 BRx 置位,则 BSx 的优先级更高。1 E, W+ H% B4 c$ [0 ?9 |% o# v& A ; X! M& q, u4 Y6 _! j8 N& D, ] 位 15:0 BSy:端口x置位位y(Port x set bit y)(y=0…15) 这些位为只写。读取这些位可返回值 0x0000。 0:不会对相应的 ODRx 位执行任何操作 1:置位相应的 ODRx 位 7 L; L" t& W0 S; [ 8. 端口配置锁定寄存器(GPIOx_LCKR) 该寄存器的每个锁定位冻结一个特定的配置寄存器(控制寄存器和复用功能寄存器)。6 x- F, `7 f: B . N6 x- A# m+ c3 _( q% v ; r1 B! e# B# M. v4 R 位 31:17 :保留,必须保持复位值。 位 16 LCKK:锁定键(Lock key) 可随时读取此位。可使用锁定键写序列对其进行修改。! N( x0 ?4 O6 }* }% c 0:端口配置锁定键未激活 1:端口配置锁定键已激活。在下一次 MCU 复位或外设复位之前,GPIOx_LCKR 寄存器始终处于锁定状态。1 E% A/ v9 ^. I, ^! T* n. S 9 \& {* r1 F) ] 位 15:0 LCKy:端口x锁定位y(Port x lock bit y)(y=0…15) 这些位都是读/写位,但只能在 LCKK 位等于 “0” 时执行写操作。0 Z4 I% S1 |! a4 b8 z8 i/ |$ _! D 0:端口配置未锁定) W/ ~+ `) C4 J7 T6 e+ ~) M, d 1:端口配置已锁定% A( b" c) i' F8 f e, d4 s' X: T. E 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路复用。% o4 l1 f+ n5 P( P I/O口并不能随意复用功能,而是有规定的,可以通过查阅数据手册来获取每个I/O引脚的复用功能。 4 u+ U8 [. l$ { 位 31:0 AFRy[3:0]:端口x引脚y的复用功能选择(Alternate function selection for port x pin y)(y=0…7) 这些位通过软件写入,用于配置复用功能 I/O 。 5 @; u; H7 V, _5 X) _: G# ^ AFSELy 选择: 0000:AF0 1000:AF8 0001:AF1 1001:AF9 0010:AF2 1010:AF10 0011:AF3 1011:AF11 0100:AF4 1100:AF123 a( K+ e" e& D K) H: |6 m. @ 0101:AF5 1101:AF13 0110:AF6 1110:AF14 0111:AF7 1111:AF159 q+ q, s" o' h" p0 d ————————————————; O: \& V% j0 _5 G. F' ^ 版权声明:零号萌新 |
基于STM32的BootLoader经验分享
基于STM32如何选择 S2-LP 的外部晶体经验分享
基于是STM32的BLE 设备地址经验分享
基于ToF传感器的3D手势识别
NUCLEO-U545RE-Q评测(2)运行环境建立
基于使用 STM32 TT 类型 IO 的注意事项经验分享
基于STM32使用Framebuffer_Analyzer工具调试图像显示
ST安全连接,护航工业物联网一路前行
基于STM32的TouchGFX 4.22解锁新功能经验分享
基于STM32的MPU子区经验分享