微机原理及单片机应用技术-GPIO_第1页
微机原理及单片机应用技术-GPIO_第2页
微机原理及单片机应用技术-GPIO_第3页
微机原理及单片机应用技术-GPIO_第4页
微机原理及单片机应用技术-GPIO_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

GPIO8.1GPIO概述8.2利用寄存器直接控制GPIO的应用实例8.3利用库函数控制GPIO的应用实例8.1GPIO概述8.1.1GPIO的概念 1.GPIO是什么 2.STM32引脚分类 3.如何查找GPIO功能

1.GPIO是什么GPIO(generalpurposeintputoutput)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。2.STM32引脚分类电源管脚晶振管脚复位管脚下载管脚BOOT管脚GPIO管脚3.如何查找GPIO功能通过STM32F103ZET6芯片数据手册即可查找本讲主要内容8.1.2GPIO的结构框图

西安文理学院自动化教研室图中最右端I/O端口就是STM32芯片的引脚,其它部分都在STM32芯片内部。上图中我们将每部分都用红线圈起来标号了,按照顺序我们逐一讲解。1.GPIO基本结构

(1)保护二极管引脚内部加上这两个保护二级管可以防止引脚外部过高或过低的电压输入,

当引脚电压高于VDD_FT或VDD时,上方的二极管导通吸收这个高电压,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。(2)上下拉电阻

从图中可以看到,上拉和下拉电阻上都有一个开关,通过配置上下拉电阻开

关,可以控制引脚的默认状态电平。当开启上拉时引脚默认电压为高电平,开启下拉时,引脚默认电压为低电平,这样就可以消除引脚不定状态的影响。当然也可以将上拉和下拉的开关都关断,这种状态我们称为浮空模式,一旦配置成这个模式,引脚的电压是不确定的,如果用万用表测量此模式下管脚电压时会发现只有1点几伏,而且还不时改变,所以一般情况下我们都会给引脚设置成上拉或者下拉模式,使它有一个默认状态。

1.GPIO基本结构

(3)P-MOS和N-MOS管

GPIO引脚经过两个保护二极管后就分成两路,上面一路是“输入模式”,

下面一路是“输出模式”。我们先讲输出模式,线路经过一个由P-MOS和N-MOS管组成的单元电路,这让GPIO引脚具有了推挽和开漏两种输出模式。

所谓推挽输出模式,是根据P-MOS和N-MOS管的工作方式命名的。在该结构单元输入一个高电平时,P-MOS管导通,N-MOS管截止,对外输出高电平(3.3V)。

在该单元输入一个低电平时,P-MOS管截止,N-MOS管导通,对外输出低电平(0V)。

如果当切换输入高低电平时,两个MOS管将轮流导通,一个负责灌电流(电流输出到负载),一个负责拉电流(负载电流流向芯片),使其负载能力和开关速度都比普通的方式有很大的提高。右图为推挽输出模式的等效电路。

1.GPIO基本结构

在开漏输出模式时,不论输入是高电平还是低电平,P-MOS管总处于关闭状态。当给这个单元电路输入低电平时,N-MOS管导通,输出即为低电平。当输入高电平时,N-MOS管截止,这个时候引脚状态既不是高电平,又不是低电平,我们称之为高阻态。如果想让引脚输出高电平,那么引脚必须外接一个上拉电阻,由上拉电阻提供高电平。开漏输出模式等效电路图如右图所示。

在开漏输出模式中还有一个特点,引脚具有“线与”关系。就是说如果有很多个开漏输出模式的引脚接在一起,只要有一个引脚为低电平,其他所有管脚都为低,即把所有引脚连接在一起的这条总线拉低了。只有当所有引脚输出高阻态时这条总线的电平才由上拉电阻的VDD决定。如果VDD连接的是3.3V,那么引脚输出的就是3.3V,如果VDD连接的是5V,那么引脚输出的就是5V。因此如果想要让STM32管脚输出5V,可以选择开漏输出模式,然后在外接上拉电阻的电源VDD选择5V即可,前提是这个STM32引脚是容忍5V的。开漏输出模式一般应用在I2C、SMBUS通讯等需要“线与”功能的总线电路中。还可以用在电平不匹配的场合中,就如上面说的输出5V一样。

