STM32F103ZET6+GPIO(通用输入/输出)讲解

STM32F103ZET6+GPIO(通用输入/输出)讲解

GPIO(General Purpose Input/Output,通用输入/输出)是微控制器最基本的片上外设,微控制器通过GPIO实现与外界的信息交换。
微控制器的I/O引脚既可以感知外界的信息/信号(I/O引脚的输入模式),又可以操控某个外部设备(I/O引脚的输出模式)

一、GPIO用途

嵌入式MCU(单片机)开发中,有一些经常用到的功能模块,如LED、按键、蜂鸣器、继电器等,这些外设功能模块控制简单,通常只需要将引脚与MCU 连接,并将对应引脚设置为高电平或低电平即可工作,除此之外,还有一类外设需要多个引脚通过“协议”的方式协同完成复杂功能,如 UART、IIC接口等。为减少芯片引脚数量和降低功耗,现今芯片的设计大都采用复用技术,使得大部分引脚兼有简单(通用)和复杂(专用)功能,当使用引脚的通用功能时,采用GPIO接口,GPIO接口(有时也称作端口)是MCU与外设进行信息交换的通道和桥梁。

二、GPIO工作模式

STM32F103系列微控制器的I/O引脚共有8种工作模式,其中4种输出模式如下。
(1)推挽输出模式
(2)开漏输出模式
(3)复用推挽输出模式
(4)复用开漏输出模式
另外,4种输入模式如下。
(1)上拉输入模式
(2)下拉输入模式
(3)浮空输入模式
(4)模拟输入模式

使用推挽输出模式的目的是增大输出电流,即提高输出引脚的驱动能力,提高电路的负载能力和开关的动作速度。IIC等总线的通信I/O引脚常设置为开漏输出模式。浮空输入模式下的引脚电平是不确定的,即外部信号是什么电平,MCU引脚就输入什么电平。一般用于USART或IIC等的通信协议。模拟输入模式,其典型应用是A/D模拟输入,实现对外部信号的采集。

三、GPIO输出速度

当STM32的I/O引脚工作在输出模式下时,需要设置I/O引脚的输出速度,该输出速度并不是输出信号的速度,而是指I/O口驱动电路的响应速度。

STM32F103系列微控制器I/O引脚的输出速度有3种选择:2MHz、10MHz、50MHz。

一般常用的外设(如LED、蜂鸣器等)建议采用2MHz的输出速度,而用IIC、SPI等复用功能的输出引脚时,尽量选择高响应速度,如10MHz或50MHz。

当GPIO引脚设置输入模式时,其内部结构与输出部分是分开的,所以不需要配置I/O引脚的输出速度。

四、GPIO标准外设库接口函数

GPIO标准外设库接口函数主要分为以下三大类。
(1)初始化及复位函数
(2)引脚功能操作函数
(3)外部中断处理函数

类型 函数 功能描述
初始化及复位函数 GPIO_Init( ) 根据GPIO初始化结构参数初始化GPIOx外设寄存器
GPIO_ DeInit( ) 将GPIOx外设寄存器恢复为默认复位值
GPIO_StructInit( ) 初始化GPIO结构体
GPIO_AFIODeInit ( ) 取消所有复用功能
引脚功能操作函数 GPIO_Write ( ) 置位或复位选定的GPIO数据端口
GPIO_ WriteBit( ) 置位或复位选定的GPIO端口引脚
GPIO_ SetBits( ) 置位选定的GPIO端口引脚
GPIO_ResetBits ( ) 复位选定的GPIO端口引脚
GPIO_ReadInputData ( ) 读取选定的GPIO输入端口数据
GPIO_ ReadInputDataBit ( ) 读取选定的GPIO输入端口引脚数据
GPIO_ ReadOutputData( ) 读取选定的GPIO输出端口数据
GPIO_ ReadOutputBit( ) 读取选定的GPIO输出端口引脚数据
外部中断处理函数 GPIO_EXTILineConfig ( ) 外设端口作为中断线配置
GPIO_ EventOutputConfig( ) 事件输出配置

GPIO标准外设库接口函数的源代码在源文件stm32f10x_gpio.c中,其对应的头文件stm32f10x_gpio.h声明了GPIO的所有库函数,共18种。
STM32F103ZET6+GPIO(通用输入/输出)讲解_第1张图片

GPIO_Init( ) 函数用于初始化GPIO,该函数有两个输入参数,第一个参数用于指定GPIO的具体端口x(x=A,B,C,D,E),第二个参数根据GPIO_InitStruct结构体变量中指定的参数初始化GPIO,GPIO_InitStruct是指向GPIO_InitTypeDef结构体的指针,包含GPIO的配置参数,如具体的GPIO引脚、输出速度、GPIO引脚的工作模式等,GPIO_InitTypeDef结构体在stm32f10x_gpio.h中定义。
STM32F103ZET6+GPIO(通用输入/输出)讲解_第2张图片
GPIO_InitTypeDef结构体成员及其取值

GPIO_InitTypeDef 结构体成员 取值范围
GPIO_Pin GPIO_Pin_0 ~ GPIO_Pin_15
GPIO_Pin_All (端口所有引脚)
GPIO_Speed GPIO_Speed_2MHz (最大输出速度为2MHz)
GPIO_Speed_10MHz (最大输出速度为10MHz)
GPIO_Speed_50MHz (最大输出速度为50MHz)
GPIO_Mode GPIO_Mode_AIN (模拟输入模式)
GPIO_Mode_IN_FLOATING (浮空输入模式)
GPIO_Mode_IPD (下拉输入模式)
GPIO_Mode_IPU (上拉输入模式)
GPIO_Mode_Out_OD (通用开漏输出模式)
GPIO_Mode_Out_pp (通用推挽输出模式)
GPIO_Mode_AF_OD (复用开漏输出模式)
GPIO_Mode_AF_PP (复用推挽输出模式)

