|
一、GPIO功能描述 每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。8 s, h- c7 d1 Y5 j3 C n5 t8 E# b 输入浮空' l) s& y) k o; \; ^& E 输入上拉 输入下拉/ e9 e/ R R/ T5 e( i 模拟输入 开漏输出 推挽式输出 推挽式复用功能 开漏复用功能: W5 p# ?! x5 D V8 @ 每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。* h: R3 t- M3 U 图1 I/O端口位的基本结构图片 ( g+ \! H9 L- |7 C$ ~
图2 端口位配置表图片5 z* c$ L8 q' u) _
& I# }# m; R+ @9 m; M( P 图3 输出模式位 T" K: n, h/ o$ F
二、通用I/O(GPIO)% n) m1 V3 G o0 I; E 复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:% }8 z" d9 W# e: ^$ v6 V$ L PA15:JTDI置于上拉模式8 o+ G# e% s! B0 H) s% l/ I PA14:JTCK置于下拉模式4 w+ Y a8 \2 M. i* h) x i PA13:JTMS置于上拉模式 PB4:JNTRST置于上拉模式 当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。. G5 n: y5 d: m x, P9 X 输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。 ! N- c, M. d ~' n5 D1 c) { 所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。$ T1 X. r5 g, r7 `; y" ^ * b+ J* ?$ z# p0 Q) _* { 三、单独的位设置或位清除 当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。6 ~% R: }: n# r9 e9 C2 n; ? 这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。! }7 c/ l3 E" u# w 9 Y5 m8 ?) u! B7 _- y) l 9 L6 e+ B4 O) U9 i7 ~$ p 四、外部中断/唤醒线8 ^2 z, @" A" k 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。 五、复用功能(AF) 使用默认复用功能前必须对端口位配置寄存器编程。 对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动' E. E1 \& p5 V7 f, u P% ^8 \ 对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。 对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。 六、软件重新映射I/O复用功能3 n9 t% T- V1 }- Y) Q# v9 o$ n z 为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。) v, Y% t+ V, C. N' z 七、GPIO 锁定机制4 n" E) L9 F/ [* W. h5 h2 { 锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。- T L3 `* `9 d& N% p 0 F+ t7 @1 A! \; t3 s1 a 八、输入配置 当I/O端口配置为输入时:、 输出缓冲器被禁止2 Y/ _5 N7 @) I 施密特触发输入被激活: E' V1 M1 N- ^, C, j6 H* V 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接7 l* L' k) e- W5 q' D1 K% z 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器 对输入数据寄存器的读访问可得到I/O状态# s- h. ?7 Y( ~4 x- i( h5 E - j. b; O- X! p! \3 D" z- w' a 下图给出了I/O端口位的输入配置3 {) @. J+ _" o6 I7 i2 ] {$ l
九、输出配置+ a5 h& [6 N3 G' d, p6 w. A 当I/O端口被配置为输出时: 输出缓冲器被激活; A3 I6 J! N0 x+ b( c/ ^: y2 d 开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。 推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。 施密特触发输入被激活 {# C4 h) e) S+ q+ ~8 P 弱上拉和下拉电阻被禁止; i# z. S0 K4 q" c& P- I3 u 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器5 [- V2 P. i7 P8 a6 R- H: i! S 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态1 ~9 c# p1 }- k# i. P 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值 ' l) W; j/ R1 l* X5 ] }, e 下图给出了I/O端口位的输出配置' c8 Q2 C1 E4 P0 o4 f! l l- h; n. `$ W 5 s5 E5 P% u: U6 ~$ o
9 {$ g% |1 B; j: ^7 ]0 m 十、复用功能配置4 a' h: x$ O# G! ^) p! c, J! z 当I/O端口被配置为复用功能时:% q( p- D( p# q! w 在开漏或推挽式配置中,输出缓冲器被打开、" o- ~0 k. w, V6 V1 [ x1 D 内置外设的信号驱动输出缓冲器(复用功能输出) 施密特触发输入被激活0 r! f& ~2 ~0 p. O9 w2 G+ D 弱上拉和下拉电阻被禁止" i. b2 i; }- q% x 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器 开漏模式时,读输入数据寄存器时可得到I/O口状态 在推挽模式时,读输出数据寄存器时可得到最后一次写的值3 n4 K W$ j( r# Z1 n7 l7 R 下图给出了复用功能配置图片( s2 ^! Y' }2 x( K 7 K8 q" h. M! a8 }' S) x
4 y* p( u. |" x1 m0 n5 y 十一、模拟输入配置5 P9 |0 i# d' ~( X! H 当I/O端口被配置为模拟输入配置时:$ ^; z2 U( \ M& B- w# h5 z I; [ 输出缓冲器被禁止;1 }0 G; e( w# i7 j: i; Q* ^$ \0 i 禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’; 弱上拉和下拉电阻被禁止; 读取输入数据寄存器时数值为’0’。& R0 w/ k% _0 ]) h 下图示出了I/O端口位的高阻抗模拟输入配置: 3 r5 [/ W& V4 f. o! U 转载自: 嵌入式产品侠9 b, z6 e/ E8 Q6 ]9 e% q, j 如有侵权请联系删除+ C3 m8 @5 g4 {% U, p6 ^' u + X% f* f$ s+ W1 b* | $ r* m4 o: [2 ~- n) w5 t! G& t |
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
STM32L562DK探索板——继续深入了解Audio Play的工作流程
STM32L562DK探索板——触摸菜单实验之触摸测试
STM32L562DK探索板——触摸菜单实验之LED闪烁
STM32L562DK探索板——给Audio Play添加音量控制功能
STM32L562DK探索板——重写Led闪烁demo
STM32L562DK探索板——触摸菜单的实验
STM32L562DK探索板——简单的显示变量函数
经验分享 | STM32 IAP应用时的跳转注意事项
实战经验 | 碰到hardfault问题你还在死磕代码吗?
微信公众号
手机版