1.GPIO基本结构

(4)输出数据寄存器

前面提到的双MOS管结构电路的输入信号,是由GPIO“输出数据寄存器

GPIOx_ODR”提供的,因此我们通过修改输出数据寄存器的值就可以修改GPIO引脚的输出电平。而“置位/复位寄存器GPIOx_BSRR”可以通过修改输出数据寄存器的值从而影响电路的输出。(5)复用功能输出

由于STM32的GPIO引脚具有第二功能,因此当使用复用功能的时候,也就是通过其他外设复用功能输出信号与GPIO数据寄存器一起连接到双MOS管电路的输入,其中梯形结构是用来选择使用复用功能还是普通IO口功能。例如使用USART串口通讯时,需要用到某个GPIO引脚作为通讯发送引脚,这个时候就可以把该GPIO引脚配置成USART串口复用功能,由串口外设控制该引脚,发送数据。

(6)输入数据寄存器

输入数据寄存器是由IO口经过上下拉电阻、施密特触发器引入。当信号经

过触发器,模拟信号将变为数字信号0或1,然后存储在输入数据寄存器中,通过读取输入数据寄存器GPIOx_IDR就可以知道IO口的电平状态。

1.GPIO基本结构

(7)复用功能输入

此模式与前面讲解的复用功能输出类似。在复用功能输入模式时,GPIO引

脚的信号传输到STM32其他片上外设,由该外设读取引脚的状态。同样,如我们使用USART串口通讯时,需要用到某个GPIO引脚作为通讯接收引脚,这个时候就可以把该GPIO引脚配置成USART串口复用功能,使USART可以通过该通讯引脚的接收远端数据。(8)模拟输入输出

当GPIO引脚用于ADC采集电压的输入通道时,用作“模拟输入”功能,

此时信号是不经过施密特触发器的,因为经过施密特触发器后信号只有0、1两种状态,ADC外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。类似地,当GPIO引脚用于DAC作为模拟电压输出通道时,此时作为“模拟输出”功能,DAC的模拟信号输出就不经过双MOS管结构了,模拟信号直接通过管脚输出。

1、输入模式(输入浮空、输入上拉、输入下拉

模拟输入)

2、输出模式(开漏输出、开漏复用功能、推挽式输出、推挽式复用功能)

8.1.3GPIO的工作模式输入浮空模式输入上拉模式输入下拉模式模拟输入模式开漏输出模式开漏复用输出模式推挽输出模式推挽复用输出模式总结:(1)推挽输出a.可以输出高低电平,用于连接数字器件,高电平由VDD决定,低电平由VSS决定。b.推挽结构指两个三极管受两路互补的信号控制,总是在一个导通的时候另外一个截止,优点开关效率效率高,电流大,驱动能力强。c.输出高电平时,电流输出到负载,叫灌电流,可以理解成推,输出低电平时,负载电流流向芯片,叫拉电流,即挽。(2)开漏输出a.只能输出低电平,不能输出高电平。如果要输出高电平,则需要外接上拉。b.开漏输出具有“线与”功能,一个为低,全部为低,多用于I2C和SMBUS总线。8.2利用寄存器直接控制GPIO的应用实例实例:使用寄存器点亮一个LED本讲主要内容 1.LED模块电路 2.STM32启动文件 3.编写点亮一个LED程序

1.LED模块电路本节要实现的功能是点亮DS0发光二极管,即让STM32的PB5管脚输出一个低电平。

2.STM32启动文件

启动文件里边是使用汇编语言写好了基本程序,当STM32芯片上电启动的时候,首先会执行这里的汇编程序,从而建立起C语言的运行环境,所以把这个文件称为启动文件。对于启动文件这部分我们主要总结它的功能,不详细讲解里面的代码,其功能如下:初始化堆栈指针SP;

