啊哈、没办法、外国人的芯片就喜欢用英文来命名,所以中文的:通用输入/输出  就用GPIO来代替、、谁叫哥们都不是外国人呢、好啦、胡扯了一下,借用唐伯虎点秋香的话:小小书童,可笑可笑、、、

知道了GPIO的含义了吧、、还是老规矩:不知道的,拉出去调戏十分钟、知道的、再赏美女十个、不介意吧、

在STM32中,根据“葵花宝典”中第STM32篇参考手册中,GPIO有以下几种模式:

 typedef enum
{ GPIO_Mode_AIN = 0x0, //模拟输入
GPIO_Mode_IN_FLOATING = 0x04, //浮空输入
GPIO_Mode_IPD = 0x28, //下拉输入
GPIO_Mode_IPU = 0x48, //上拉输入
GPIO_Mode_Out_OD = 0x14, //开漏输出
GPIO_Mode_Out_PP = 0x10, //推挽输出
GPIO_Mode_AF_OD = 0x1C, //开漏复用功能
GPIO_Mode_AF_PP = 0x18 //推挽复用功能
}GPIOMode_TypeDef;

亲们、、千万别这些模式吓到了、、很陌生吧、、当然、、像我这种菜鸟刚开始接触是很陌生的、、但是只要接触多了、、相信也不会陌生的、、正所谓生米也会煮成熟饭的嘛是吧、、

模拟输入:实际控制中,关闭了上端的施密特触发器以及输出驱动器,让模拟信号仅能通过管脚流入片内模拟输入端,有可能有上拉电阻,起到阻抗匹配的作用,

模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电。

浮空输入:浮空嘛、这种“克服重力”的特殊“人类”、、也就是说脚不沾地、、理解起来就是什么都不接,手接触时人感应引脚,可能低也可能高,这个就不好说啦、人体可是个大电容呀、、浮空输入_IN_FLOATING ——可以做KEY识别,RX1

下拉输入/上拉输入:DOWN中文即是下拉、UP中文即是上拉、为什么是要用上拉和下拉呢?应该是起到稳定信号的作用吧、这里说点题外话:其实我本人是搞不清楚当初第一个中国人和第一个外国人是怎么交流的,第一个英语单词是怎么翻译成中文的、、可以做KEY识别,像原子战舰板中按键原理图(版权不是我的,我借用哈、、别告我侵权哈、、阿弥陀佛):

这里我们要来怎么配置其模式呢??其实我知道有些人(包括我,我当初是不知道的)并不知道为什么要设置为上拉输入又或者是下拉输入,啊哈,请看以下代码和注释:(仅代表本人看法,如有雷同,不胜荣幸)

 void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_KEY; //定义结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE, ENABLE); //打开时钟 GPIO_KEY.GPIO_Pin = GPIO_Pin_0;
//GPIO_KEY.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_KEY.GPIO_Mode = GPIO_Mode_IPD; //按键被按下时端口被拉高,所以要设置为下拉输入
GPIO_Init(GPIOA, &GPIO_KEY); GPIO_KEY.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
//GPIO_KEY.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_KEY.GPIO_Mode = GPIO_Mode_IPU; //按键被按下时端口被拉低,所以要设置为上拉输入
GPIO_Init(GPIOE, &GPIO_KEY); }

开漏输出:相当于三极管集电极,要得到输出高电平需上拉电阻若输出低电平则吸电流能力强,开漏输出_Out_OD——应用于I2C总线; (STM32开漏输出若外部不接上拉电阻只能输出0)

接下来,目前我用的最多就是推挽输出啦、、一般用来匹配电压,或者提高IO口的驱动能力,在stm32中当然是为了提高其驱动能力而设定的(参考糊里糊涂学stm32)。

以上的以何种模式由GPIO寄存器来决定,如下表:

对了,32里还有一个IO口的输出速度的设置,神奇吧,不要觉得郁闷,任何东西诞生都有它的道理,只要知道和接受它就行了,如表:

