
一、GPIO功能描述 每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。# H2 w4 z4 H8 L& b5 S& ?; N 输入浮空& t6 k1 a' B+ w4 {5 Y0 z 输入上拉 输入下拉 模拟输入2 Q- @' S1 L4 N' V1 s+ u, H 开漏输出 推挽式输出 推挽式复用功能 开漏复用功能 每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。 图1 I/O端口位的基本结构图片 ![]() 图2 端口位配置表图片# l0 K: W- V7 L6 F5 Y& b8 n 6 Y) E1 A- x4 r" O4 z* p1 \4 I ![]() 9 _: @4 p, C' E z# d q2 d% L 图3 输出模式位$ |# f8 s/ v8 h/ W: u3 T1 b ![]() - I9 x8 [/ v d$ b 二、通用I/O(GPIO) 复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式: e( i; r J% {- W3 G' z! `) r PA15:JTDI置于上拉模式# M! o" `8 e5 c PA14:JTCK置于下拉模式& P$ P, J. E) Z6 g/ n! V( N) N PA13:JTMS置于上拉模式 PB4:JNTRST置于上拉模式. |! O6 ^& y8 c* y/ D! L ) z r1 O: w$ o6 }, B' i- d- b0 I 当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。, C' D' D, i4 K& u+ Y! @% G % l, t. W6 @! b2 X1 C 输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。 所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。 9 A, d! A% h$ y5 a8 W 三、单独的位设置或位清除 当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。 这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。 q. f6 }/ v+ N / \& Z* h4 ^8 b# M9 F( @ 四、外部中断/唤醒线9 ~' z U' s0 v9 r! b0 c' B 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。 , b% y, r7 V& s/ v6 J" G4 ?& x 五、复用功能(AF) 使用默认复用功能前必须对端口位配置寄存器编程。4 N0 s# O$ P, q& {+ G 对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动 对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。 对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。4 m/ }' |1 H: ]' E5 \ 六、软件重新映射I/O复用功能 为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。. S, F b- W+ D4 O( _7 D2 g: [ 七、GPIO 锁定机制9 G, Z8 K) D1 K" W& N9 j- U6 J/ M 锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。 八、输入配置/ u9 @' `$ w! b; P 当I/O端口配置为输入时:、 输出缓冲器被禁止: }/ E5 x: R! Y6 T* |. s 施密特触发输入被激活 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器! u- M0 j$ `) W. I$ X 对输入数据寄存器的读访问可得到I/O状态 9 C! v$ x, z- T1 s! y 下图给出了I/O端口位的输入配置 ![]() 九、输出配置 当I/O端口被配置为输出时:( C9 ?$ s/ V l$ d% G 输出缓冲器被激活; N" s% s% j2 L; j/ t0 n- I 开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。 推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。 施密特触发输入被激活 弱上拉和下拉电阻被禁止 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器$ V5 y' f9 T6 z$ B 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态6 f' I( ?( g7 H8 u# D4 q 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值4 v$ m6 _5 o- q2 @/ S) h 下图给出了I/O端口位的输出配置" w* a5 d6 }( Z4 _9 j4 N ![]() 2 U5 X* X" l- w+ K( {1 V" k0 V 十、复用功能配置2 i5 l* J2 H, v6 g, g/ a0 _7 V 当I/O端口被配置为复用功能时:/ n7 q6 n% E4 l4 q3 s3 h1 ?+ a 在开漏或推挽式配置中,输出缓冲器被打开、 内置外设的信号驱动输出缓冲器(复用功能输出) 施密特触发输入被激活 弱上拉和下拉电阻被禁止 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器 开漏模式时,读输入数据寄存器时可得到I/O口状态4 k% g/ p' W! [- W1 J6 b) d H 在推挽模式时,读输出数据寄存器时可得到最后一次写的值 2 W, ]( h; \3 a0 I- \* S$ H- o 1 p8 @7 D$ l/ l p 下图给出了复用功能配置图片1 _3 g) a; h2 k' W3 ^' ` 7 B) G+ M- Y* T, X. Z+ M5 c ![]() 十一、模拟输入配置 当I/O端口被配置为模拟输入配置时:! s& \/ N: d# t' y/ Z: e 输出缓冲器被禁止; 禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;9 _; Y1 f9 O- [+ z E 弱上拉和下拉电阻被禁止;3 v9 n9 C C2 ]& Y5 G 读取输入数据寄存器时数值为’0’。 下图示出了I/O端口位的高阻抗模拟输入配置: 8 \0 d3 f9 ^- b k 转载自: 嵌入式产品侠 @! Z2 Q W4 O0 { 如有侵权请联系删除 |
实战经验 | RT-Thread环境下Flash错误标志问题解析
OpenBLT移植到STM32F405开发板
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
【STM32H7S78-DK评测】XIP项目源码分析
基于STM32单片机软硬件结合经验分享
【NUCLEO-C0评测】硬件OLED显示
基于STM32代码的启动过程经验分享
ClassB在STM32CubeIDE上的移植可能遇到的问题
基于STM32看似无法唤醒的一种异常现象经验分享
【我的STM32U5 项目秀】+02-STM32U5利用LL库点灯