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口通过一个电阻与电源相连,则没按下时为高电平,按下即为低电平. 输入下拉:同理 ...
随机推荐
- ubuntu下安装mysql及卸载mysql方法
1. 删除mysql a. sudo apt-get autoremove --purge mysql-server-5.0 b. sudo apt-get remove mysql-server c ...
- 关于CDN的认识
传统的未加缓存服务的访问过程: 用户提交域名→浏览器对域名进行解释→得到目的主机的IP地址→根据IP地址访问发出请求→得到请求数据并回复 由上可见,用户访问未使用CDN缓存网站的过程为: 1).用户向 ...
- 数据库模型设计PowerDesigner
Power Designer 是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,他几乎包括了数据库模型设计的全过程.利用Power Designer可以制作数据流程图.概 ...
- 翻译:打造Edge渲染内核的浏览器
最近开始了解UWP和Edge内核,在微软技术博客中找到一篇文章,主要是介绍Edge渲染内核使用技术.顺手翻译了一下.不对之处请斧正! Over the past several months, we ...
- MysqlWorkbench连接远程数据
- GIT学习
git init git add . git commit -m "" git status git diff 工作区->版本库->暂存区stage.master分支. ...
- UML大战需求分析——阅读笔记02
类图是理解面向对象思想的强有力工具,也是业务概念模型分析中最常用的一种UML图.对开发人员来说,并不是对每一个业务流程都很熟练,在客户那里传达过来的需求资料中,有很多术语会把思绪搞晕,他们之间错综复杂 ...
- ActiveMQ开发与简介
1.概述与介绍 ActiveMQ是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ是一个完全支持JMS1.1和J2EE1.4规范的JMSProvider实现.提供 ...
- C++ 在文本文件后追加写入字符串
下面的代码起到这样一个作用: 如果有flow.txt文件,则打开该文件,在文件中继续写入字符串: 如果没有该文件,则创建该文件并写入. #include<string> #includ ...
- Nginx负载均衡
负载均衡(做分发服器)1.基于浏览器的分发基于浏览器的分发,按照在不同平台的浏览器请求进行分发,比如手机浏览器讲究资源小速度快节省流量,所以将自手机浏览器的请求分发到专供处理移动平台的web服务器上, ...