通过学习以上知识,应该可以看懂之前LED灯的代码了吧

#include "led.h"

void LED_Init(void)
{
 
	GPIO_InitTypeDef GPIO_InitStructure;                  //定义一个GPIO_InitTypeDef类型的结构体变量
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  //开启GPIOB的时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;             //选择要使用的I/O引脚,此处选择PB5引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //设置引脚输出模式为推挽输出模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //设置引脚的输出速度为50MHz
	GPIO_Init(GPIOB,&GPIO_InitStructure);                 //调用初始化库函数初始化GPIOB端口

}

因为LED灯给低电平亮,所以之前让它每隔一段时间,改变它的电平高低,从而实现闪烁

#include "stm32f10x.h"
#include "delay.h"
#include "led.h"


int main(void)
{
		delay_init();
		LED_Init();

		while(1)
		{
			GPIO_SetBits(GPIOB,GPIO_Pin_5);// PB5设置位1,LED灯灭
			delay_ms(1000);  //延时1000ms
			GPIO_ResetBits(GPIOB,GPIO_Pin_5); // PB5设置位0,LED灯亮
			delay_ms(1000);	//延时1000ms
		}
		
}


五、总结

基于标准外设库开发的一般流程:
基于标准外设库的嵌入式系统开发流程如下图所示,首先新建一个工程模板,然后再进行应用程序开发,具体流程可以总结为以下5个步骤。
STM32F103ZET6+GPIO(通用输入/输出)讲解_第3张图片
1.开启系统时钟
STM32时钟系统很复杂,拥有多个时钟源,需要在系统启动函数中确定系统时钟,一般基于STM32标准外设库开发时,默认采用HSE外部高速时间,通过设置得到频率为72MHz的系统时钟

2.确定功能引脚
I/O端口是微控制器与外界进行信息交换与控制的通道。如大量种类繁多的传感器采集到的数据信息,由I/O端口传送给CPU加工处理,处理完毕的信息再经由I/O端口连接LED灯、蜂鸣器和继电器第,进而实现CPU对外界设备的控制。在这个过程中,需要明确具体使用微控制器的哪些I/O引脚,以及这些I/O引脚需要配置的功能

3.初始化外设硬件
(1)开启相应外设时钟。 STM32与51单片机的区别之一在于其时钟源,51单片机只有一个时钟源,而 STM32有多个时钟源,且不同速度的片上外设挂接在速度不同的外设总线上,即低速片上外设连接在低速的APB1总线上,其频率为36MHz,高速片上外设挂接在高速的APB2总线上,其频率为72MHz, STM32允许开发人员根据具体需求关闭或开启相应片上外设的时钟,从而实现低功耗控制。
如 STM32的I/O接口片上外设(GPIOA、GPIOB、GPIOC 等)挂接在 APB2总线上,其频率为72MHz,在用GPIO点亮一个LED灯的实例中,只用到了一个 I/0引脚,即 GPIOB的第5个引脚 PB5,所以只需开启 GPIOB的外设时钟即可,而GPIOA、GPIOC 等/0引脚的外设时钟不需要开启。开启 GPIOB的外设时钟的代码如下:

RCC APB2PeriphclockCmd (RCC APB2Periph_GPIOB,ENABLE);

(2)配置外设功能参数,调用初始化函数,初始化外设相关的参数。 STM32标准外设库通过一系列初始化结构体来完成相应片上外设的功能参数配置。如 GPIO InitTypeDef结构体中包含了GPIO引脚所有的配置特性,通过配置相应I/O引脚的工作模式、输出速度等特性,并利用GPIO InitTvpeDef结构体定义一个结构体变量,即可实现对GPIO引脚的功能配置,然后调用相应的初始化函数,完成相应外设的初始化配置。如 GPIO相应引脚的初始化函数GPIO Tnit0.异步串行通信接口的初始化函数 USART_Init()。

(3)使能相应的外设。 STM32标准外设库对一些功能复杂的片上外设增加了相应的使能函数,这些函数可以使能相应的功能部件,如 DMA 的使能库函数 DMA_Cmd(),若要使
能 DMA1通道4,并开启数据传输,则通过如下语句实现:

DMA Cmd (DMA1Channe14, ENABLE);

4.应用功能实现
在主函数main.c中编写应用程序,根据具体应用需求,通过自定义的功能函数或调用相应的标准外设库提供的函数编程实现相应功能。
如在GPIO点亮LED灯的程序中,通过调用库函数GPIO_SetBits(GPIOB,GPIO_Pin_5)和 GPIO_ResetBits(GPIOB,GPIO_Pin_5)实现对功能引脚 PB5的读/写操作,通过调用GPIO_SetBits(GPIOB, GPIO_Pin_5)库函数实现对PB5引脚置位(高电平)操作,通过调用GPIO_ResetBits(GPIOB,GPIO_Pin_5)库函数实现对 PB5引脚置0(低电平)操作。

5.若有中断,则编写中断服务程序
若应用程序中需要用到中断,则需要在相应的中断服务函数中编写程序,STM32F103系列微控制器的标准外设库中断服务函数在stm32f10x_it.c文件中。

至此,GPIO基本原理已经讲完了

你可能感兴趣的:(STM32F103ZET6开发,stm32,单片机,嵌入式硬件,c语言)