一、GPIO功能描述2 d. I( T4 o8 K4 k1 h 每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH) ,两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) ,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。 输入浮空 W q8 b3 L" F5 d3 h0 ?$ E 输入上拉 输入下拉 模拟输入$ _+ e' G" t* t: G 开漏输出' H9 F; ^$ _7 h' L' A' k( w 推挽式输出' j& V4 ^: V/ e9 J. W* Q- R 推挽式复用功能; G" K- Z& k4 K) t. e1 o: C2 W 开漏复用功能 每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问。这 样,在读和更改访问之间产生IRQ时不会发生危险。# g& U" n' `) q' x& E* I, H 图1 I/O端口位的基本结构图片 图2 端口位配置表图片 , T6 a! m5 R4 ~9 w% j* E- }" L! M + v9 N$ Q- s, q2 T0 S! n+ Q 图3 输出模式位 6 E) O5 m+ J( |! l; N 二、通用I/O(GPIO)2 g- U2 ~0 L# ^2 E7 o$ d0 v f- ` 复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:7 w% ~ S5 l. X3 Y* \2 w% c. _1 f PA15:JTDI置于上拉模式 PA14:JTCK置于下拉模式 PA13:JTMS置于上拉模式 PB4:JNTRST置于上拉模式: p3 N; g1 `2 }2 N 9 {) m1 c" g) X+ w5 }; d 当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。* L) a& J0 @8 K 0 I' T$ W6 w# O# T/ }+ E0 ` 输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。 所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。* Q' C8 u4 n% [+ J 3 u( ]; D1 ?! T% v! Q$ g 三、单独的位设置或位清除 当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改 一个或多个位。0 h7 I$ B0 S# j$ m+ z! d" I1 j% L 这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来 实现的。没被选择的位将不被更改。* @6 H# V; {$ P0 h; I 4 D$ Q+ n/ G0 F; z! [+ a 四、外部中断/唤醒线# i( p! r# x; W 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。 8 r, _' M5 q1 ^; @% P7 m( a: x3 l 五、复用功能(AF)6 f# p. g) r7 h/ f/ i0 x" g! ` 使用默认复用功能前必须对端口位配置寄存器编程。 对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动 对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。' s: o5 o0 ?6 u+ N1 r. ? 对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。 六、软件重新映射I/O复用功能2 j: K; @! V- X4 m9 Y 为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。 6 N# }5 A" _- q/ h 七、GPIO 锁定机制6 E8 D u+ a* M3 M 锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将 不能再更改端口位的配置。 1 i2 E* c2 A7 {! X) l3 c 八、输入配置 当I/O端口配置为输入时:、 输出缓冲器被禁止5 U* c& ~4 S7 `1 K+ Y0 S* \% J 施密特触发输入被激活 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器+ S2 y6 T- ^! A, W$ g( U. t- z 对输入数据寄存器的读访问可得到I/O状态 - f$ y2 D( d& \. R 下图给出了I/O端口位的输入配置, ~4 Y8 t* @$ t" T / T! N+ p; T7 w: A2 k 九、输出配置 当I/O端口被配置为输出时:' S- C& C9 W1 e3 a" L 输出缓冲器被激活 开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。 推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。 施密特触发输入被激活0 u- T1 C: ^3 D% U 弱上拉和下拉电阻被禁止 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器1 g6 |# r# j U& W 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值 下图给出了I/O端口位的输出配置 3 s: E I' {) L {8 K 2 {- e% d: }) \5 m 十、复用功能配置; N+ m5 ~+ X2 e. I# g# e 当I/O端口被配置为复用功能时:$ T6 T* h$ O/ v+ P! C1 ?! u 在开漏或推挽式配置中,输出缓冲器被打开、 内置外设的信号驱动输出缓冲器(复用功能输出)+ L( Y i& |; r- b1 L 施密特触发输入被激活5 \. u! N6 t" \' c, F 弱上拉和下拉电阻被禁止 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器 开漏模式时,读输入数据寄存器时可得到I/O口状态 在推挽模式时,读输出数据寄存器时可得到最后一次写的值 + p+ L5 h; |5 n$ j" C& h( ^5 V5 \; h 下图给出了复用功能配置图片0 c# l6 `1 V {6 I% P! ] 十一、模拟输入配置8 R9 K! A4 S# F$ J) P 当I/O端口被配置为模拟输入配置时:' v, h$ O7 A% P) F 输出缓冲器被禁止;# L7 |4 ]- F/ o6 t& \2 T, Q 禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’; 弱上拉和下拉电阻被禁止; 读取输入数据寄存器时数值为’0’。 下图示出了I/O端口位的高阻抗模拟输入配置:! J! \+ }: G% q 转载自: 嵌入式产品侠, }' j1 l. [- T& M 如有侵权请联系删除 6 E2 W# }: K4 F. _: j9 H 2 ^# Y# o: c0 z7 ? |
OpenBLT移植到STM32F405开发板
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
【STM32H7S78-DK评测】XIP项目源码分析
基于STM32单片机软硬件结合经验分享
【NUCLEO-C0评测】硬件OLED显示
基于STM32代码的启动过程经验分享
ClassB在STM32CubeIDE上的移植可能遇到的问题
基于STM32看似无法唤醒的一种异常现象经验分享
【我的STM32U5 项目秀】+02-STM32U5利用LL库点灯
【STM32小技巧】主函数循环&烧录