STMCU小助手
发布时间:2023-2-1 21:37
|
一、GPIO是什么?2 o% e# |' M! z GPIO,全称为General Purpose Input Output Ports(通用输入输出端口),也就是通用IO口。$ v$ T' X' e. b) l D1 { 3 I6 `* n. w" {7 I GPIO是控制或者采集外部器件的信息的外设,可以由软件程序控制,用于输出或者输入高低电平。# @7 i' [5 T/ g3 U GPIO的使用非常广泛。可以与硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。1 m4 t3 E; _1 t0 V* X& v. w2 c 1 r2 l2 z! d* ~( X GPIO按组分配,每组16个I/O口,组数视芯片而定。) l" ?* |- C: C. j7 { 以STM32F429IGT6为例:, o; x9 K5 h! D4 c7 F ① 一共有9组IO,PA~PI。8 Y; d7 H, d- A7 m ② 一共有140个IO口,其中PA~PH每组有16个IO,PI只有12个IO口。' i* D; p: N" t6 U/ m. y) x : v4 V# @) m& V0 L7 \ 注意:芯片的数据手册中,引脚标注为 FT 的,是可以兼容 5V 电平的。- I" G2 V& @4 [ _- Z7 ?( I , T, n+ S/ a* Q; x ST官方提供的GPIO基本结构图8 \0 S7 i2 H3 f$ o. q8 Y
5 ~: J2 y6 ?4 ^1 T# m- |3 A 二、GPIO的8种工作模式! Z8 f# |8 m" \0 X( O 8种工作模式,分为4种输入模式和4种输出模式。 R: ?* g) R& C P, z9 T 1. 浮空输入模式(GPIO_Mode_IN_FLOATING)1 j- n0 z/ x% p 浮空输入模式下,上拉/下拉电阻为断开状态,施密特触发器为开启状态,I/O引脚的输出功能被禁止。; h: e* B4 ^) [' l, k; x . q \, B8 o! B7 P* @+ n* u 该模式下,外部的电平信号通过①(I/O引脚)进入MCU,先经过②(施密特触发器)的整形后,再进入③(输入数据寄存器),最后MCU可以在④(输入数据寄存器的另一端)随时读取I/O引脚的电平。$ s9 M8 U' k, F$ u3 p% D* h7 o$ A 即,整形后的I/O引脚的电平信号直接进入输入数据寄存器,MCU直接读取I/O引脚的电平。5 W5 g# k6 n% Y8 Z $ N4 ^ ^0 J7 ~# w- x/ ]! w" m: i! i 如果I/O引脚无输入时,MCU读取到的电平状态是不确定的。所以引脚不建议悬空,易受干扰。; D6 L& @/ \' S9 l6 U 如果I/O引脚输入高电平时,MCU读取到高电平1。2 ? t2 h2 m4 m& I; A) M 如果I/O引脚输入低电平时,MCU读到低电平0。 总结,浮空输入模式: I/O引脚输入什么电平信号,MCU就读取到什么电平信号; 无信号输入(默认)时,MCU读取到的电平信号是不确定的。 2 a: ?: {3 n, Q. K 浮空输入模式,可以用于KEY识别,RX1等。 r1 ~2 I) f H( i
2. 上拉输入模式(GPIO_Mode_IPU)" U' W$ Y# e; u, z' h$ X8 ^" s 上拉输入模式下,上拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。 GPIO的内部上拉电阻的阻值较大,所以通过内部上拉输出的电流是很弱的,即“弱电流”。 z7 V4 P' h8 @2 n- ]( O) | 如果需要大电流用作电流型驱动输出,还是要用外部上拉电阻。/ |& v" f4 L4 D. B0 ] 上拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个上拉电阻,将电位拉高,比如拉到VCC。 / L" q4 |$ Z2 S8 d; P& ` 如果I/O引脚无输入时,I/O引脚处相当于断开,上拉电阻的电流直接流向④,MCU读取到高电平1。 如果I/O引脚输入高电平时,I/O引脚的电压等于VDD的电压,电流还是流向④,MCU读取到高电平1。: |& n6 l9 S2 I c, W: w% t" d 如果I/O引脚输入低电平时,I/O引脚处相当于接地,上拉电阻的电流直接流向I/O引脚,MCU读到低电平0。) R5 I! v$ M! U$ M" A7 ~$ } * |+ o# z& [' ]6 Q3 \& m2 j2 s 总结,上拉输入模式: 无信号输入(默认)或输入高电平时,MCU都是读取到高电平1; 输入低电平时,MCU读取到低电平0。 6 }$ m" y: p4 z7 ~$ Y 上拉输入模式,可以用于按键检测。( D" F7 x$ H; V
3. 下拉输入模式(GPIO_Mode_IPD) 下拉输入模式下,下拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。$ ?$ U* e: a: H. U. K9 b- A: w6 k 下拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个下拉电阻,将电位拉低,比如拉到GND。( }/ i" s' Z7 {9 W( `7 b. v ) u% f* Z# z! V( W5 k! a( k% d 如果I/O引脚无输入时,I/O引脚处相当于断开,I/O引脚的电压等于VSS的电压,MCU读取到低电平0。1 h X: Y+ D; o- |) @% f8 H+ ~8 K 如果I/O引脚输入高电平时,由于下拉电阻阻值比通道④的阻值大,所以电流流向④,MCU读取到高电平1。3 J3 o i9 Z- o$ i0 v7 { 如果I/O引脚输入低电平时,I/O引脚处相当于接地,I/O引脚的电压等于VSS的电压,MCU读到低电平0。 1 p" D q+ H- z; x) l& A 总结,下拉输入模式:4 M6 [; |7 @+ { 无信号输入(默认)或输入低电平时,MCU都是读取到低电平0;' X" H+ k- Q# j$ e# ] 输入高电平时,MCU读取到高电平1。0 Z7 {% l: p5 f8 x , }1 X* d: {- }7 E0 Y" S 下拉输入模式,和上拉输入模式相似,可以用于按键检测。* N% c( {+ r2 ^+ o N0 `2 j0 |
4. 模拟输入模式(GPIO_Mode_AIN) 模拟模式下,上拉/下拉电阻为断开状态,施密特触发器为关闭状态,输出部分的双MOS管也断开。 模拟输入模式下,外部的电平信号通过①(I/O引脚的模拟输入通道)进入MCU,MCU可以直接在③(模拟输出口)随时读取I/O引脚的电平。% t9 p, z& @* b7 P6 v4 D 由于施密特触发器断开,所以电信号也无法进入输入数据寄存器,所以MCU无法在“输入数据寄存器”中读取到有效的数据。 ( c2 ^; u# J; e4 k u, F 总结,模拟输入模式: 输入的电信号为模拟电压信号,而不是数字电平信号。1 X8 x) U0 Z2 ]" q9 F 模拟输入的模拟电压信号,直接送到片上外设,一般是ADC。 除了 ADC 和 DAC 要将 I/O 配置为模拟通道之外,其他外设功能一律要配置为复用功能模式。" ?) O1 O7 B* |2 G; b 1 ]- T4 v$ P0 ^9 r2 J; {/ I7 D5 E 模拟输入模式,可以用于ADC采集或DAC输出,或者低功耗下省电。- K9 j) D ]. M: |$ I7 u ! l. G, p8 H1 M; F2 U# b6 Y ! D7 U2 w3 w5 \( A+ {. i ) t) P( S8 X( w/ O" d0 i 5. 开漏输出模式(GPIO_Mode_Out_OD) 开漏输出模式下,P-MOS管一直处于断开状态。1 n8 N, `- a, o" P & S* K* `, q3 H. h+ h: |" [ 开漏输出模式下,MCU通过左边的①(位设置/清除寄存器)或(输出数据寄存器)写入数据后,该数据位将通过②(输出控制电路)传送到④(I/O引脚)。" u: z: V# @- B' Z5 y- v 同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态。 当MCU输出低电平0时,经过“非门”后,转换为高电平1,N-MOS管导通,使I/O引脚输出低电平。 当MCU输出高电平1时,经过“非门”后,转换为低电平0,N-MOS管断开,I/O引脚处于悬空状态,此时I/O引脚输出的电平高低是由I/O引脚外部的上拉或者下拉决定。 开漏输出,输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对较强,一般20mA以内。 ) {4 ?! ? A1 ]8 S! l( ]
0 w' P9 ?8 a% s# Q/ G& S 6. 开漏复用输出模式(GPIO_Mode_AF_OD); Y6 _, E, m/ P5 g$ a7 x GPIO可以是通用的IO口功能,还可以是其他外设的特殊功能引脚,这就是GPIO的复用功能。 GPIO复用为其他外设,输出数据寄存器无效,④(I/O引脚)输出的高低电平由①(其他外设的输出)决定。 同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态,同时外设可以读取IO引脚的信息。 k4 x5 q# Y. y$ f( N. d6 J& m4 q 开漏复用输出模式与开漏输出模式的配置基本相同,除了输出信号的来源不同,其他与开漏输出模式的功能相同。 即,②(输出控制电路)的输入,开漏输出模式是由输出数据寄存器输出,开漏复用输出模式是由其他外设输出。1 Q; P4 v( X$ ^6 d
3 q3 {3 @7 j6 e E 7. 推挽输出模式(GPIO_Mode_Out_PP)7 E9 e; c- f3 ^$ g7 o4 B 推挽输出模式,从结果上看它会输出低电平VSS或者高电平VDD。推挽输出跟开漏输出不同的是,推挽输出模式P-MOS管和N-MOS管都用上,可以把“输出控制”简单地等效为一个非门。: z+ }' C5 b8 C1 F$ I 4 a+ x$ V8 z7 g 当MCU输出低电平0时,经过“非门”后,转换为高电平1,P-MOS管截止,N-MOS管导通,使I/O引脚下拉到VSS,即I/O引脚输出低电平。 当MCU输出高电平1时,经过“非门”后,转换为低电平0,P-MOS管导通,N-MOS管截止,使I/O引脚上拉到VDD,即I/O引脚输出高电平。: l1 `3 }9 ?) J" U6 t" E 同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态。8 M+ `4 T/ w3 y# R' } 总结,推挽输出模式下,P-MOS管和N-MOS管同一时间只能有一个MOS管是导通的。当引脚高低电平切换时,两个管子轮流导通,一个负责灌电流,一个负责拉电流,使其负载能力和开关速度都有很大的提高。 由于推挽输出模式输出高电平时,是直接连接VDD,所以驱动能力较强,可以做电流型驱动,驱动电流最大可达25mA。该模式也是最常用的输出模式。 ; V9 A- X: o( W% K8 S4 K2 H
& V+ p( B( k. R* q% n$ _ 8. 推挽复用输出模式(GPIO_Mode_AF_PP)! h+ b9 R: G' r5 P0 D# Y( c GPIO可以是通用的IO口功能,还可以是其他外设的特殊功能引脚,这就是GPIO的复用功能。* B( {- V; d: Y # i' r- D: k" f7 Z GPIO复用为其他外设,输出数据寄存器无效,④(I/O引脚)输出的高低电平由①(其他外设的输出)决定。' [: k2 Y$ E- F3 \( G 同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态,同时外设可以读取IO引脚的信息。5 E8 {: b0 M9 `, S 5 ~+ L9 b. `/ M; ^% ~ 推挽复用输出模式与推挽输出模式的配置基本相同,除了输出信号的来源不同,其他与推挽输出模式的功能相同。8 `% h X% g6 t4 ?, I 即,②(输出控制电路)的输入,推挽输出模式是由输出数据寄存器输出,推挽复用输出模式是由其他外设输出。 / ` |3 g5 Q! @4 c8 h
4 d6 b$ P8 L4 O' g 三、GPIO寄存器! Y8 A! \9 w7 d/ ?2 N7 d2 U8 n 每组GPIO的寄存器包括: 配置寄存器: 一个端口模式寄存器(GPIOx_MODER) 一个端口输出类型寄存器(GPIOx_OTYPER) 一个端口输出速度寄存器(GPIOx_OSPEEDR)5 Q) k! v' K$ G' r/ `3 T 一个端口上拉下拉寄存器(GPIOx_PUPDR)! M, g1 H/ Y# M& j8 m4 n% s! M 数据寄存器:3 e. l. c' y. H- \! V6 @ 一个端口输入数据寄存器(GPIOx_IDR)+ ?- v0 e5 ?/ i# P. \ 一个端口输出数据寄存器(GPIOx_ODR) 置位/复位寄存器: 一个端口置位/复位寄存器(GPIOx_BSRR) 锁存寄存器: 一个端口配置锁存寄存器(GPIOx_LCKR)4 }) f; h& I! h, R2 J+ V" r5 g( k B 复用功能共寄存器: 两个复用功能寄存器(低位GPIOx_AFRL & 高位GPIOx_AFRH)3 n, T. z8 J9 r2 |8 c ' f) X$ \# x- ~. @ 注意: g A0 y/ E0 e7 X% G8 y, G& f ① 每组GPIO由10个寄存器组成,如果芯片有 GPIOA ~ GPIOI 9个组,那么一共有对应90个寄存器。 ② 如果配置一个I/O口需要2个位,那么刚好32位寄存器配置一组16个I/O口。 ③ 如果配置一个I/O口只需要1个位,一般高16位保留。 ④ BSRR寄存器32位分为低16位BSRRL和高16位BSRRH,* C: |8 K$ d3 C+ N BSRRL配置一组16个I/O口的置位状态(1),/ x3 U% X. }, I BSRRH配置一组16个I/O口的复位状态(0)。. U$ d+ `8 ~" v y: N ⑤ rw表示可读可写;r表示只可读;w表示只可写;Res.表示保留位,必须保持复位值。: X6 }4 P' n! L4 R( c# p; B
2 L) M1 l- l) ?1 \8 V2 L 1. GPIO端口模式寄存器(GPIOx_MODER)# H: Z8 |( [: L3 d4 r6 Z0 L1 j) d Y! f1 _ 该寄存器是GPIO的模式控制寄存器,用于控制GPIO的工作模式。 该寄存器共32位,每2个位控制1个I/O口。" f, B) S4 p% A/ z# S 1 s% t- D Y5 Y, n+ s. e 以 GPIOA = 0xABFFFFFF 为例:/ M, E2 [8 ?( j, f! N! v ① 低16位的值是FFFF,都是1,即 PA0 ~ PA7 默认都是模拟模式。* `- s% ~: t( \/ }* h, S/ b ② 高16位的值是0xABFF,即 PA8 ~ PA12 是模拟模式,PA13 ~ PA15 是复用功能模式。& e; p. ~ G/ n" k& y6 E b" J
- `# U1 d8 ^! `, @4 D
位 2y+1:2y MODERy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)6 ?$ Q2 P) Y/ U7 o# c" I 这些位通过软件写入,用于配置 I/O 模式。) u6 O2 J- r$ @% V) y7 [9 _# g 00:输入模式(复位状态)+ Z1 e8 T% j' r- d$ i; f D) W" o 01:通用输出模式 10:复用功能模式. O- w3 n, Z. C, g z 11:模拟模式 " ?+ H" v3 L) \* k2 `0 b# \& |" P! K 2. GPIO端口输出类型寄存器(GPIOx_OTYPER)2 S$ Q% r- r) d+ X- P, h 该寄存器用于控制GPIO的输出类型,仅用于输出模式,在输入模式(MODER[1:0] = 00 / 11 时)下不起作用。& c+ E: ?1 y5 f+ { 该寄存器的低16位有效,每1个位控制1个I/O口。 复位后,该寄存器的值均为0,即I/O口在输出模式下默认为推挽输出。 # j! W$ _2 w! W& |+ E- C- c$ x
) l7 B m$ J4 O3 L! y3 e
& _3 P, q6 I Y( c 位 31:16 :保留,必须保持复位值。 / A1 }; {- M' R2 M 位 15:0 OTy:端口x配置位(Port x configuration bits)(y=0…15)0 u$ q9 K5 g2 N 这些位通过软件写入,用于配置 I/O 输出类型。, e, q+ B, v$ f; b0 M* ] 0:推挽输出(复位状态)1 ? Q, N# w" X* z 1:开漏输出 3. GPIO端口输出速度寄存器(GPIOx_OSPEEDR) 该寄存器用于控制GPIO的输出速度,仅用于输出模式,在输入模式(MODER[1:0] = 00 / 11 时)下不起作用。) x7 Z* f5 B2 Q: C$ m/ r" F 该寄存器共32位,每2个位控制1个I/O口。 复位后,该寄存器的值均为0,即I/O口在输出模式下默认为推挽输出。
. J' R# h; Q5 N: ?" i. x 位 2y+1:2y OSPEEDRy[1:0]:端口x配置位(Port x configuration bits)(y=0…15) 这些位通过软件写入,用于配置 I/O 输出速度。 00:低速 ( 2MHz) 01:中速 ( 25MHz). o9 {2 W( s/ U4 f* p3 Y 10:高速 ( 50MHz) 11:超高速(100MHz)7 `6 t7 }0 z, C/ c4 B3 C" [- N: f 注: 有关 OSPEEDRy 位以及 V D D V_{DD}VDD范围和外部负载的值,请参见产品数据手册。% z% `6 }! x/ r' ~$ w' e- x) n- ? ! g2 i5 v. c: K$ [0 j- N 4. GPIO端口上拉/下拉寄存器(GPIOx_PUPDR) 该寄存器用于控制GPIO的上拉/下拉。 该寄存器共32位,每2个位控制1个I/O口。 ; B' }( T, u# [1 | 复位后,该寄存器的值一般为0,即无上拉或下拉。0 N! Y, T3 o6 w) U ( }" \; V8 c3 [& x/ u* `
: i3 S$ }- W; T* Q: C 位 2y+1:2y PUPDRy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)/ l/ o" r9 Q+ ?3 [. l 这些位通过软件写入,用于配置 I/O 上拉或下拉。 00:无上拉或下拉6 O% e! P6 B. J8 p$ |0 J' @- Q 01:上拉! G/ T- s( _5 a* k# ] 10:下拉/ e+ v" b& g4 w- i0 w, Q8 A 11:保留! R) M/ J+ c: w7 W4 X' D ; j4 H) C4 L( f- T8 l9 Q5 | 5. 端口输入数据寄存器(GPIOx_IDR)9 ~6 Y1 R6 H3 b3 W. r 该寄存器用于控制GPIO的输入高电平或者低电平。3 O; b. V9 h8 N& B; H# ~ 该寄存器的低16位有效,每1个位控制1个I/O口。 该寄存器是只读权限,当CPU读访问该寄存器时:- @) t0 M* y8 j. S 如果对应的某位为0,则表示设置该I/O口输入的是低电平;4 o1 B' G/ o5 Z 如果对应的某位为1,则表示设置该I/O口输入的是高电平。3 G6 J# C3 s$ B7 B6 }# \ " F2 I3 X7 u* l4 G. f9 Z
7 Q1 ]! D4 B4 v; G& v
位 31:16 :保留,必须保持复位值。 位 15:0 :IDRy:端口输入数据(Port input data)(y=0…15) 这些位为只读。它们包含相应 I/O 端口的输入值。+ g4 w' ]+ X) p# W; q" c8 n 6. 端口输出数据寄存器(GPIOx_ODR) 该寄存器用于控制GPIO的输出高电平或者低电平。 该寄存器的低16位有效,每1个位控制1个I/O口。4 L7 C; Q3 t* C4 E/ \ * T+ T3 d+ f" G$ r/ G% M; ?3 F 当CPU写访问该寄存器时:' f' ], r$ O0 [8 G 如果对应的某位写0,则表示设置该I/O口输出的是低电平;# q, l' I/ l2 o1 w) M& D; Q 如果对应的某位写1,则表示设置该I/O口输出的是高电平。- V0 W( T& [. w4 t) H$ z & K& Y8 }$ b( ]- B5 {$ [- q, B3 H5 ^
位 31:16 :保留,必须保持复位值。1 g+ ^3 ~6 {( ]5 C1 ?4 y& m* s ; m9 y) Q& p: K* q- h* ]. x+ y" f 位 15:0 :ODRy:端口输出数据(Port output data)(y=0…15) 这些位可通过软件读取和写入。# Z% L% f0 z2 V; x. ^; ?& | 注: 对于原子置位/复位,通过写入 GPIOx_BSRR 或 GPIOx_BRR 寄存器,可分别置位和/或复位 ODR 位(x=A…F)。/ n+ ^: J! c4 A0 @ % v, f) `8 u2 Z* J; A0 | 7. 端口置位/复位寄存器(GPIOx_BSRR)$ y! j; A3 Q& `, v/ C( z3 B 该寄存器也用于控制GPIO的输出高电平或者低电平。 BSRR寄存器32位有效。. d$ W( p! D1 S' @% V 对于低16位(0 ~ 15): 我们往相应的位写1,那么对应的IO口会输出高电平; 我们往相应的位写0,对IO口没有任何影响。 对于高16位(16 ~ 31)作用刚好相反:* ]4 X* b- T& U$ X 我们往相应的位写1,那么对应的IO口会输出低电平; 我们往相应的位写0,对IO口没有任何影响。 总结:" i, T. `& z) d. c( I 对于BSRR寄存器,写0时,对I/O口电平无影响。" h, v, T! s0 M, U) }4 M 如需输出高电平,则将对应的BS位写1;2 R/ u& {& x7 K7 @1 M0 t# B9 { 如需输出低电平,则将对应的BR位写1。 ODR寄存器和BSRR寄存器的不同之处:6 W- m1 t6 p$ M ODR是可读可写权限,而BSRR是只写权限。 ODR寄存器,我们要设置某个IO口电平,我们首先需要读出来ODR寄存器的值,然后对整个ODR寄存器重新赋值来达到设置某个或者某些IO口的目的。 BSRR寄存器,我们就不需要先读,而是直接设置即可,这在多任务实时操作系统中作用很大。9 a% b- x/ p( }' ~- Y- u BSRR寄存器比ODR寄存器更好的地方,就是BSRR寄存器改变引脚状态的时候,不会被中断打断。而ODR寄存器有被中断打断的风险。* R% ^: M$ G- D+ d {9 J: T$ d' D' t & v1 s6 Q* h0 e5 Q9 U& D
, w0 F( V0 q9 h$ u0 V* y* j3 o; Q
位 31:16 BRy:端口x复位位y(Port x reset bit y)(y=0…15) 这些位为只写。读取这些位可返回值 0x0000。 0:不会对相应的 ODRx 位执行任何操作 x3 p1 H+ s& `' b6 A# p' T0 L 1:复位相应的 ODRx 位 注: 如果同时对 BSx 和 BRx 置位,则 BSx 的优先级更高。 位 15:0 BSy:端口x置位位y(Port x set bit y)(y=0…15)" B. p# n1 l+ a! p9 W7 N 这些位为只写。读取这些位可返回值 0x0000。 0:不会对相应的 ODRx 位执行任何操作 1:置位相应的 ODRx 位 8. 端口配置锁定寄存器(GPIOx_LCKR) 该寄存器的每个锁定位冻结一个特定的配置寄存器(控制寄存器和复用功能寄存器)。 ! a1 Y9 |4 y0 P* c+ f
# k: A {& D9 u1 {0 _4 k8 q ' N o! t# l- g r5 H: ^ 位 31:17 :保留,必须保持复位值。 * c) ~3 S/ m: }1 | 位 16 LCKK:锁定键(Lock key)4 [. L9 K4 G& c9 [+ N 可随时读取此位。可使用锁定键写序列对其进行修改。9 Y, [9 a8 \0 f' k7 b# Z 0:端口配置锁定键未激活 1:端口配置锁定键已激活。在下一次 MCU 复位或外设复位之前,GPIOx_LCKR 寄存器始终处于锁定状态。2 k: c U: C. l* _% Y; H& N # q/ N( R, F( U' l8 u J! h 位 15:0 LCKy:端口x锁定位y(Port x lock bit y)(y=0…15) 这些位都是读/写位,但只能在 LCKK 位等于 “0” 时执行写操作。 0:端口配置未锁定 1:端口配置已锁定 8 F5 S7 \( p$ b" _7 d/ i x6 s 9. 复用功能寄存器(GPIOx_AFRL、GPIOx_AFRH); D ^+ i4 A# z! F3 S% w4 _6 |( T u 该寄存器分为高位AFRH和低位AFRL,分别控制16位,即分别控制8个I/O口。1 J- e O0 w, ` ) w5 R& ?& g# W9 Q6 N 复用功能寄存器有2个,都是32位有效的寄存器,分高位(AFRH)和低位(AFRL)。复用器采用16路复用功能输入AF0~AF15,通过GPIOx_AFRL(引脚 0~7)、GPIOx_AFRH(引脚 8~15)寄存器对复用功能输入进行配置,每四位控制1路复用。 - s/ B7 Q! X- W* s. m Z I/O口并不能随意复用功能,而是有规定的,可以通过查阅数据手册来获取每个I/O引脚的复用功能。+ d. y: |2 c* ]) z9 g! h; L( o 2 i) F H8 S" l
' U) e1 `9 W# `4 m5 { 位 31:0 AFRy[3:0]:端口x引脚y的复用功能选择(Alternate function selection for port x pin y)(y=0…7)6 s' b6 h! z! H# Q3 } 这些位通过软件写入,用于配置复用功能 I/O 。% B% }- ~1 q$ y) }( } AFSELy 选择: 0000:AF0 1000:AF8* t5 ]: O) ]* k+ h/ G6 d 0001:AF1 1001:AF9& l& W; z$ X. G$ @* g 0010:AF2 1010:AF10 0011:AF3 1011:AF11 0100:AF4 1100:AF12 0101:AF5 1101:AF138 s) u$ D' G8 X, } 0110:AF6 1110:AF148 B$ t+ z: {+ v' [0 J 0111:AF7 1111:AF15: e. H; _9 t6 y ————————————————, Z( I2 H; v# I 版权声明:零号萌新, [6 W7 ^5 w0 b5 s ) [9 r# C% \; {( K7 C |
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版