×
单片机 > 单片机程序设计 > 详情

STM32F103ZET6 —— GPIO

发布时间:2020-06-09 发布时间:
|

STM32 的 GPIO 可以由软件配置成为几种不同的模式,每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问:

A. 芯片侧:

1. 输入:


MODE    Descriptions
输入浮空引脚配置成为浮空状态,接施密特触发器,常用的场景是外接按键
输入上拉输入接上拉电阻,将不确定的信号钳位到高电平
输入下拉输入接下拉电阻,将不确定的信号钳位到低电平
模拟输入

信号直接进入ADC模块,即无法再输入寄存器中读到IO口的状态







2. 输出:


MODE    Descriptions
开漏输出

所谓开漏,指MOSFET漏极。IO输出1时,悬空,需要外部电路上拉电阻方可实现高电平的输出(低电平接地)。

一般用于电平不匹配情况,通过外部上下拉电阻来实现不同电平输出。

推挽输出输出 0 接GND,输出 1 接 VCC(即0=》GND,1=》3.3V)
开漏复用PinMux 到其他功能使用
推挽复用

PinMux 到其他功能使用








B. 硬件侧:

对应的单板,有两个GPIO连接到LED上:



使用的是 GPIO 的 Port G 的 Pin13 和 Pin14 脚


C. 代码侧:

配置上述两个 GPIO 工作需要的步骤如下:

1. 使能对应的 GPIO_G 的时钟

2. 配置 GPIO_G13/GPIO_G14 为通用推挽输出,配置口线翻转速度50M

3. 配置完成后,设置端口的输出为1/0即可控制 GPIO 的输出。


1. 时钟设置:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG , ENABLE); // 此处 RCC_APB2Periph_GPIOG 为 (0x01 << 8)

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));

  assert_param(IS_FUNCTIONAL_STATE(NewState));

  if (NewState != DISABLE)

  {

    RCC->APB2ENR |= RCC_APB2Periph;

  }

  else

  {

    RCC->APB2ENR &= ~RCC_APB2Periph;

  }

}

2. 配置 GPIO_G13/GPIO_G14 为通用推挽输出,50M速度


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 

GPIO_Init(GPIOG, &GPIO_InitStructure);

3.  配置输出:


STM32 配置 GPIO 的输出1/0,提供了多种方式,有端口直接写入1/0的寄存器(GPIOx_ODR),也有专门设置 1 值的寄存器(GPIOx_BSRR),同样有专用用于设置 0 值的寄存器(GPIOx_BRR)。可以随意使用:


#define LED1_ON GPIO_SetBits(GPIOG, GPIO_Pin_13);  

#define LED1_OFF GPIO_ResetBits(GPIOG, GPIO_Pin_13); 

 

#define LED2_ON GPIO_SetBits(GPIOG, GPIO_Pin_14);  

#define LED2_OFF GPIO_ResetBits(GPIOG, GPIO_Pin_14); 

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_PIN(GPIO_Pin));

  

  GPIOx->BSRR = GPIO_Pin;

}

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_PIN(GPIO_Pin));

  

  GPIOx->BRR = GPIO_Pin;

}

基本的使用方式如上述,后续再在具体的外设部分,在介绍 GPIO 的复用功能


关键字:STM32F103ZET6  GPIO 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32单片机的复用端口初始化的步骤及方法