1、GPIO 设计设计1ppt课件配置模式CNF1CNF0MODE1MODE0PxODR寄存器通用输出推挽(Push-Pull)00 0 或 1开漏(Open-Drain)10 或 1复用功能 输出推挽(Push-Pull)10不使用开漏(Open-Drain)1不使用输入模拟输入0000不使用浮空输入1不使用下拉输入100上拉输入12ppt课件输出模式位MODE1:0意义00保留01最大输出速度为10MHz10最大输出速度为2MHz11最大输出速度为50MHz3ppt课件端口配置低寄存器(GPIOx_CRL) (x=A.E) 偏移地址:0 x00 复位值:0 x4444 44444ppt课件位
2、31:30 27:26 23:22 19:18 15:14 11:10 7:6 3:2CNFy1:0:端口x配置位(y = 815) (Port x config-uration bits)软件通过这些位配置相应的I/O端口。在输入模式(MODE1:0=00):00:模拟输入模式01:浮空输入模式(复位后的状态)10:上拉/下拉输入模式11:保留 在输出模式(MODE1:000):00:通用推挽输出模式01:通用开漏输出模式10:复用功能推挽输出模式11:复用功能开漏输出模式5ppt课件位29:28 25:24 21:20 17:16 13:12 9:8 5:4 1:0MODEy1:0:端口x
3、的模式位(y = 07) (Port x mode bits)软件通过这些位配置相应的I/O端口。00:输入模式(复位后的状态)01:输出模式,最大速度10MHz10:输出模式,最大速度2MHz11:输出模式,最大速度50MHz6ppt课件7ppt课件 偏移地址:0 x04 复位值:0 x4444 4444端口配置高寄存器(GPIOx_CRH) 8ppt课件 CNFy1:0CNFy1:0:端口x配置位(y = 815) 软件通过这些位配置相应的I/O端口。 在输入模式(MODE1:0=00): 00:模拟输入模式 01:浮空输入模式(复位后的状态) 10:上拉/下拉输入模式 11:保留 在输出
4、模式(MODE1:000): 00:通用推挽输出模式 01:通用开漏输出模式 10:复用功能推挽输出模式 11:复用功能开漏输出模式 位 31:30 27:26 23:22 19:18 15:14 11:10 7:6 3:29ppt课件 MODEy1:0MODEy1:0:端口x的模式位(y = 815) 软件通过这些位配置相应的I/O端口。 00:输入模式(复位后的状态) 01:输出模式,最大速度10MHz 10:输出模式,最大速度2MHz 11:输出模式,最大速度50MHz 位29:28 25:24 21:20 17:16 13:12 9:8 5:4 1:010ppt课件 地址偏移:0 x0
5、8 复位值:0 x0000 XXXX端口输入数据寄存器( (GPIOx_IDRGPIOx_IDR) )11ppt课件 位31:16保留,始终读为0。 位15:0 IDRy15:0IDRy15:0:端口输入数据(y = 015) (Port input data)这些位为只读并只能以字(16位)的形式读出。读出的值为对应I/O口的状态。12ppt课件 地址偏移:0Ch 复位值:0 x0000 0000端口输出数据寄存器( (GPIOx_ODRGPIOx_ODR) )13ppt课件 位31:16保留,始终读为0。 位15:0ODRy15:0ODRy15:0:端口输出数据(y = 015) 这些位可
6、读可写并只能以字(16位)的形式操作。注:对GPIOx_BSRR(x = AE),可以分别地对各个ODR位进行独立的设置/清除。14ppt课件端口位设置/ /清除寄存器( (GPIOx_BSRRGPIOx_BSRR) ) 地址偏移:0 x10 复位值:0 x0000 000015ppt课件位31:16 BRyBRy: 清除端口x的位y (y = 015) (Port x Reset bit y)这些位只能写入并只能以字(16位)的形式操作。0:对对应的ODRy位不产生影响1:清除对应的ODRy位为0注:如果同时设置了BSy和BRy的对应位,BSy位起作用。16ppt课件 位15:0 BSyBS
7、y: 设置端口x的位y (y = 015) (Port x Set bit y)这些位只能写入并只能以字(16位)的形式操作。0:对对应的ODRy位不产生影响1:设置对应的ODRy位为117ppt课件端口位清除寄存器(GPIOx_BRR) 地址偏移:0 x14 复位值:0 x0000 000018ppt课件 位31:16保留。 位15:0 BRyBRy: 清除端口x的位y (y = 015) (Port x Reset bit y)这些位只能写入并只能以字(16位)的形式操作。0:对对应的ODRy位不产生影响1:清除对应的ODRy位为019ppt课件20ppt课件端口配置锁定寄存器(GPIOx
8、_LCKR)当执行正确的写序列设置了位16(LCKK)时,该寄存器用来锁定端口位的配置。位15:0用于锁定GPIO端口的配置。在规定的写入操作期间,不能改变LCKP15:0。当对相应的端口位执行了 LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。 每个锁定位锁定控制寄存器(CRL, CRH)中相应的4个位。 地址偏移:0 x18 复位值:0 x0000 000021ppt课件 位31:17保留。 位16 LCKK:锁键 (Lock key)该位可随时读出,它只可通过锁键写入序列修改。0:端口配置锁键位激活1:端口配置锁键位被激活,下次系统复位前GPIOx_LCKR寄存器被锁住。 锁
9、键的写入序列:写1 - 写0 - 写1 - 读0 - 读1 最后一个读可省略,但可以用来确认锁键已被激活。 注:在操作锁键的写入序列时,不能改变LCK15:0的值。 操作锁键写入序列中的任何错误将不能激活锁键。22ppt课件23ppt课件位15:0 LCKy: 端口x的锁位y (y = 015) 这些位可读可写但只能在LCKK位为0时写入。 0:不锁定端口的配置 1:锁定端口的配置24ppt课件25ppt课件 (1) VDD_FT 对5伏容忍I/O脚是特殊的,它与VDD不同26ppt课件 一、一、GPIO的各种模式的各种模式 GPIOGPIO管脚可以被配置为多种工作模式,其中有管脚可以被配置为
10、多种工作模式,其中有3 3种比较常用:高阻输入、推挽输出、开漏输出种比较常用:高阻输入、推挽输出、开漏输出1 1 高阻输入高阻输入(Input)(Input) 输入模式的结构比较简单,就是一个带有施密特输入模式的结构比较简单,就是一个带有施密特触发输入的三态缓冲器(触发输入的三态缓冲器(U1U1),并具有很高的输),并具有很高的输入等效阻抗。入等效阻抗。 GPIO高阻输入模式结构示意图 27ppt课件 施密特触发输入的作用是能将缓慢变化的或者是畸变的输入脉冲信号整形成比较理想的矩形脉冲信号。 执行GPIO管脚读操作时,在读脉冲(Read Pulse)的作用下会把管脚(Pin)的当前电平状态读到
11、内部总线上(Internal Bus)。在不执行读操作时,外部管脚与内部总线之间是隔离的。28ppt课件 2 推挽输出推挽输出(Output)29ppt课件 U1是输出锁存器,执行GPIO管脚写操作时,在写脉冲(Write Pulse)的作用下,数据被锁存到Q和/Q。 T1和T2构成CMOS反相器,T1导通或T2导通时都表现出较低的阻抗,但T1和T2不会同时导通或同时关闭,最后形成的是推挽输出。 在推挽输出模式下,GPIO还具有回读功能,实现回读功能的是一个简单的三态门U2。 注意:执行回读功能时,读到的是管脚的输出锁存状态,而不是外部管脚Pin的状态。30ppt课件 3 开漏输出开漏输出(O
12、utputOD) 开漏输出和推挽输出相比结构基本相同,但只有开漏输出和推挽输出相比结构基本相同,但只有下拉晶体管下拉晶体管T1而没有上拉晶体而没有上拉晶体管。同样,管。同样,T1实际实际上也是多组可编程选择的晶体管。上也是多组可编程选择的晶体管。 31ppt课件 开漏输出结构没有内部上拉,因此在实际应用时通常都要外接合适的上拉电阻(通常采用4.710k)。开漏输出能够方便地实现“线与”逻辑功能,即多个开漏的管脚可以直接并在一起 。 开漏输出的另一种用途是能够方便地实现不同逻辑电平之间的转换(如3.3V到5V之间),只需外接一个上拉电阻,而不需要额外的转换电路。典型的应用例子就是基于开漏电气连接
13、的I2C总线。32ppt课件 4 钳位二极管钳位二极管 其作用是防止从外部管其作用是防止从外部管 脚脚Pin输入的电压过高输入的电压过高 或者过低。或者过低。 33ppt课件 二、二、GPIO配置配置 (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_Mod
14、e_AF_PP 复用推挽输出34ppt课件 1. I/O口速度 GPIO_Speed_10MHz 最高输出速率10MHz GPIO_Speed_2MHz 最高输出速率2MHz GPIO_Speed_50MHz 最高输出速率50MHz I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关 。35ppt课件 通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。 高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。
15、当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。36ppt课件 关键是GPIO的引脚速度跟应用匹配 对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。 对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。 对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。 37ppt课件 2. GPIO口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。 3.
16、在复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式。 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。 38ppt课件 4.推挽输出与开漏输出的区别推挽输出与开漏输出的区别 推挽输出推挽输出: :可以输出高可以输出高, ,低电平低电平, ,连接数字器件连接数字器件; ;开开漏输出漏输出: :输出端相当于三极管的集电极输出端相当于三极管的集电极. . 要得到要得到高电平状态需要上拉电阻才行高电平状态需要上拉电阻才行. . 适合于做电流型适合于做电流型的驱动的驱动, ,其吸收电流的能力相对强其吸收电流的能力相对强( (一般一般20mA20mA以以内内).).
17、 39ppt课件 三、在三、在STM32中选用中选用IO模式模式 (1) 浮空输入浮空输入_IN_FLOATING 浮空输入,可以做浮空输入,可以做KEY识别,识别,RX1 (2)带上拉输入)带上拉输入_IPUIO内部上拉电阻输入内部上拉电阻输入 (3)带下拉输入)带下拉输入_IPDIO内部下拉电阻输入内部下拉电阻输入 (4) 模拟输入模拟输入_AIN 应用应用ADC模拟输入,或者低功模拟输入,或者低功耗下省电。耗下省电。 (5)开漏输出)开漏输出_OUT_OD IO输出输出0接接GND,IO输出输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当,悬空,需要外接上拉电阻,才能实现输出高电平
18、。当输出为输出为1时,时,IO口的状态由上拉电阻拉高电平,但由于是口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样开漏输出模式,这样IO口也就可以由外部电路改变为低口也就可以由外部电路改变为低电平或不变电平或不变 。可以读。可以读IO输入电平变化,实现输入电平变化,实现C51的的IO双双向功能。向功能。40ppt课件 (6)推挽输出)推挽输出_OUT_PP IO输出输出0-接接GND, IO输出输出1 -接接VCC,读输入值是未,读输入值是未知的。知的。 (7)复用功能的推挽输出)复用功能的推挽输出_AF_PP 片片内外设功能(内外设功能(I2C的的SCL,SDA) (8)复用功能的开漏
19、输出)复用功能的开漏输出_AF_OD片片内外设功能(内外设功能(TX1,MOSI,MISO,SCK,SS)41ppt课件 实例实例 (1)模拟)模拟I2C使用开漏输出使用开漏输出_OUT_OD,接上拉电阻,能够,接上拉电阻,能够正确输出正确输出0和和1;读值时先;读值时先 GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读;拉高,然后可以读IO的值;使用的值;使用GPIO_ReadInputData Bit(GPIOB, GPIO_Pin_0); (2)如果是无上拉电阻,)如果是无上拉电阻,IO默认是高电平;需要读取默认是高电平;需要读取IO的的值,可以使用值,可
20、以使用 (3)带上拉输入)带上拉输入_IPU和浮空输入和浮空输入_IN_FLOATING和和 开漏开漏输出输出_OUT_OD;42ppt课件操作寄存器方法代码 #include 02#include system.h 03 04 05/LED端口定义0607#define LED0 PAout(4)/ PA408 09voidvoid Gpio_Init(voidvoid); 43ppt课件10 11intint main(voidvoid)12 13 Rcc_Init(9); /系统时钟设置14 Gpio_Init(); /初始化与LED连接的硬件接口15 whilewhile(1)16 1
21、7 LED0=0;18 delay(300000); /延时300ms44ppt课件19 LED0=1;20 delay(300000);21 22 23 24 25 voidvoid Gpio_Init(voidvoid)2645ppt课件27 RCC-APB2ENR|=1CRL&=0XFFF0FFFF;30 GPIOA-CRL|=0X00030000;/PA4 推挽输出 31 GPIOA-ODR|=1APB2ENR|=1APB2ENR|=1CRH&=0XFFFFFFF0; GPIOA-CRH|=0X00000003;/PA8 推 GPIOA-ODR|=1CRL&=0XFFFFF0FF;GP
22、IOD-CRL|=0X00000300;/PD.2推挽输出GPIOD-ODR|=12; /PD.2输出高 64ppt课件/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);/初始化 #endif65ppt课件#include #include sys.h#include usart.h#include delay.h#include led.h /跑马灯实验 int mai
23、n(void) Stm32_Clock_Init(9); /系统时钟设置66ppt课件delay_init(72); /延时初始化LED_Init(); /初始化与LED连接的硬件接口while(1) LED0=0;LED1=1;delay_ms(300);LED0=1;LED1=0;delay_ms(300); 67ppt课件例子(固件库操作)/led.c#include led.hvoid LED_GPIO_Config(void)GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC
24、, ENABLE); 68ppt课件GPIO_InitStructure.GPIO_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 led
25、69ppt课件/led.h#ifndef _LED_H#define_LED_H#include stm32f10 x.h#define ON 0#define OFF 1#define LED1(a)if (a)GPIO_SetBits(GPIOC,GPIO_Pin_3);elseGPIO_ResetBits(GPIOC,GPIO_Pin_3)70ppt课件#define LED2(a)if (a)GPIO_SetBits(GPIOC,GPIO_Pin_4);elseGPIO_ResetBits(GPIOC,GPIO_Pin_4)#define LED3(a)if (a)GPIO_SetBi
26、ts(GPIOC,GPIO_Pin_5);elseGPIO_ResetBits(GPIOC,GPIO_Pin_5)void LED_GPIO_Config(void);#endif /* _LED_H */71ppt课件Main主函数#include stm32f10 x.h#include led.hvoid Delay(_IO u32 nCount);/* 函数名:main * 描述 :主函数*/int main(void)/* 配置系统时钟为72M */ SystemInit();/* LED 端口初始化 */LED_GPIO_Config();72ppt课件while (1) LED1( ON ); / 亮Delay(0 x6FFFEF);LED1( OFF ); / 灭LED2( ON );Delay(0 x6FFFEF);LED2( OFF );73ppt课件LED3( ON );Delay(0 x6FFFEF);LED3( OFF ); void Delay(_IO u32 nCount) for(; nCount != 0; nCount-); 74ppt课件75ppt课件