你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32之GPIO操作

[复制链接]
STMCU小助手 发布时间:2022-1-16 16:55
在STM32中,根据“葵花宝典”中第STM32篇参考手册中,GPIO有以下几种模式:
  1. 1 typedef enum8 d. a  n- N6 Y
  2. 2 { GPIO_Mode_AIN = 0x0,                             //模拟输入
    % v0 C4 _5 A8 x
  3. 3   GPIO_Mode_IN_FLOATING = 0x04,           //浮空输入
    4 H) u  q% ?" g# E
  4. 4   GPIO_Mode_IPD = 0x28,                            //下拉输入   
    / b- R: Z- j# l2 r0 p! E+ T
  5. 5   GPIO_Mode_IPU = 0x48,                           //上拉输入
    5 s2 t* Q( D# ~7 h; e
  6. 6   GPIO_Mode_Out_OD = 0x14,                   //开漏输出' F4 e4 b' ]7 f8 u. F% `, B
  7. 7   GPIO_Mode_Out_PP = 0x10,                   //推挽输出3 e% ?* k4 s; `. ?( _  |7 }  _: N
  8. 8   GPIO_Mode_AF_OD = 0x1C,                   //开漏复用功能: [. e; U4 C6 `. D
  9. 9   GPIO_Mode_AF_PP = 0x18                     //推挽复用功能; z) v# F. T8 L. j
  10. 10 }GPIOMode_TypeDef;
复制代码
& J# B+ Y6 j+ E1 j
    亲们、、千万别这些模式吓到了、、很陌生吧、、当然、、像我这种菜鸟刚开始接触是很陌生的、、但是只要接触多了、、相信也不会陌生的、、正所谓生米也会煮成熟饭的嘛是吧、、
   模拟输入:实际控制中,关闭了上端的施密特触发器以及输出驱动器,让模拟信号仅能通过管脚流入片内模拟输入端,有可能有上拉电阻,起到阻抗匹配的作用,   
   模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电。
. Z9 u. P1 j+ X* o* l
191025341193311.png
+ Z8 ?- i  _6 i% c  f
    浮空输入:浮空嘛、这种“克服重力”的特殊“人类”、、也就是说脚不沾地、、理解起来就是什么都不接,手接触时人感应引脚,可能低也可能高,这个就不好说啦、人体可是个大电容呀、、浮空输入_IN_FLOATING ——可以做KEY识别,RX1
    下拉输入/上拉输入:DOWN中文即是下拉、UP中文即是上拉、为什么是要用上拉和下拉呢?应该是起到稳定信号的作用吧、这里说点题外话:其实我本人是搞不清楚当初第一个中国人和第一个外国人是怎么交流的,第一个英语单词是怎么翻译成中文的、、可以做KEY识别,像原子战舰板中按键原理图(版权不是我的,我借用哈、、别告我侵权哈、、阿弥陀佛):
7 U1 [" F6 Z; R6 {% i' ^% f6 F
191036548856833.png
7 _$ ?: L# ~" U2 x' [
这里我们要来怎么配置其模式呢??其实我知道有些人(包括我,我当初是不知道的)并不知道为什么要设置为上拉输入又或者是下拉输入,啊哈,请看以下代码和注释:(仅代表本人看法,如有雷同,不胜荣幸)
  1. 1 void KEY_Init(void)7 h2 s3 u4 B- F# m
  2. 2 {
    5 L6 [8 W( D+ W$ i3 d8 X% s
  3. 3   GPIO_InitTypeDef  GPIO_KEY;  //定义结构体
    - P- m& V. J2 @% ?
  4. 4      ! {. F5 n; V' k8 U
  5. 5     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE, ENABLE); //打开时钟) |, Q5 l) y, j' g
  6. 6     ( q- C* C. Y* r3 P, ?
  7. 7     GPIO_KEY.GPIO_Pin = GPIO_Pin_0;+ P# p7 y7 s( T6 b1 J
  8. 8     //GPIO_KEY.GPIO_Speed = GPIO_Speed_50MHz;; @$ n$ v/ k: E" S# p+ `; s
  9. 9     GPIO_KEY.GPIO_Mode = GPIO_Mode_IPD;               //按键被按下时端口被拉高,所以要设置为下拉输入
    ) n! S5 z/ A. _3 _
  10. 10     GPIO_Init(GPIOA, &GPIO_KEY);) B) T3 n5 H" B* ?
  11. 11     9 l) ^7 y7 y. K9 ^0 R: X
  12. 12     GPIO_KEY.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;  E. M' y- `' E# H
  13. 13     //GPIO_KEY.GPIO_Speed = GPIO_Speed_50MHz;5 u  C, e- W0 i$ i# f/ ]
  14. 14     GPIO_KEY.GPIO_Mode = GPIO_Mode_IPU;               //按键被按下时端口被拉低,所以要设置为上拉输入
    " l, p9 n& T0 G2 c
  15. 15     GPIO_Init(GPIOE, &GPIO_KEY);    : t1 H& @4 r( b& D+ S% u" r
  16. 16 * k1 F  ]+ ^' [  V( }1 n
  17. 17 }
