实验室第二次博客作业。
本文指的是STM32的GPIO。
GPIO定义
GPIO(英文:General-Purpose Input /Output Ports)是STM32的通用引脚,工程师们一般通过对GPIO的引脚进行操作比如配置来“玩”单片机。
GPIO的基本结构:
GPIO的8种输入输出模式
STM32的GPIO支持4种输入模式(浮空输入、上拉输入、下拉输入、模拟输入)和4种输出模式(开漏输出、开漏复用输出、推挽输出、推挽复用输出)。同时,GPIO还支持三种最大翻转速度(2MHz、10MHz、50MHz)。
代码 | 模式 |
GPIO_Mode_IPU | 上拉输入 |
GPIO_Mode_AIN | 模拟输入 |
GPIO_Mode_IN_FLOATING | 浮空输入 |
GPIO_Mode_IPD | 下拉输入 |
GPIO_Mode_Out_OD | 开漏输出 |
GPIO_Mode_Out_PP | 推挽输出 |
GPIO_Mode_AF_OD | 复用开漏输出 |
GPIO_Mode_AF_PP | 复用推挽输出 |
下面详细介绍这八种输入输出模式:
上拉输入模式
上拉输入模式下输入引脚数据为1,高电平。VDD导通(上拉电阻导通),VSS断开(下拉电阻断路)
上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空的情况下,输入端的电平保持在高电平;并且在I/O端口输入为低电平的时候,输入端的电平也是低电平。
下拉输入模式
下拉输入模式下输入引脚为0,低电平。VDD断开(上拉电阻断路),VSS导通(下拉电阻导通)
下拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空的情况下,输入端的电平保持在低电平;并且在I/O端口输入为高电平的时候,输入端的电平也是高电平。
浮空输入模式
浮空输入模式下,VDD和VSS均断开,I/O端口的电平信号直接进入输入数据寄存器。也就是说,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。
这种配置一般不用(比较危险),初学者里IIC、USART用的挺多
模拟输入模式
模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,这种ADC模块用的比较多
开漏输出模式
开漏输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经N-MOS管,最终输出到I/O端口。而当设置输出的值为高电平的时候,N-MOS管处于关闭状态,此时I/O端口的电平就不由输出的高低电平决定而由I/O端口外部的上拉或者下拉决定;当设置输出的值为低电平的时候,N-MOS管处于开启状态,此时I/O端口的电平为低电平。同时,I/O端口的电平也可以通过输入电路进行读取。
开漏输出模式下可以输出0和1,适用于电平的不匹配场合。
开漏复用输出模式
开漏复用输出模式只输出的高低电平的来源不让CPU直接写输出数据寄存器,而这是利用片上外设模块的复用功能输出来决定。
推挽输出模式(这种模式非常常用)
推挽输出模式下(P-MOS管+N-MOS管),通过设置位设置/清除寄存器或者输出数据寄存器的值,途经P-MOS管和N-MOS管,最终输出到I/O端口。同时,I/O端口的电平也可以通过输入电路进行读取;此时I/O端口的电平一定是输出的电平。
可以输出高低电平0和1,适用于双向IO的使用。
推挽复用输出模式
推挽复用输出模式,与推挽输出模式类似。只是输出的高低电平的来源,而不是让CPU直接写输出数据寄存器,而这是利用片上外设模块的复用功能输出来决定的。
GPIO的配置方法(库函数版本)
要使用GPIO,则需要对其进行配置,配置步骤如下:
配置时钟并使能,选择引脚,配置引脚模式和引脚翻转速度,最后调用库函数初始化GPIO
对于初学者来说,时钟配置就是不断在library和函数里复制搬运,CtrlC+V;
时钟使能函数:
RCC_APBXPeriphClockCmd()这个函数叫做使能或失能APBX外设时钟,在library复制来之后直接用就行。括号里面就是使能的外设时钟。
时钟配置之后,选择一下你要使用的管脚,多个管脚可以用或符号(“ | ")隔开。
一般来说用先定义一个结构体,初学者可能会觉得就配置个函数过程也太复杂了。的确,可能开始感觉太过繁琐,但到后面配置AFIO等复杂的时候将会体会到好处,这也是标准化的体现
/*选择要控制的GPIOX引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_n;
配置引脚模式:
用到这个函数
GPIO_InitStructure.GPIO_Mode
/*e.g:设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
配置输入输出模式有下面几点值得注意:
作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。
作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。
作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。
作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。
设置引脚翻转速度:
用到这个函数
GPIO_InitStructure.GPIO_Speed;
/*e.g:设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
调用通用的库函数
调用通用的库函数,将上面的配置写入芯片,初始化GPIO(这个Init类型的函数在后面将会十分常见);
用到这个函数
GPIO_Init
/*e.g:调用库函数,初始化GPIOA*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
到此为止,都属于GPIO配置函数里面的内容,配置完GPIO,就可以让他输出高低电平了。