STM32之GPIO操作
啊哈、没办法、外国人的芯片就喜欢用英文来命名,所以中文的:通用输入/输出 就用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操作的更多相关文章
- STM32基本GPIO操作:按键输入(扫描+外部中断)
(涉及专有名词较多,难免解释不到位,若有错误还请指出,谢谢!) 硬件连接图如下: 一.扫描 思路是在main函数中通过死循环来扫描端口电平状态检测,以此判断按键是否按下.实现较为简单. 1.初始化(注 ...
- STM32基本GPIO操作:点灯(库函数+寄存器)
社团作业=_= 开发版上的LED灯负极连接在PB5口,正极串联一510Ω电阻后与3.3V相连 若开发板不带LED灯则需要自行连接,务必串联一个合适的电阻防止LED灯烧坏 零.一个有趣的延时函数 来自于 ...
- STM32 常用GPIO操作函数记录
STM32读具体GPIOx的某一位是1还是0 /** * @brief Reads the specified input port pin. * @param GPIOx: where x can ...
- STM32标准库GPIO操作
STM32标准库GPIO操作 STM32任何外围设备的使用都分为两部分:初始化和使用.体现在代码上就是:(1)有一个初始化函数(2)main函数中的使用 1.初始化GPIO 初始化GPIO函数代码: ...
- STM32的GPIO口的输出开漏输出和推挽输出
本文来自cairang45的博客,讲述了STM32的GPIO口的输出开漏输出和推挽输出, 作者博客:http://blog.ednchina.com/cairang45 本文来自: 高校自动化网(Ww ...
- STM32的GPIO使用的函数剖析
转载http://blog.csdn.net/wuwuhuizheyisheng/article/details/8239599 STM32的GPIO总结 作者:JCY 该文是自己学习了一段STM32 ...
- STM32串口寄存器操作(转)
源:STM32串口寄存器操作 //USART.C /************************************************************************** ...
- linux 标准 GPIO 操作
Linux 提供了GPIO 操作的 API,具体初始化及注册函数在 driver/gpio/lib_gpio.c 中实现. #include int gpio_request(unsigne ...
- stm32之GPIO(二)
输入上拉:当IO口作为输入时,比如按键输入,而按键是与地连接,按下时为低电平,则没按下时该IO口应为高电平,上拉即是该IO口通过一个电阻与电源相连,则没按下时为高电平,按下即为低电平. 输入下拉:同理 ...
随机推荐
- ffmpeg常用转换命令,支持WAV转AMR
音频转换: 1.转换amr到mp3: ffmpeg -i shenhuxi.amr amr2mp3.mp3 2.转换amr到wav: ffmpeg -acodec libamr_nb -i shenh ...
- C# *= 运算顺序
a *= a + b *c; 不管等号右边有没有括号,总是先算右边: 即等价于 a = a *(a + b*c); using System; using System.Collections.Gen ...
- DTD总结
DTD 可以检测 XNM 文档的结构是否正确,就好像文章中用来保证结构正确的语法规则一样. 引入 DTD 1.引入私有的 DTD 文件,URI 可以使相对地址或绝对地址 <!DOCTYPE 根元 ...
- Silicon C8051F340之时钟系统
一.背景 做个记录,以备下次快速开发. 二.正文 C8051F340有一个可编程内部高频振荡器.一个可编程内部低频振荡器.一个外部振荡器驱动电路 和一个4倍时钟乘法器.其中可编程内部高频振荡器在系统复 ...
- Daily Scrum Meeting ——TenthDay
一.Daily Scrum Meeting照片 二.Burndown Chart 新增了几个issues 三.项目进展 1.完成了登录界面与管理员和发布者界面的整合. 2.活动发布者界面的完成 四.问 ...
- 多种JSON格式及遍历方式
/*数组*/ var arr = [["name", "value"], ["name1", "value1"]]; v ...
- Linux 下测试串口的命令microcom
昨天应为要测试主板上的串口,查了一下,可以使用microcom 这条命令进行测试. 命令使用方法很简单: Usage: microcom [-d DELAY] [-t TIMEOUT] [-s SPE ...
- configparser模块
configparser模块 echo $@ $# $? $* configparse用于处理特定格式的文件,其本质上利用open来操作文件(比如配置文件) **********配置文件***** ...
- 【Maven】解决缺少Jar包问题
解决办法:进入项目的根目录(即 pom.xml文件所在的目录)执行:mvn dependency:copy-dependencies完成后进入eclipse,发现项目不再报错前提条件:1,安装了mav ...
- Unity3D NGUI刮刮卡效果
线上效果 确保你的纹理的read/write 是勾选的,纹理格式是 RGBA32的 //代码 using UnityEngine; [RequireComponent(typeof(UITexture ...