《GPIO设计PPT课件》由会员分享,可在线阅读,更多相关《GPIO设计PPT课件(72页珍藏版)》请在金锄头文库上搜索。
1、GPIO GPIO 设计设计2021/7/221配置模式CNF1CNF0MODE1MODE0PxODR寄存器通用输出推挽(Push-Pull)000或 1开漏(Open-Drain)10或 1复用功能 输出推挽(Push-Pull)10不使用开漏(Open-Drain)1不使用输入模拟输入0000不使用浮空输入1不使用下拉输入100上拉输入12021/7/222输出模式位MODE1:0意义00保留01最大输出速度为10MHz10最大输出速度为2MHz11最大输出速度为50MHz2021/7/223端口配置低寄存器(GPIOx_CRL) (x=A.E)(GPIOx_CRL) (x=A.E) 偏移
2、地址:0x00复位值:0x4444 44442021/7/224位31:3027:2623:2219:1815:1411:107:63:2CNFy1:0:端口x配置位(y=815)(Portxconfig-urationbits)软件通过这些位配置相应的I/O端口。在输入模式(MODE1:0=00):00:模拟输入模式01:浮空输入模式(复位后的状态)10:上拉/下拉输入模式11:保留在输出模式(MODE1:000):00:通用推挽输出模式01:通用开漏输出模式10:复用功能推挽输出模式11:复用功能开漏输出模式2021/7/225位29:2825:2421:2017:1613:129:85:
3、41:0MODEy1:0:端口x的模式位(y=07)(Portxmodebits)软件通过这些位配置相应的I/O端口。00:输入模式(复位后的状态)01:输出模式,最大速度10MHz10:输出模式,最大速度2MHz11:输出模式,最大速度50MHz2021/7/226偏移地址:0x04复位值:0x4444 4444端口配置高寄存器(GPIOx_CRH) (GPIOx_CRH) 2021/7/227CNFy1:0CNFy1:0:端口x配置位(y = 815) 软件通过这些位配置相应的I/O端口。 在输入模式(MODE1:0=00):00:模拟输入模式01:浮空输入模式(复位后的状态)10:上拉/
4、下拉输入模式11:保留 在输出模式(MODE1:000):00:通用推挽输出模式01:通用开漏输出模式10:复用功能推挽输出模式11:复用功能开漏输出模式 位31:3027:2623:2219:1815:1411:107:63:22021/7/228MODEy1:0MODEy1:0:端口x的模式位(y = 815) 软件通过这些位配置相应的I/O端口。00:输入模式(复位后的状态)01:输出模式,最大速度10MHz10:输出模式,最大速度2MHz11:输出模式,最大速度50MHz 位29:2825:2421:2017:1613:129:85:41:02021/7/229地址偏移:0x08复位值
5、:0x0000 XXXX端口输入数据寄存器(GPIOx_IDR)(GPIOx_IDR)2021/7/2210位31:16保留,始终读为0。位15:0 IDRy15:0IDRy15:0:端口输入数据(y = 015) (Port input data)这些位为只读并只能以字(16位)的形式读出。读出的值为对应I/O口的状态。2021/7/2211地址偏移:0Ch复位值:0x0000 0000端口输出数据寄存器(GPIOx_ODR)(GPIOx_ODR)2021/7/2212位31:16保留,始终读为0。位15:0ODRy15:0ODRy15:0:端口输出数据(y = 015) 这些位可读可写并只
6、能以字(16位)的形式操作。注:对GPIOx_BSRR(x = AE),可以分别地对各个ODR位进行独立的设置/清除。2021/7/2213端口位设置/ /清除寄存器(GPIOx_BSRR)(GPIOx_BSRR) 地址偏移:0x10复位值:0x0000 00002021/7/2214位31:16BRyBRy: 清除端口x的位y (y = 015) (Port x Reset bit y)这些位只能写入并只能以字(16位)的形式操作。0:对对应的ODRy位不产生影响1:清除对应的ODRy位为0注:如果同时设置了BSy和BRy的对应位,BSy位起作用。2021/7/2215位15:0BSyBSy
7、: 设置端口x的位y (y = 015) (Port x Set bit y)这些位只能写入并只能以字(16位)的形式操作。0:对对应的ODRy位不产生影响1:设置对应的ODRy位为12021/7/2216端口位清除寄存器(GPIOx_BRR) (GPIOx_BRR) 地址偏移:0x14复位值:0x0000 00002021/7/2217位31:16保留。位15:0 BRyBRy: 清除端口x的位y (y = 015) (Port x Reset bit y)这些位只能写入并只能以字(16位)的形式操作。0:对对应的ODRy位不产生影响1:清除对应的ODRy位为02021/7/2218端口配置
8、锁定寄存器(GPIOx_LCKR)(GPIOx_LCKR)当执行正确的写序列设置了位16(LCKK)时,该寄存器用来锁定端口位的配置。位15:0用于锁定GPIO端口的配置。在规定的写入操作期间,不能改变LCKP15:0。当对相应的端口位执行了 LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。每个锁定位锁定控制寄存器(CRL, CRH)中相应的4个位。 地址偏移:0x18复位值:0x0000 00002021/7/2219位31:17保留。位16 LCKK:锁键 (Lock key)该位可随时读出,它只可通过锁键写入序列修改。0:端口配置锁键位激活1:端口配置锁键位被激活,下次系统复
9、位前GPIOx_LCKR寄存器被锁住。锁键的写入序列:写1 - 写0 - 写1 - 读0 - 读1 最后一个读可省略,但可以用来确认锁键已被激活。 注:在操作锁键的写入序列时,不能改变LCK15:0的值。 操作锁键写入序列中的任何错误将不能激活锁键。2021/7/22202021/7/2221位15:0LCKy: 端口x的锁位y (y = 015) 这些位可读可写但只能在LCKK位为0时写入。0:不锁定端口的配置1:锁定端口的配置2021/7/22222021/7/2223(1) VDD_FT 对5伏容忍I/O脚是特殊的,它与VDD不同2021/7/2224一、一、GPIOGPIO的各种模式的
10、各种模式GPIOGPIO管脚可以被配置为多种工作模式,其中有管脚可以被配置为多种工作模式,其中有3 3种种比较常用:高阻输入、推挽输出、开漏输出比较常用:高阻输入、推挽输出、开漏输出1 1 高阻输入高阻输入(Input)(Input)输入模式的结构比较简单,就是一个带有施密特输入模式的结构比较简单,就是一个带有施密特触发输入的三态缓冲器(触发输入的三态缓冲器(U1U1),并具有很高的输),并具有很高的输入等效阻抗。入等效阻抗。 GPIO高阻输入模式结构示意图2021/7/2225施密特触发输入的作用是能将缓慢变化的或者是畸变的输入脉冲信号整形成比较理想的矩形脉冲信号。执行GPIO管脚读操作时,
11、在读脉冲(Read Pulse)的作用下会把管脚(Pin)的当前电平状态读到内部总线上(Internal Bus)。在不执行读操作时,外部管脚与内部总线之间是隔离的。2021/7/22262 2 推挽输出推挽输出(Output)(Output)2021/7/2227U1是输出锁存器,执行GPIO管脚写操作时,在写脉冲(Write Pulse)的作用下,数据被锁存到Q和/Q。T1和T2构成CMOS反相器,T1导通或T2导通时都表现出较低的阻抗,但T1和T2不会同时导通或同时关闭,最后形成的是推挽输出。在推挽输出模式下,GPIO还具有回读功能,实现回读功能的是一个简单的三态门U2。注意:执行回读功
12、能时,读到的是管脚的输出锁存状态,而不是外部管脚Pin的状态。2021/7/2228 3 3 开漏输出开漏输出(OutputOD)(OutputOD)开漏输出和推挽输出相比结构基本相同,但只有开漏输出和推挽输出相比结构基本相同,但只有下拉晶体管下拉晶体管T1T1而没有上拉晶体而没有上拉晶体管。同样,管。同样,T1T1实际实际上也是多组可编程选择的晶体管。上也是多组可编程选择的晶体管。 2021/7/2229 开漏输出结构没有内部上拉,因此在实际应用时通常都要外接合适的上拉电阻(通常采用4.710k)。开漏输出能够方便地实现“线与”逻辑功能,即多个开漏的管脚可以直接并在一起 。开漏输出的另一种用
13、途是能够方便地实现不同逻辑电平之间的转换(如3.3V到5V之间),只需外接一个上拉电阻,而不需要额外的转换电路。典型的应用例子就是基于开漏电气连接的I2C总线。2021/7/22304 4 钳位二极管钳位二极管其作用是防止从外部管其作用是防止从外部管 脚脚PinPin输入的电压过高输入的电压过高 或者过低。或者过低。 2021/7/2231二、二、GPIOGPIO配置配置(1 1)GPIO_Mode_AIN GPIO_Mode_AIN 模拟输入模拟输入 (2 2)GPIO_Mode_IN_FLOATING GPIO_Mode_IN_FLOATING 浮空输入浮空输入(3 3)GPIO_Mode
14、_IPD GPIO_Mode_IPD 下拉输入下拉输入 (4 4)GPIO_Mode_IPU GPIO_Mode_IPU 上拉输入上拉输入 (5)GPIO_Mode_Out_OD 开漏输出(6)GPIO_Mode_Out_PP 推挽输出(7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出2021/7/22321. I/O口速度GPIO_Speed_10MHz 最高输出速率10MHz GPIO_Speed_2MHz 最高输出速率2MHz GPIO_Speed_50MHz 最高输出速率50MHzI/O口的输出模式下,有3种输出速度可选(2MHz、1
15、0MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关 。2021/7/2233通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。2021/7/2234关键是GPIO的引脚速度跟应用匹配对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。对于I2C接口,假如使用400k波特率,若想把
16、余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。 2021/7/22352. GPIO口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。3. 在复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式。 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。 2021/7/22364.推挽输出与开漏输出的区别推挽输出与开漏输出的区别推挽输出推挽输出: :可以输出高可以输出高, ,低电平低电平,
17、,连接数字器件连接数字器件; ;开开漏输出漏输出: :输出端相当于三极管的集电极输出端相当于三极管的集电极. . 要得到高要得到高电平状态需要上拉电阻才行电平状态需要上拉电阻才行. . 适合于做电流型的适合于做电流型的驱动驱动, ,其吸收电流的能力相对强其吸收电流的能力相对强( (一般一般20mA20mA以内以内).). 2021/7/2237三、在三、在STM32STM32中选用中选用IOIO模式模式(1 1) 浮空输入浮空输入_IN_FLOATING _IN_FLOATING 浮空输入,可以做浮空输入,可以做KEYKEY识识别,别,RX1RX1(2 2)带上拉输入)带上拉输入_IPUIO_
18、IPUIO内部上拉电阻输入内部上拉电阻输入(3 3)带下拉输入)带下拉输入_IPDIO_IPDIO内部下拉电阻输入内部下拉电阻输入 (4 4) 模拟输入模拟输入_AIN _AIN 应用应用ADCADC模拟输入,或者低功耗下模拟输入,或者低功耗下省电。省电。(5 5)开漏输出)开漏输出_OUT_OD IO_OUT_OD IO输出输出0 0接接GNDGND,IOIO输出输出1 1,悬空,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为需要外接上拉电阻,才能实现输出高电平。当输出为1 1时,时,IOIO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,口的状态由上拉电阻拉高电平,但由于是开漏输出
19、模式,这样这样IOIO口也就可以由外部电路改变为低电平或不变口也就可以由外部电路改变为低电平或不变 。可。可以读以读IOIO输入电平变化,实现输入电平变化,实现C51C51的的IOIO双向功能。双向功能。2021/7/2238 (6)推挽输出)推挽输出_OUT_PP IO输出输出0-接接GND, IO输出输出1 -接接VCC,读输入值是未知,读输入值是未知的。的。(7)复用功能的推挽输出)复用功能的推挽输出_AF_PP 片片内外设功能(内外设功能(I2C的的SCL,SDA)(8)复用功能的开漏输出)复用功能的开漏输出_AF_OD片片内外设功能(内外设功能(TX1,MOSI,MISO,SCK,S
20、S)2021/7/2239实例实例(1)模拟)模拟I2C使用开漏输出使用开漏输出_OUT_OD,接上拉电阻,能够,接上拉电阻,能够正确输出正确输出0和和1;读值时先;读值时先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读;拉高,然后可以读IO的值;使用的值;使用GPIO_ReadInputData Bit(GPIOB, GPIO_Pin_0);(2)如果是无上拉电阻,)如果是无上拉电阻,IO默认是高电平;需要读取默认是高电平;需要读取IO的的值,可以使用值,可以使用(3)带上拉输入)带上拉输入_IPU和浮空输入和浮空输入_IN_FLOATING和和 开漏开漏输
21、出输出_OUT_OD;2021/7/2240操作寄存器方法代码 #include 02#include system.h030405/LED端口定义0607#define LED0 PAout(4)/ PA40809voidvoidGpio_Init(voidvoid);2021/7/22411011intintmain(voidvoid)1213Rcc_Init(9);/系统时钟设置14Gpio_Init();/初始化与LED连接的硬件接口15whilewhile(1)1617LED0=0;18delay(300000);/延时300ms2021/7/224219LED0=1;20delay
22、(300000);21 22 232425 voidvoidGpio_Init(voidvoid)262021/7/224327RCC-APB2ENR|=1CRL&=0XFFF0FFFF;30GPIOA-CRL|=0X00030000;/PA4 推挽输出31GPIOA-ODR|=1APB2ENR|=1APB2ENR|=1CRH&=0XFFFFFFF0; GPIOA-CRH|=0X00000003;/PA8 推 GPIOA-ODR|=1CRL&=0XFFFFF0FF;GPIOD-CRL|=0X00000300;/PD.2推挽输出GPIOD-ODR|=12; /PD.2输出高 2021/7/226
23、2/led.h#ifndef _LED_H#define _LED_H #include sys.h/LED驱动代码 /LED端口定义#define LED0 PAout(8)/ PA8#define LED1 PDout(2)/ PD2void LED_Init(void);/初始化 #endif2021/7/2263#include #include sys.h#include usart.h#include delay.h#include led.h /跑马灯实验 int main(void) Stm32_Clock_Init(9); /系统时钟设置 2021/7/2264delay_i
24、nit(72); /延时初始化LED_Init(); /初始化与LED连接的硬件接口while(1) LED0=0;LED1=1;delay_ms(300);LED0=1;LED1=0;delay_ms(300); 2021/7/2265例子(固件库操作)/led.c#include led.hvoid LED_GPIO_Config(void)GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE); 2021/7/2266GPIO_InitStructure.GPIO_
25、Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_SetBits(GPIOC, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5); / turn off all led2021/7/2267/led.h#ifndef _LED_H#define_LED
26、_H#include stm32f10x.h#define ON 0#define OFF 1#define LED1(a)if (a)GPIO_SetBits(GPIOC,GPIO_Pin_3);elseGPIO_ResetBits(GPIOC,GPIO_Pin_3)2021/7/2268#define LED2(a)if (a)GPIO_SetBits(GPIOC,GPIO_Pin_4);elseGPIO_ResetBits(GPIOC,GPIO_Pin_4)#define LED3(a)if (a)GPIO_SetBits(GPIOC,GPIO_Pin_5);elseGPIO_Reset
27、Bits(GPIOC,GPIO_Pin_5)void LED_GPIO_Config(void);#endif /* _LED_H */2021/7/2269Main主函数#include stm32f10x.h#include led.hvoid Delay(_IO u32 nCount);/* 函数名:main * 描述 :主函数*/int main(void)/* 配置系统时钟为72M */ SystemInit();/* LED 端口初始化 */LED_GPIO_Config();2021/7/2270while (1) LED1( ON ); / 亮Delay(0x6FFFEF);LED1( OFF ); / 灭LED2( ON );Delay(0x6FFFEF);LED2( OFF );2021/7/2271LED3( ON );Delay(0x6FFFEF);LED3( OFF ); void Delay(_IO u32 nCount) for(; nCount != 0; nCount-); 2021/7/2272