初始化程序计数器指针PC;

设置堆栈的大小;设置中断向量表的入口地址;配置外部SRAM作为数据存储器;调用SystemInit()函数配置STM32的系统时钟。设置C库的分支入口“__main”(最终用来调用main()

函数);实验程序

下面就开始使用寄存器来操作STM32使PB5输出一个低电平。要操作STM32寄存器,就需要使用C语言对其封装,这部分程序都放在stm32f10x.h中。具体代码如下:#definePERIPH_BASE((unsignedint)0x40000000)#defineAPB2PERIPH_BASE(PERIPH_BASE+0x00010000)#defineGPIOB_BASE(APB2PERIPH_BASE+0x0C00)#defineGPIOB_CRL *(unsignedint*)(GPIOB_BASE+0x00)#defineGPIOB_CRH *(unsignedint*)(GPIOB_BASE+0x04)#defineGPIOB_IDR *(unsignedint*)(GPIOB_BASE+0x08)#defineGPIOB_ODR *(unsignedint*)(GPIOB_BASE+0x0C)#defineGPIOB_BSRR *(unsignedint*)(GPIOB_BASE+0x10)#defineGPIOB_BRR *(unsignedint*)(GPIOB_BASE+0x14)#defineGPIOB_LCKR *(unsignedint*)(GPIOB_BASE+0x18)#defineAHBPERIPH_BASE(PERIPH_BASE+0x20000)#defineRCC_BASE (AHBPERIPH_BASE+0x1000)#defineRCC_APB2ENR *(unsignedint*)(RCC_BASE+0x18)要控制PB5输出低电平,需知道GPIO这个外设它是挂接在哪个总线上的,

通过Block2外设基地址及APB2总线的偏移地址就可以得到APB2外设的基地址。GPIO就是挂接在APB2总线上的,根据GPIOB的偏移地址就可以得到GPIOB外设的基地址,GPIOB外设内部含有很多个寄存器,比如GPIOB_CRL、GPIOB_CRH端口配置寄存器、GPIOB_BSRR置位复位寄存器等,通过他们各自的偏移地址就可以获取对应的寄存器地址,然后要操作地址里面的内容就需要使用到指针,将其强制转换为unsignedint*指针类型,然后在通过一个*指针来操作该地址里面的内容。在STM32中凡是使用到外设功能,都要使能对应的外设时钟,否则即使配置好端口初始化也无法正常使用。因此还需要知道时钟RCC外设的基地址,通过《STM32F103ZET6数据手册》“4Memorymapping”的“存储器映射”章节可以知道RCC时钟外设是挂接在AHB总线上,根据其偏移值可以得到RCC时钟外设的基地址,然后可通过《STM32F1xx中文参考手册》的“6小容量、中容量和大容量产品的复位和时钟控制(RCC)”的“6.3.7APB2外设时钟使能寄存器(RCC_APB2ENR)”可找到对应的端口RCC使能寄存器,只要将GPIOC端口时钟使能即可。

使用C语言封装好寄存器后,就开始编写main函数,打开main.c文件,程序代码如下:

#include"stm32f10x.h"

voidSystemInit(void){}

intmain(){RCC_APB2ENR|=1<<3;

GPIOB_CRL&=~(0x0F<<(4*5));

GPIOB_CRL|=(3<<4*5);

GPIOB_BSRR=(1<<(16+5));

while(1)

{}}

(1)包含stm32f10x.h头文件,在这个头文件中我们定义的都是寄存器,

因此如果要在其他文件中使用这些寄存器就需要把这个头文件包含进来,否则编译就会报错。

(2)SystemInit函数,在前面讲解启动文件时已经说明,程序运行的时候

先进入这个函数进行STM32的初始化,如果不写这个函数编译器就会报错。这里我们编写这个函数,里面并不对其操作。