(以下这段话摘自别人,请谅解,本人知识有限,还尚未完全理解这段话)   又称输出驱动电路的响应速度:(芯片内部在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;  //定义结构体

再者,需要打开对应的时钟,比如GPIO口的时钟都是挂在APB2上的,如图:

接下来对其初始化、、、举例如下:

另附系统时钟图:

好啦、、、在写的时候写到一半跑去调小车了、、飞思卡尔也很坑爹、、不过经过自己的一番整理,到此写完了、、小弟不才、、我知道写得不够全面,但是我已经把我知道的所领悟的写出来了、、等日后还有相关想法的顿悟时会来补充、、希望看到这篇博客的不管高手和菜鸟、我在此都虚心向您请教、、有什么说得不全面说得不好或者说错的请像抓腐败那样毫不留情的指出来、、小弟不甚感激、、希望初学者能看得懂、、、

STM32之GPIO操作的更多相关文章

  1. STM32基本GPIO操作:按键输入(扫描+外部中断)

    (涉及专有名词较多,难免解释不到位,若有错误还请指出,谢谢!) 硬件连接图如下: 一.扫描 思路是在main函数中通过死循环来扫描端口电平状态检测,以此判断按键是否按下.实现较为简单. 1.初始化(注 ...

  2. STM32基本GPIO操作:点灯(库函数+寄存器)

    社团作业=_= 开发版上的LED灯负极连接在PB5口,正极串联一510Ω电阻后与3.3V相连 若开发板不带LED灯则需要自行连接,务必串联一个合适的电阻防止LED灯烧坏 零.一个有趣的延时函数 来自于 ...

  3. STM32 常用GPIO操作函数记录

    STM32读具体GPIOx的某一位是1还是0 /** * @brief Reads the specified input port pin. * @param GPIOx: where x can ...

  4. STM32标准库GPIO操作

    STM32标准库GPIO操作 STM32任何外围设备的使用都分为两部分:初始化和使用.体现在代码上就是:(1)有一个初始化函数(2)main函数中的使用 1.初始化GPIO 初始化GPIO函数代码: ...

  5. STM32的GPIO口的输出开漏输出和推挽输出

    本文来自cairang45的博客,讲述了STM32的GPIO口的输出开漏输出和推挽输出, 作者博客:http://blog.ednchina.com/cairang45 本文来自: 高校自动化网(Ww ...

  6. STM32的GPIO使用的函数剖析

    转载http://blog.csdn.net/wuwuhuizheyisheng/article/details/8239599 STM32的GPIO总结 作者:JCY 该文是自己学习了一段STM32 ...

  7. STM32串口寄存器操作(转)

    源:STM32串口寄存器操作 //USART.C /************************************************************************** ...

  8. linux 标准 GPIO 操作

    Linux 提供了GPIO 操作的 API,具体初始化及注册函数在 driver/gpio/lib_gpio.c 中实现.   #include    int gpio_request(unsigne ...

  9. stm32之GPIO(二)

    输入上拉:当IO口作为输入时,比如按键输入,而按键是与地连接,按下时为低电平,则没按下时该IO口应为高电平,上拉即是该IO口通过一个电阻与电源相连,则没按下时为高电平,按下即为低电平. 输入下拉:同理 ...

随机推荐

  1. XML-->DTD&Schema Notes

     The need for XML “schemas” •Unlike any other data format, XML is totally flexible, elements can be ...

  2. Idea 开发 web项目

    1.经历 很久没有搞 web 项目了,最近一段时间搞过很多次了,但是总是在 mac 上部署失败. 2.方法: 用idea 新建一个模板的 Spring MVC 项目,部署就可以了. 3.参考: htt ...

  3. MySQL replace into 使用详解 及 注意事项

    REPLACE的运行与INSERT很相似.只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除.注意:除非表 ...

  4. Shell入门教程:Shell变量

    变量 是一种很“弱”的变量,默认情况下,一个变量保存一个串,Shell不关心这个串是什么含义.所以若要进行数学运算,必须使用一些命令例如 let.declare.expr.双括号等. Shell变量可 ...

  5. js判断本地是否安装app

    var ua = navigator.userAgent.toLowerCase(); 1.判断是否是微信 function isWeixinBrowser() { return (/micromes ...

  6. iphone的click导致div变黑

    -webkit-tap-highlight-color这个属性只用于iOS (iPhone和iPad).当你点击一个链接或者通过Javascript定义的可点击元素的时候,它就会出现一个半透明的灰色背 ...

  7. word20161209

    failback / 故障回复 failback policy / 故障回复策略 failed / 失败 failover / 故障转移 failover policy / 故障转移策略 failov ...

  8. JS常见错误和分析

    列举一些在前端开发中遇到的一些错误信息和解决办法 错误信息 解决办法 Uncaught SyntaxError: Unexpected token o 使传入的字符串不是符合严格的JSON格式会抛出异 ...

  9. linux常用命令积累

    1.jps jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/u ...

  10. centOS 虚拟机设置固定IP:图形化设置

    右键单击图形化标志,Edit Connection 设置一下就可以了.