啊哈、没办法、外国人的芯片就喜欢用英文来命名,所以中文的:通用输入/输出  就用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. ActiveMQ支持的传输协议

    ------------------------------------------------------ ActiveMQ支持的client-broker通讯协议有:TCP.NIO.UDP.SSL ...

  2. Excel 实用技巧之一

    1.在单元格内换行: Alt+Enter 2.合并其他单元格文字并换行: A1&char(10)&B1 3.Excel计算样本估算总体方差:STDEV/STDEVA(),分母为n-1. ...

  3. PHP计算一年有多少周,每周开始日期和结束日期

    一年有多个周,每周的开始日期和结束日期 参考代码一:[正在使用的版本] <?php header("Content-type:text/html;charset=utf-8" ...

  4. H5案例分享:移动端滑屏 touch事件

    移动端滑屏 touch事件 移动端触屏滑动的效果的效果在电子设备上已经被应用的越来越广泛,类似于PC端的图片轮播,但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch ...

  5. Maven No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 问题

    maven编译项目时出错,提示信息如下: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3 ...

  6. angularjs之ng-bind和ng-model

    1.为什么其他标签可以用ng-bind ,而input标签要用ng-model 这就是所谓的数据双向绑定,input是用于用户输入的,数据要从View传输到Controller中,而{{}}和ng-b ...

  7. MongoDB C Driver使用教程

    MongoDB C Driver使用教程 转载请注明出处http://www.cnblogs.com/oloroso/ 本指南提供简介 MongoDB C 驱动程序. 在 C API 的详细信息,请参 ...

  8. sqlserver中分区函数 partition by的用法

    partition  by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录, partition  by ...

  9. libevent在windows平台下通过vs进行编译

    1.vs中新建一个静态库项目 2.配置头文件目录,将./compat../include../WIN32-Code三个目录添加到文件目录中 3.用记事本打开Makefile.nmake文件,可以看到里 ...

  10. 3.EasyUI学习总结(三)——easyloader源码分析

    easyloader模块是用来加载jquery easyui的js和css文件的,即easyloader可以在调用的时候自动加载当前页面所需的文件,不用再自己引用, 而且它可以分析模块的依赖关系,先加 ...