STM32F103ZE中GPIO笔记

目录

1.GPIO输入输出工作方式

1)输入浮空模式

2)输入上拉—下拉模式

3)输入模拟模式

4)输出开漏模式

5)复用输出开漏模式

6)输出推挽模式

7)复用输出推挽模式

2.GPIO寄存器

GPIOx_CRL :端口配置低寄存器 -

GPIOx_CRH:端口配置高寄存器 -

GPIOx_IDR:端口输入寄存器 -

GPIOx_ODR:端口输出寄存器 -

GPIOx_BSRR:端口位设置/清除寄存器 -

GPIOx_BRR :端口位清除寄存器

GPIOx_LCKR:端口配置锁存寄存器

3.GPIO功能

端口复用功能

端口重映射功能

4.GPIO初始化

1.HAL库初始化

2.标准库初始化

3.GPIO配置结构体

4.GPIO函数

(1)HAL_GPIO_DeInit

(2)HAL_GPIO_LockPin

(3)HAL_GPIO_ReadPin

(4)HAL_GPIO_TogglePin

(5)HAL_GPIO_WritePin


1.GPIO输入输出工作方式

1)输入浮空模式

浮空顾名思义就是悬浮在空中,也叫悬空输入。

配置成浮空输入模式,如果没有连接其他设备,检测到的电平是不确定的,有可能检测到高电平,也有可能检测到低电平。

2)输入上拉—下拉模式

上拉模式时输入端口默认为高电平,下拉与之相反

3)输入模拟模式

这个模式比较好理解,主要用于模拟输入时的配置(一般是针对ADC功能)。在特殊DAC输出的时候也用该模式

4)输出开漏模式

输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).

输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。

​ 输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路);

此模式可以把端口作为双向IO使用。

支持线与和电平转换——线与,即两个输出端(包括两个以上)直接互连就可以实现“AND”(有0出0,全1出1)的逻辑功能。

5)复用输出开漏模式

所谓的管脚复用,就是除第一功能外,增加了第二功能.当然在利用程序控制时是不会影响的

6)输出推挽模式

可以输出高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。

输出 0 时,N-MOS 导通,P-MOS 高阻,输出0。

输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。

不支持线与和电平转换

7)复用输出推挽模式

所谓的管脚复用,就是除第一功能外,增加了第二功能当然在利用程序控制时是不会影响的.

2.GPIO寄存器

GPIOx_CRL :端口配置低寄存器 -

选定GPIO 的特定功能,最基本的如:选择作为输入还是输出端口,运行模式和运作速度

GPIOx_CRH:端口配置高寄存器 -

选定GPIO 的特定功能,最基本的如:选择作为输入还是输出端口,运行模式和运作速度

GPIOx_IDR:端口输入寄存器 -

32位寄存器其中16-31位一直保留,始终为0;0-15位则对应着16个IO口,1为高电平,0为低电平。

如:GPIOA->IDR & 0x0001 即为 PA-1的电平状态,IDR寄存器的16位对应了该GPIO的P0-P15

GPIOx_ODR:端口输出寄存器 -

与数据输入的配置差不多,但是ODR在输入模式下可以控制上升沿和下降沿的配置!

GPIOx_BSRR:端口位设置/清除寄存器 -

BSRR比之上面的寄存器有些复杂,但也不是很难,32位分两个16位高和低,共同控制ODR数据输出寄存器的每一位输出;具体的控制方式在下图中。

高低位0不产生影响,高位置1则对应ODR位为0.低位置1则对应ODR为1;高低位同事作用时,则只有低16位起作用!

GPIOx_BRR :端口位清除寄存器

该寄存器与上面BSRR高16位作用相同,F1中有些赘余,但F4中已优化。

GPIOx_LCKR:端口配置锁存寄存器

3.GPIO功能

端口复用功能

STM32的大部分端口都具有复用功能。 所谓复用,就是一些端口不仅仅可以做为通用IO口,还可以复用为一 些外设引脚,比如PA9,PA10可以复用为STM32的串口1引脚。