复制代码
) R, e9 b( Z3 ^' L4 |) Y
    开漏输出:相当于三极管集电极,要得到输出高电平需上拉电阻若输出低电平则吸电流能力强,开漏输出_Out_OD——应用于I2C总线; (STM32开漏输出若外部不接上拉电阻只能输出0)
    接下来,目前我用的最多就是推挽输出啦、、一般用来匹配电压,或者提高IO口的驱动能力,在stm32中当然是为了提高其驱动能力而设定的(参考糊里糊涂学stm32)。
    以上的以何种模式由GPIO寄存器来决定,如下表:

4 P) }2 ]' t5 |2 Q1 R
191354561354711.png

3 V7 i( G5 v( `/ }4 k8 w: T4 R9 ~
    对了,32里还有一个IO口的输出速度的设置,神奇吧,不要觉得郁闷,任何东西诞生都有它的道理,只要知道和接受它就行了,如表:

9 |8 ^) }9 E9 b7 i7 f# {, s+ I
191358040101615.png
  
      (以下这段话摘自别人,请谅解,本人知识有限,还尚未完全理解这段话)   又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。)
    可理解为: 输出驱动电路的带宽:即一个驱动电路可以不失真地通过信号的最大频率。(参考信号与系统)
(如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。失真因素?)
如果信号频率为10MHz,而你配置了2MHz的带宽,则10MHz的方波很可能就变成了正弦波。就好比是公路的设计时速,汽车速度低于设计时速时,可以平稳地运行,如果超过设计时速就会颠簸,甚至翻车。
关键是: GPIO的引脚速度跟应用相匹配,速度配置越高,噪声越大,功耗越大。
带宽速度高的驱动器耗电大、噪声也大,带宽低的驱动器耗电小、噪声也小。使用合适的驱动器可以降低功耗和噪声
比如:高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。关键是GPIO的引脚速度跟应用匹配(推荐10倍以上?)。
比如:
① USART串口,若最大波特率只需115.2k,那用2M的速度就够了,既省电也噪声小。
② I2C接口,若使用400k波特率,若想把余量留大些,可以选用10M的GPIO引脚速度。
③ SPI接口,若使用18M或9M波特率,需要选用50M的GPIO的引脚速度。
(2). GPIO的翻转速度指:输入/输出寄存器的0 ,1 值反映到外部引脚(APB2上)高低电平的速度.手册上指出GPIO最大翻转速度可达18MHz。
(3).GPIO 输出速度:与程序有关,(程序中写的多久输出一个信号)。
2、GPIO口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。
3、在复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式。
4、所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。
5、GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。
(以上为摘抄,敬请原谅)
   在编写IO口的程序时,必须先定义一个结构体(至于为什么要定义一个结构体?不懂的人可以去翻翻c语言的结构体的相关知识)
GPIO_InitTypeDef  GPIO_KEY;  //定义结构体
7 W7 K8 B( }  C
8 S, Y1 W. p! M1 ]再者,需要打开对应的时钟,比如GPIO口的时钟都是挂在APB2上的,如图:
% E! A. c9 P2 m 191404391977848.png
) h# V2 R; f! }" @7 e
; D0 u/ L1 c+ k3 y! E- ~8 a
接下来对其初始化、、、举例如下:
* Z0 T- ?' o. L' }6 Q: g& x  B
191410029633837.png 3 f' D+ f1 s( W: c; }$ d
" l  U. ]' T6 t) S. c' _# o
另附系统时钟图:

% X" R3 c- ]9 c' Y 191411558693409.png
0 N/ P+ ~2 I; A! q- R7 g+ q9 I- }7 U& r
191413263074314.png
: o6 x+ G4 ]% m' m) i4 k2 `7 e2 M0 E5 ?8 C7 Q* T. r
好啦、、、在写的时候写到一半跑去调小车了、、飞思卡尔也很坑爹、、不过经过自己的一番整理,到此写完了、、小弟不才、、我知道写得不够全面,但是我已经把我知道的所领悟的写出来了、、等日后还有相关想法的顿悟时会来补充、、希望看到这篇博客的不管高手和菜鸟、我在此都虚心向您请教、、有什么说得不全面说得不好或者说错的请像抓腐败那样毫不留情的指出来、、小弟不甚感激、、希望初学者能看得懂、、、% W" q9 O+ a( {6 {' h3 u

( g% ^  L; I( K! K6 `% L4 C! ]7 f& o0 k
收藏 评论0 发布时间:2022-1-16 16:55

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版