STM32F103ZET6 —— GPIO

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. 时钟设置:

STM32F103ZET6 —— 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速度

STM32F103ZET6 —— GPIO_第2张图片

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 的复用功能

你可能感兴趣的:(MCU)