|
一、GPIO功能描述 每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。) H5 o# ?7 T1 W% Z 输入浮空 输入上拉 输入下拉 模拟输入9 I1 K6 R' H4 I& @/ E 开漏输出 推挽式输出 推挽式复用功能 开漏复用功能 每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。 图1 I/O端口位的基本结构图片
" t0 [8 K+ N8 R5 @# E0 ]1 M 图2 端口位配置表图片
图3 输出模式位
二、通用I/O(GPIO) 复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式: PA15:JTDI置于上拉模式 PA14:JTCK置于下拉模式4 L' a6 S! o: b" T, N5 O4 y PA13:JTMS置于上拉模式 PB4:JNTRST置于上拉模式 $ _5 d7 B: x2 F: o 当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。+ V# W7 D* k& p: A/ b+ k 0 Z# I' u: V9 k3 p 输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。 . e: K( {' n8 t- t; l; R% k" d( d 所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。5 |( C* t7 L! S ( w* R' S( O* y( v/ j 三、单独的位设置或位清除+ H2 s' Y; K) T9 ?8 A 当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。( W* R3 s! _0 C3 G, g/ [$ b3 R; u! Y + y* c$ N! k: L0 x$ g) w 这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。 - v( e7 j" @& M: N0 s/ B- V 3 J$ X3 ~) R/ q 四、外部中断/唤醒线 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。 * F# `9 d/ G1 Z, u8 v# [ 五、复用功能(AF) 使用默认复用功能前必须对端口位配置寄存器编程。' @9 ~. f0 R- a& }: }, ]1 @ 对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动 对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。 对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。 9 ~' B, y$ b5 S7 b* s- _ 六、软件重新映射I/O复用功能; r) }8 ?( j/ v5 q6 X 为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。 七、GPIO 锁定机制 锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。2 l/ j0 I; @2 e/ b ) k. h7 n' c3 F6 @1 v# Y 八、输入配置# k1 _9 k8 P9 d- { 当I/O端口配置为输入时:、 输出缓冲器被禁止 施密特触发输入被激活 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接2 I `4 k; T- b9 P: C 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器 对输入数据寄存器的读访问可得到I/O状态9 n5 g$ b) I( i7 ` , G8 A2 ]% t$ ?+ u# q 下图给出了I/O端口位的输入配置
九、输出配置 当I/O端口被配置为输出时: 输出缓冲器被激活 开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。+ I9 S& p. k# P# k8 ?* Y( Z 推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。 施密特触发输入被激活7 f1 I9 ? L3 s$ B* e2 s$ C 弱上拉和下拉电阻被禁止9 X$ q8 D, `( p: D8 u 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器 G& k8 N, v: ]2 W 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态4 T9 t* _; w4 y, r 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值 下图给出了I/O端口位的输出配置
十、复用功能配置2 d0 |" s6 J' N D 当I/O端口被配置为复用功能时: 在开漏或推挽式配置中,输出缓冲器被打开、% P# D2 x, x4 y8 s( @ 内置外设的信号驱动输出缓冲器(复用功能输出)# x) L" d" X! V: p3 w" Q 施密特触发输入被激活) \) W$ [) U' q# a8 a; W$ @* H 弱上拉和下拉电阻被禁止 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器 开漏模式时,读输入数据寄存器时可得到I/O口状态3 \& W5 s; r/ | 在推挽模式时,读输出数据寄存器时可得到最后一次写的值& W" h+ R9 I5 }: ^% s 6 E. m# W3 [, M d9 S, d 下图给出了复用功能配置图片9 k6 L+ j# ~; `9 f. b * L" A. T( S+ _ H# o
2 Q6 f2 A( ?% P1 ]2 k( @1 O 十一、模拟输入配置 当I/O端口被配置为模拟输入配置时:- Z5 j9 X: T5 @/ a6 |8 A# R. O 输出缓冲器被禁止; 禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;! Q+ V/ d; _0 x$ s2 `9 A8 P 弱上拉和下拉电阻被禁止;3 i% K& w' r- h 读取输入数据寄存器时数值为’0’。; ]# e0 `* r3 q% D 下图示出了I/O端口位的高阻抗模拟输入配置:6 p% \! x' t0 G1 _0 ]/ _+ H; p # ?; G, ~3 W& {1 H8 L/ w 转载自: 嵌入式产品侠) V$ l3 D- T1 R+ E. |. t2 x 如有侵权请联系删除3 v1 ~; ]$ t7 ?" j |
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
STM32L562DK探索板——继续深入了解Audio Play的工作流程
STM32L562DK探索板——触摸菜单实验之触摸测试
STM32L562DK探索板——触摸菜单实验之LED闪烁
STM32L562DK探索板——给Audio Play添加音量控制功能
STM32L562DK探索板——重写Led闪烁demo
STM32L562DK探索板——触摸菜单的实验
STM32L562DK探索板——简单的显示变量函数
经验分享 | STM32 IAP应用时的跳转注意事项
实战经验 | 碰到hardfault问题你还在死磕代码吗?
微信公众号
手机版