嵌入式系统设计(STM32)第3讲_第1页
嵌入式系统设计(STM32)第3讲_第2页
嵌入式系统设计(STM32)第3讲_第3页
嵌入式系统设计(STM32)第3讲_第4页
嵌入式系统设计(STM32)第3讲_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

第3讲GPIOGPIO--Generalpurposeinput/output主要内容3.1GPIO结构3.2GPIO寄存器3.3GPIO函数3.4GPIO编程举例3.5练习题3.6实验GPIO的功能(1)最基本的功能是可以驱动LED、产生PWM、驱动蜂鸣器等。(2)具有单独的位设置或位清除,编程简单。端口配置好后,只需GPIO_SetBits(GPIOx,GPIO_Pin_x)就可以实现对GPIOx的Pinx位为高电平;GPIO_ResetBits(GPIOx,GPIO_Pin_x)就可以实现对GPIOx的Pinx位为低电平。(3)具有外部中断/唤醒能力,端口配置成输入模式时,具有外部中断能力。(4)具有复用功能,复用功能的端口兼有I/O功能等。(5)软件重新映射I/O复用功能:为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些服用功能重新映射到其他一些引脚上。这可以通过软件配置到相应的寄存器来完成。(6)GPIO口的配置具有锁定机制。当配置好GPIO口后,在端口位上执行了锁定(LOCK),可以通过程序锁住配置组合,在下一次复位之前,将不能再更改端口位的配置。3.1GPIO结构I/O端口位的基本结构图钳位保护二极管GPIO内部具有钳位保护二极管,其作用是防止从外部管脚Pin输入的电压过高或者过低。VDD正常供电是3.3V。如果从Pin输入的信号(假设任何输入信号都有一定的内阻)电压超过VDD加上二极管D1的导通压降(假定在0.6V左右),则二极管D1导通,会把多于的电流引到VDD,而真正输入到内部的信号电压不会超过3.9V。同理,如果从Pin输入的信号电压比GND还低,则由于二极管D2的作用,会把实际输入内部的信号电压钳制在–0.6V左右。对于GPIO的配置种类有8种之多:(1)GPIO_Mode_AIN

模拟输入

(2)GPIO_Mode_IN_FLOATING

浮空输入(3)GPIO_Mode_IPD

下拉输入

(4)GPIO_Mode_IPU

上拉输入(5)GPIO_Mode_Out_OD

开漏输出(6)GPIO_Mode_Out_PP

推挽输出(7)GPIO_Mode_AF_OD

复用开漏输出(8)GPIO_Mode_AF_PP

复用推挽输出浮空输入(高阻输入)输入模式的结构比较简单,就是一个带有施密特触发输入(Schmitt-triggered

input)的三态缓冲器(U1),并具有很高的输入等效阻抗。施密特触发输入的作用是能将缓慢变化的或者是畸变的输入脉冲信号整形成比较理想的矩形脉冲信号。执行GPIO管脚读操作时,在读脉冲(Read

Pulse)的作用下会把管脚(Pin)的当前电平状态读到内部总线上(Internal

Bus)。在不执行读操作时,外部管脚与内部总线之间是隔离的。推挽输出

执行GPIO管脚写操作时,在写脉冲(Write

Pulse)的作用下,数据被锁存到Q和/Q。

T1和T2构成CMOS反相器,T1导通或T2导通时都表现出较低的阻抗,但T1和T2不会同时导通或同时关闭,最后形成的是推挽输出。开漏输出开漏输出只有下拉晶体管T1而没有上拉晶体管。同样,T1实际上也是多组可编程选择的晶体管。开漏输出的实际作用就是一个开关,输出“1”时断开、输出“0”时连接到GND。开漏输出结构没有内部上拉,因此在实际应用时通常都要外接合适的上拉电阻(通常采用4.7~10kΩ)。开漏输出能够方便地实现“线与”逻辑功能,即多个开漏的管脚可以直接并在一起使用,并统一外接一个合适的上拉电阻,就自然形成“逻辑与”关系。开漏输出的另一种用途是能够方便地实现不同逻辑电平之间的转换(如3.3V到5V之间),只需外接一个上拉电阻,而不需要额外的转换电路。输入配置当I/O端口配置为输入时:输出缓冲器被禁止施密特触发输入被激活根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器对输入数据寄存器的读访问可得到I/O状态输入浮空/上拉/下拉配置图输出配置当I/O端口被配置为输出时:输出缓冲器被激活开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(P-MOS从不被激活)。推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。施密特触发输入被激活弱上拉和下拉电阻被禁止出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器在开漏模式时,对输入数据寄存器的读访问可得到I/O状态在推挽模式时,对输出数据寄存器的读访问得到最后一次写的值。I/O端口位的输出配置图返回3.2GPIO寄存器每个GPI/O端口有:两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)一个32位锁定寄存器(GPIOx_LCKR)。