端口重映射功能

例如串口1的默认引脚为A9,当A9被占用时,根据芯片端口重映射功能,把B6分配为串口1引脚使用。一但无可分配引脚,则串口1无法使用。

4.GPIO初始化

1.HAL库初始化

static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;
    //声明一个结构体,结构体的名字为GPIO_InitStruct,结构体的原型由GPIO_InitTypeDef确定

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOB_CLK_ENABLE();
	//使能GPIOB的时钟线,如果没有开启时钟线,GPIOB无法正常使用
    //使能了外设时钟后,不能立即操作对应的寄存器,要加延迟。例如加一个读操作或写操作
    //a、如果是AHB的外设,使能了时钟后,需要等待2个AHB时钟周期才可以操作这个外设的寄存器。
	//b、如果是APB的外设,使能了时钟后,需要等待2个APB时钟周期才可以操作这个外设的寄存器。

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
	//将B5默认电平设置为高电平

  /*Configure GPIO pin : PB5 */
  
  GPIO_InitStruct.Pin = GPIO_PIN_5;
    //选择5号引脚
    //#define GPIO_PIN_5		((uint16_t)0x0020)

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    //引脚模式为推挽输出
    //#define  GPIO_MODE_OUTPUT_PP		0x00000001U 

  GPIO_InitStruct.Pull = GPIO_NOPULL;
    //没有上拉或下拉电阻
    //#define  GPIO_NOPULL		0x00000000U 

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    //选择低速传输 输出模式,最大速度2MHz 
    //#define  GPIO_SPEED_FREQ_LOW		(0x2U << GPIO_CRL_MODE0_Pos)

  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); 
    //将结构体的配置给GPIOB 
}

2.标准库初始化

void GPIO_init(void)

{

    GPIO_InitTypeDef GPIO_InitStruct;                    
    //声明一个结构体,结构体的名字为GPIO_InitStruct,结构体的原型由GPIO_InitTypeDef确定

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 
    //使能GPIOA时钟

    GPIO_InitStruct.GPIO_Mode    = GPIO_Mode_Out_PP;    
    //配置输出推挽模式

    GPIO_InitStruct.GPIO_Pin     = GPIO_Pin_0;           
    //配置0号IO口

    GPIO_InitStruct.GPIO_Speed   = GPIO_Speed_50MHz;     
    //配置IO口速度,仅输出有效

    GPIO_Init(GPIOA,&GPIO_InitStruct);                   
    //初始化GPIOA的参数为以上结构体

}

3.GPIO配置结构体

typedef struct
{
  uint32_t Pin;       //第几个引脚


  uint32_t Mode;      //GPIO模式

  uint32_t Pull;      //上拉电阻或下拉电阻或无上拉下拉电阻

  uint32_t Speed;     //工作速度

} GPIO_InitTypeDef;

4.GPIO函数

(1)HAL_GPIO_DeInit

功能:这个函数的主要功能是将我们在1函数初始化之后的引脚恢复成默认的状态,即各个寄存器复位时的值

例:HAL_GPIO_DeInit(GPIOx,GPIO_PIN_X);

(2)HAL_GPIO_LockPin

功能:这个函数看函数名称就是锁住的意思,比如说一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值。

例:HAL_GPIO_LockPin(GPIOX,GPIO_PIN_X);

(3)HAL_GPIO_ReadPin

功能:检测这个管教当前状态值,函数返回值为0或1。

例:HAL_GPIO_ReadPin(GPIOX,GPIO_PIN_X);

(4)HAL_GPIO_TogglePin

功能:这个函数用来翻转某个引脚的电平状态,我用的最多的场合是LED灯的翻转,也就是LED闪烁。

例:HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_10);

(5)HAL_GPIO_WritePin

功能:这个函数从字面意思来看就是给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思,这一点要谨记。

例:HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET) //设置为高电平 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET) //设置为低电平

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值