(3)开启GPIOB时钟。要使PB5正常工作输出一个低电平,必须要打开它的时钟。RCC_APB2ENR寄存器是在stm32f10x.h头文件中定义好的,只要查下《STM32F1xx中文参考手册》RCC时钟使能寄存器内容就可以知道此寄存器的第3位是控制GPIOB外设的时钟使能位,只有该位为1时才使能,如果为0即关闭GPIOB时钟。所以要让1左移3位。

(4)配置GPIOB为通用推挽输出模式。STM32的GPIO模式有很多,可根据CRx寄存器设置,CRL对应GPIO的低8位,CRH对应GPIO的高8位。如果不是特殊需求,一般输出采用推完输出模式。要让PB5管脚输出一个低电平,故使用推挽输出模式。只要查下《STM32F1xx中文参考手册》GPIO配置寄存器内容就可以知道此寄存器内每4位控制一个管脚。

(5)使PB5输出低电平。GPIOB_BSRR为置位复位寄存器,只要查下

GPIO置位复位寄存器内容就可以知道,其高16位用于复位,如果当高16位某位为1,表示那一位管脚输出低电平,为0不影响其输出电平。如果当低16位的某位为1,表示那一位管脚输出高电平,为0不影响其输出电平。所以要让1左移16+5位。

8.3利用库函数控制GPIO的应用实例实例:使用库函数点亮一个LED本讲主要内容 1.LED模块硬件电路 2.GPIO库函数介绍 3.GPIO初始化步骤 4.使用库函数编写点亮LED程序

1.LED模块硬件电路本节我们所要实现的功能是点亮DS0发光二极管,即让STM32的PB5管脚输出一个低电平。

2.GPIO库函数介绍(1)GPIO外设的库文件: stm32f10x_gpio.c、

stm32f10x_gpio.h(2)GPIO常用库函数<1>初始化函数voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct)功能:初始化一个或多个IO口(同一组端口)的工作模式、输出速度即GPIO的2个配置寄存器。打开库函数工程模板进行讲解。初始化范例: GPIO_InitTypeDefGPIO_InitStructure;//定义结构体变量

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//选择你要设置的IO口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置推挽输出模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率 GPIO_Init(GPIOC,&GPIO_InitStructure);/*初始化GPIO*/

可以一次对多个管脚进行初始化,前提必须是它们的配置模式需一样。比如:

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;<2>设置管脚输出电平函数voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);功能:设置某个IO口为高电平(可同时设置同一端口的多个IO)。底层是通过配置BSRR寄存器。voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);功能:设置某个IO口为低电平(可同时设置同一端口的多个IO)。底层是通过配置BSRR寄存器。voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitActionBitVal);voidGPIO_Write(GPIO_TypeDef*GPIOx,uint16_tPortVal);功能:设置端口管脚输出电平。<3>读取管脚输入电平函数uint8_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);功能:读取端口中的某个管脚输入电平。底层是通过读取IDR寄存器。uint16_tGPIO_ReadInputData(GPIO_TypeDef*GPIOx);功能:读取某组端口的输入电平。底层是通过读取IDR寄存器。<4>读取管脚输出电平函数uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);功能:读取端口中的某个管脚输出电平。底层是通过读取ODR寄存器。uint16_tGPIO_ReadOutputData(GPIO_TypeDef*GPIOx);功能:读取某组端口的输出电平。底层是通过读取ODR寄存器(3)使能GPIO时钟函数voidRCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState);不同的外设调用的时钟使能函数可能不一样例如使能GPIOC端口时钟如下:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);3.GPIO初始化步骤(1)使能对应的GPIO端口时钟(2)初始化GPIO4.使用库函数编写点亮LED程序本章所要实现的功能是:点亮D1指示灯。程序框架如下:

(1)初始化系统时钟,默认配置为72MHz;

(2)初始化DS0对应的GPIO相关参数,并使能GPIOB时钟;

(3)点亮DS0。

(1)系统时钟初始

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论