GPIO端口的每个位可以由软件分别配置成多种模式。必须以字(32位)的方式操作这些外设寄存器。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问,这样,在读和更改访问之间产生IRQ时不会发生危险。

3.2GPIO寄存器CRL 端口配置低寄存器

CRH

端口配置高寄存器

IDR

端口输入数据寄存器

ODR

端口输出数据寄存器

BSRR

端口位设置/复位寄存器

BRR

端口位复位寄存器

LCKR

端口配置锁定寄存器

EVCR

事件控制寄存器

MAPR

复用重映射和调试

EXTICR

外部中断线路0-15配置寄存器端口配置低寄存器GPIOx_CRL)(x=A..E)

复位值:0x44444444CNFy[1:0]:端口x配置位(y=0…7)(Portxconfigurationbits)MODEy[1:0]:端口x的模式位(y=0…7)(Portxmodebits)端口位配置表复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b,MODEx[1:0]=00b)。输出模式位端口配置高寄存器(GPIOx_CRH)(x=A..E)

复位值:0x44444444

CNFy[1:0]:端口x配置位(y=8…15)(Portxconfigurationbits)MODEy[1:0]:端口x的模式位(y=8…15)(Portxmodebits)……端口输入数据寄存器(GPIOx_IDR)(x=A..E)

复位值:0x0000XXXXIDRy[15:0]:端口输入数据(y=0…15)(Portinputdata)这些位为只读并只能以字(16位)的形式读出。读出的值为对应I/O口的状态。端口输出数据寄存器(GPIOx_ODR)(x=A..E)

复位值:0x00000000ODRy[15:0]:端口输出数据(y=0…15)(Portoutputdata)这些位可读可写并只能以字(16位)的形式操作。注:对GPIOx_BSRR(x=A…E),可以分别地对各个ODR位进行独立的设置/清除。端口位设置/清除寄存器(GPIOx_BSRR)

复位值:0x00000000BRy:清除端口x的位y(y=0…15)(PortxResetbity)这些位只能写入并只能以字(16位)的形式操作。0:对对应的ODRy位不产生影响,1:清除对应的ODRy位为0BSy:设置端口x的位y。0:对对应的ODRy位不产生影响,1:设置对应的ODRy位为1注:如果同时设置了BSy和BRy的对应位,BSy位起作用。端口位清除寄存器(GPIOx_BRR)

复位值:0x00000000BRy:清除端口x的位y(y=0…15)(PortxResetbity)这些位只能写入并只能以字(16位)的形式操作。0:对对应的ODRy位不产生影响,1:清除对应的ODRy位为0端口配置锁定寄存器(GPIOx_LCKR)

