《GPIO外设的简介》

目录

1.GPIO外设是什么?

2.基于其外设的输/入出模式,时钟等。

①输入模式

(1)浮空输入:

(2)下拉输入:

(3)上拉输入:

(4)模拟输入:

②输出模式

(1)开漏输出:

(2)推挽输出:

(3)复用推挽输出:

         (4)复用开漏输出:

3.如何独立自主的编写一个GPIO外设程序?

(1)使能IO口时钟。调用函数RCC_APB2PeriphColckCmd(),不同的IO组,调用的时钟使能函数不一样。

(2)1个初始化函数:

 (3)GPIO_Init函数初始化样例:

4.输出以及读取IO口电平操作(GPIO_TypeDef* GPIOx一般为GPIOA或GPIOB,uint16_t GPIO_Pin一般为GPIO口引脚接口如 GPIO_Pin_5等)

(1)两个读取输入电平函数:

(2).两个读取输出电平函数:

(3)四个设置输出电平函数:


以下内容主要以STM32F10C8T6为例。

1.GPIO外设是什么?

STM32的GPIO

General-Purpose Input Output,通用型输入输出的,也简称I/O口,有时也简写为IO口。用于电信号的传递,以实现与外部器件的通信、控制外部器件或者采集外部器件数据的功能。

2.基于其外设的输/入出模式,时钟等。

输入模式

例:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

(1)浮空输入:该模式下IO端口的电平信号直接进入输入数据寄存器(GPIOx_IDR),MUC读取到的IO口电平不稳定。

GPIO_Mode_IN_FLOATING = 0x04, //浮空输入

(2)下拉输入:该模式下IO内部接入下拉电阻,如果IO口外部没有信号输入或者悬空,则IO口电平默认为低电平如果此时IO口有输入高电平,那么引脚就为高电平,MCU读取到的就是高电平。

GPIO_Mode_IPD = 0x28, //下拉输入

(3)上拉输入:该模式下IO内部接入上拉电阻,如果IO口外部没有信号输入或者悬空,则IO口默认为高电平。如果此时IO口有输入低电平,那么引脚就为低电平,MCU读取到的就是低电平。

GPIO_Mode_IPU = 0x48, //上拉输入

STM32的内部上拉是"弱上拉",即通过此上拉输出的电流很弱,如需求大电流还是需要接外部上拉。

(4)模拟输入:该模式用于GPIO作为ADC采集电压的输入通道时,此时信号不经过施密特触发器,直接直接进入ADC外设中,并且输入数据寄存器为空 ,MCU不能在GPIOx_IDR上读到引脚状态。

GPIO_Mode_AIN = 0x0, //模拟输入

输出模式

例:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

(1)开漏输出:该模式下只有N-MOS管工作。如果控制输出为低电平,则P-MOS管关闭,N-MOS管导通,使IO输出低电平。如果控制输出高电平,则P-MOS管和N-MOS管都关闭,输出指令就不会起到作用,此时IO端口的电平就不会由所控制输出的高电平决定,而是由IO端口外部的上拉或者下拉决定 如果外部没有上拉或者下拉,那么IO口就会处于悬空状态。

注意!:该模式下施密特触发器是开启的,即输入可用。可以通过输入数据寄存器GPIOx_IDR读取IO的实际状态。即配置开漏模式之后,还可以配置输入模式。IO口的电平不一定是输出的电平。

GPIO_Mode_Out_OD = 0x14, //开漏输出

(2)推挽输出:在该模式下,N-MOS管和P-MOS管都工作。如果控制输出为低电平,则N-MOS管关闭,P-MOS管导通,使IO输出低电平。如果控制输出为高电平,则N-MOS管导通,P-MOS管关闭,使IO输出高电平,此时外部上拉和下拉的作用是控制在没有输出时IO口的电平状态。

注意!:该模式下施密特触发器是开启的,即输入可用。可以通过输入数据寄存器GPIOx_IDR读取IO的实际状态。IO口的电平不一定是输出的电平。

GPIO_Mode_Out_PP = 0x10, //推挽输出

(3)复用推挽输出:在该模式下,GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效。 输出的高低电平来自其它内部外设,其他和推挽输出功能相同。

注意!:该模式下施密特触发器是开启的,即输入可用。可以通过输入数据寄存器GPIOx_IDR读取IO的实际状态。

(4)复用开漏输出:在该模式下,GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效。 输出的高低电平来自其它内部外设,其他和开漏输出功能相同。

注意点同上。

3.如何独立自主的编写一个GPIO外设程序?

(1)使能IO口时钟。调用函数RCC_APB2PeriphColckCmd(),不同的IO组,调用的时钟使能函数不一样。

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);

(2)1个初始化函数:

初始化IO口模式。调用函数GPIOinit();

void GPIO_Init(GPIO_TypeDef" GPIOX, GPIO_InitTypeDef* GPIO_InitStruct);

比如:GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数初始化

作用:初始化一个或者多个O日(同一组)的工作方式和速度。

该函数主要是操作GPIO_CRL(CRH)寄存器,在上拉或者下拉的时候有设置BSRR或者BRR寄存器

 (3)GPIO_Init函数初始化样例:

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LEDO–>PA.5端口配置

GPIO_lnitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50NHz; //IO口速度为50MHZ(一般都是50MHZ)

GPIO_Init(GPIOA, &GPIO_InitStructure);//根据设定参数初始化GPIOA.5

可以一次初始化一个I0组下的多个I0,前提是这些IO口的配置方式一样。

/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
															//使用各个外设前必须开启时钟,否则对外设的操作无效
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;				//GPIO引脚,赋值为所有引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);	

4.输出以及读取IO口电平操作(GPIO_TypeDef* GPIOx一般为GPIOA或GPIOB,uint16_t GPIO_Pin一般为GPIO口引脚接口如 GPIO_Pin_5

(1)两个读取输入电平函数:

①uint8 t GPIO_ReadlnputDataBit(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin); 作用:读取某个GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。

例如:GPIO_ReadlnputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平

②uint16t GPIO_ReadInputData(GPIO TypeDef* GPIOX); 作用:读取某组GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。 例如:GPIO ReadInputData(GPIOA),//读取 GPIOA组中所有io口输入电平

(2).两个读取输出电平函数:

①uint8t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin); 作用:读取某个GPIO的输出电平。实际操作的是GPIO_ODR寄存器。

例如:GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5);//读取GPIOA.5的输出电平

②uint16t GPIO ReadOutputData(GPIO TypeDef* GPIOX); 作用:读取某组GPIO的输出电平。实际操作的是GPIO_ODR寄存器。 例如:GPIO ReadOutputData(GPIOA),//读取GPIOA组中所有io口输出电平

(3)四个设置输出电平函数:

①void GPIO SetBits(GPIO TypeDef* GPIOx,uint16_t GPIO Pin); 作用:设置某个IO口输出为高电平(1)。实际操作BSRR寄存器

②void GPIO ResetBits(GPIOTypeDef* GPIOX,uint16_t GPIO_Pin); 作用:设置某个IO口输出为低电平(0)。实际操作的BRR寄存器。

③void GPIO_WriteBit(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin, BitAction BitVal);

④void GPIO Write(GPIOTypeDef* GPIOx,uint16 t PortVal); 这两个函数不常用,也是用来设置IO口输出电平。

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值