一、gpio
GPIO指的是通用的输入输出端口,可以由用户通过软件配置的方式来进行控制,GPIO引脚需要和外设连接在一起的,就可以和外设实现通信以及采集数据等功能。
1、GPIO的定义
指的是对芯片的某个引脚进行高低电平的输出,以及可以去检测某个引脚的电平状态。一般电平采用都是TTL电平信号,TTL电平信号规定:+5V等价于逻辑“1”,0V等价于逻辑“0”。
电平其实有一个电平范围:>2.4V就表示高电平,<0.4V就表示低电平。
2、引脚的说明
电源引脚 :VCC、VDD、VSS、VDDA、VSSA、VREF+等属于电源引脚
晶振引脚 :PC14、PC15、PH0、PH1就属于晶振引脚,也可以作为其他的功能使用
复位引脚 :NRST属于复位引脚
BOOT引脚 :BOOT0是专用引脚,BOOT1就属于功能引脚 (设置芯片的自举模式)
GPIO引脚 :芯片一共有144引脚,但是GPIO引脚有114个
下载引脚 :PA13、PA14、PB3、PB4等都属于下载引脚(JTAG、SWD)
二、GPIO外设的使用
GPIO外设的使用一般在实际开发过都是使用函数库开发,提高开发效率,以GPIO外设为例,讲解一下函数库开发的流程。以点亮LED为例
1、分析原理图,找到外设连接的GPIO引脚 LED0 --- PF9
GPIO输出高电平 灯灭
2、函数库帮助手册
我这里用的是st公司的标准库进行学习,一开始我也觉得很难,就是因为没有仔细看st公司的文档,例如我现在介绍的标准库帮助手册。
我们点进目录中的
第一步,定义一个外设的结构体变量 变量命名规则 PPP_InitTypeDef PPP_InitStructure;
每个外设都有对应的结构体,结构体的定义一般都是存放在每个外设的头文件内,比如GPIO外设的初始化结构体就定义在stm32f4xx_gpio.h中。
例:
第二步,在配置外设结构体之前,需要调用库函数打开外设的时钟 如RCC_AHB1PeriphClockCmd
任何一个外设都是由时钟控制的,时钟就相当于外设的开关,因为底层寄存器一般内部结构中都是由触发器组成,而触发器需要触发信号,而触发信号是由时钟提供的。
STM32低功耗的根本原因就是在芯片复位之后,所有的外设的时钟(开关)都是默认关闭,需要用到哪个外设就打开哪个外设的时钟,不需要的就关闭,有利于降低功耗。
例:
第三步,对结构体变量进行赋值:
1、需要指定配置的引脚 GPIO_Pin 定义在GPIO_pins_define (跳转 or 查找)
一个端口有16个引脚,在操作端口的某个引脚的时候,需要说清楚用哪个引脚,这样才可以对寄存器的某些位进行操作。
2、需要指定引脚的模式 GPIO_Mode 定义在GPIOMode_TypeDef (跳转 or 查找)
GPIO的引脚模式可以参考中文参考手册的7.3章节
3、GPIO_PUPD
每个引脚内部都有保护二极管,这也是STM32的安全机制,但是需要注意STM32引脚不是万能的,一般是作为控制使用,而不是作为驱动使用。
每个引脚内部都有上拉电阻和下拉电阻,但是上拉电阻是一个弱上拉(驱动能力较弱),如果想要提供给引脚一个确定的电平,建议外接上拉电阻。
建议大家在没有使用引脚的时候给引脚一个默认的电平状态,可以消除引脚不定值的影响。
GPIO提供了3种输入模式(浮空输入、上拉输入、下拉输入),参考GPIO内部结构示意图。
GPIO提供了4种输出模式(上拉+下拉推挽输出、上拉+下拉开漏输出),参考GPIO内部结构示意图
PMOS管和NMOS管循环依次导通,好处是可以提高电路的负载能力和切换速度,并且可以降低功耗。
4、设置引脚的输出速率 GPIO_Speed 定义在GPIOSpeed_TypeDef
指的是IO驱动电路的输出能力(其实就是在不失真的情况下能输出的最大速率),引脚的输出速率影响GPIO的引脚的功耗和噪声,一般大家可以根据实际需要来选择,速率越高,则功耗越高,噪声越大,如果对产品的实时性要求不高,则选择一个低速的即可,有利于降低EMI(电磁干扰),一般指的是影响引脚在切换高低电平的过程中上升沿和下降沿的陡度。如果自己也不知道选哪个,就选高的。
5、设置引脚的输出类型 GPIO_OType 定义在GPIOOType_TypeDef
推挽输出:可以利用驱动器直接输出高电平和低电平
开漏输出:可以利用驱动器直接输出低电平,但是不能直接输出高电平(需要外接上拉电阻)
6、设置引脚的上下拉电阻 GPIO_PuPd 定义在GPIOPuPd_TypeDef
一般都会在引脚未使用的情况给引脚一个默认的电平状态,防止引脚出现电平不定(高组态)的情况。
今日笔试题:
定义一个函数宏,求x的平方:
答案:
#define SQUARE(x) (x*x)