复位值:0x00000000当执行正确的写序列设置了位16(LCKK)时,该寄存器用来锁定端口位的配置。位[15:0]用于锁定GPIO端口的配置。在规定的写入操作期间,不能改变LCKy[15:0]。当对相应的端口位执行了LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。每个锁定位锁定控制寄存器(CRL,CRH)中相应的4个位。LCKy:端口x的锁位y(y=0…15)(PortxLockbity)。这些位可读可写但只能在LCKK位为0时写入。0:不锁定端口的配置,1:锁定端口的配置端口配置锁定寄存器格式GPIO寄存器结构GPIO寄存器结构,GPIO_TypeDef和AFIO_TypeDef,在文件“stm32f10x_map.h”中定义如下:寄存器编程举例voidLED_Init(void){ RCC->APB2ENR|=1<<6;//使能PORTE时钟

GPIOE->CRL&=0X00000000; GPIOE->CRL|=0X33333333;//PE.0-PE.7推挽输出

GPIOE->ODR|=0xFF;//PE.0-PE.7输出高电平}APB2外设时钟使能寄存器(RCC_APB2ENR)

复位值:0x00000000IOPEEN(位6):IO端口E时钟使能(I/OportEclockenable)由软件置’1’或清’0’0:IO端口E时钟关闭;1:IO端口E时钟开启。//点亮灯GPIOC->ODR=0xfffffffe;//点亮1个灯 GPIOC->BSRR=0x00030000;//点亮2个灯GPIOC->BRR=0x000C;//GPIO_ResetBits(GPIOC,GPIO_Pin_2);//GPIO_Write(GPIOC,0xffff);//GPIO_WriteBit(GPIOC,GPIO_Pin_3,Bit_RESET);//熄灭灯GPIOC->ODR=0xffffffff; GPIOC->BSRR=0x00000003;GPIOC->BSRR=0x0000000C;//GPIO_SetBits(GPIOC,GPIO_Pin_2);//GPIO_Write(GPIOC,0xfff0);//GPIO_WriteBit(GPIOC,GPIO_Pin_3,Bit_SET);

返回3.3GPIO函数GPIO_DeInit

将外设GPIOx寄存器重设为缺省值GPIO_AFIODeInit

将复用功能(重映射事件控制和EXTI设置)重设为缺省值GPIO_Init

根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器GPIO_StructInit

把GPIO_InitStruct中的每一个参数按缺省值填入GPIO_ReadInputDataBit

读取指定端口管脚的输入

GPIO_ReadInputData

读取指定的GPIO端口输入

GPIO_ReadOutputDataBit

读取指定端口管脚的输出GPIO_ReadOutputData

读取指定的GPIO端口输出GPIO_SetBits

设置指定的数据端口位

GPIO_ResetBits

清除指定的数据端口位

GPIO_WriteBit

设置或者清除指定的数据端口位

GPIO_Write

向指定GPIO数据端口写入数据

GPIO_PinLockConfig

锁定GPIO管脚设置寄存器GPIO_EventOutputConfig

选择GPIO管脚用作事件输出

GPIO_EventOutputCmd

使能或者失能事件输出

GPIO_PinRemapConfig

改变指定管脚的映射

GPIO_EXTILineConfig

选择GPIO管脚用作外部中断线路函数GPIO_DeInit

功能:将外设GPIOx寄存器重设为缺省值。函数原形:voidGPIO_DeInit(GPIO_TypeDef*GPIOx)GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设。被调用函数:RCC_APB2PeriphResetCmd()例:

/*ResetstheGPIOAperipheralregisterstotheirdefaultresetvalues*/GPIO_DeInit(GPIOA);函数GPIO_AFIODeInit

功能描述:将复用功能(重映射事件控制和EXTI设置)重设为缺省值函数原形:voidGPIO_AFIODeInit(void)被调用函数:RCC_APB2PeriphResetCmd()例:

/*ResetstheAlternatefunctionsregisterstotheirdefaultresetvalues*/GPIO_AFIODeInit();函数GPIO_Init

功能描述:根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器函数原形:

voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct)GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设GPIO_InitStruct:指向结构GPIO_InitTypeDef的指针,包含了外设GPIO的配置信息例如:GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitTypeDef定义于文件“stm32f10x_gpio.h”:typedefstruct{u16GPIO_Pin;GPIOSpeed_TypeDefGPIO_Speed;GPIOMode_TypeDefGPIO_Mode;}GPIO_InitTypeDef;GPIO_Pin值该参数选择待设置的GPIO管脚,使用操作符“|”可以一次选中多个管脚。可以使用下表中的任意组合。GPIO_Pin_None:无管脚被选中GPIO_Pin_0:选中管脚0GPIO_Pin_1:选中管脚1GPIO_Pin_2:选中管脚2GPIO_Pin_3:选中管脚3……GPIO_Pin_All:选中全部管脚GPIO_Speed值GPIO_Mode:用以设置选中管脚的工作状态

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 复用推挽输出GPIO的初始化配置程序例:

/*ConfigurealltheGPIOAinInputFloatingmode*/GPIO_InitTypeDefGPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);函数GPIO_StructInit

例:/*InitializetheGPIOInitStructureparameters*/GPIO_InitTypeDefGPIO_InitStructure;GPIO_StructInit(&GPIO_InitStructure);函数GPIO_ReadInputDataBit

函数名:GPIO_ReadInputDataBit函数原形:

u8GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,u16GPIO_Pin)

功能描述:读取指定端口管脚的输入输入参数1:

GPIOx----x可以是A,B,C,D或者E,来选择GPIO外设输入参数2:GPIO_Pin----待读取的端口位返回值:输入端口管脚值例:/*ReadstheseventhpinoftheGPIOBandstoreitinReadValuevariable*/u8ReadValue;ReadValue=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);函数GPIO_ReadInputData

函数名:GPIO_ReadInputData函数原形:u16GPIO_ReadInputData(GPIO_TypeDef*GPIOx)功能描述:读取指定的GPIO端口输入输入参数:GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设输出参数:无返回值:GPIO输入数据端口值例:

/*ReadtheGPIOCinputdataportandstoreitinReadValuevariable*/

u16ReadValue;ReadValue=GPIO_ReadInputData(GPIOC);函数GPIO_ReadOutputDataBit

函数名GPIO_ReadOutputDataBit函数原形:u8GPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,u16GPIO_Pin)功能描述读取指定端口管脚的输出

输入参数1----GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设

输入参数2----GPIO_Pin:待读取的端口位返回值:输出端口管脚值

例:/*ReadstheseventhpinoftheGPIOBandstoreitinReadV

温馨提示

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

评论

0/150

提交评论