STM32F103 GPIO

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

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

    1. void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
    1. {
    1. /* Check the parameters */
    1. assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
    1. assert_param(IS_FUNCTIONAL_STATE(NewState));
    1. if (NewState != DISABLE)
    1. {
    1. RCC->APB2ENR |= RCC_APB2Periph;
    1. }
    1. else
    1. {
    1. RCC->APB2ENR &= ~RCC_APB2Periph;
    1. }
    1. }

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

    1. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;
    1. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    1. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    1. GPIO_Init(GPIOG, &GPIO_InitStructure);

3. 配置输出:

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

    1. #define LED1_ON GPIO_SetBits(GPIOG, GPIO_Pin_13);
    1. #define LED1_OFF GPIO_ResetBits(GPIOG, GPIO_Pin_13);
    1. #define LED2_ON GPIO_SetBits(GPIOG, GPIO_Pin_14);
    1. #define LED2_OFF GPIO_ResetBits(GPIOG, GPIO_Pin_14);
    1. void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    1. {
    1. /* Check the parameters */
    1. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
    1. assert_param(IS_GPIO_PIN(GPIO_Pin));
    1. GPIOx->BSRR = GPIO_Pin;
    1. }
    1. void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    1. {
    1. /* Check the parameters */
    1. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
    1. assert_param(IS_GPIO_PIN(GPIO_Pin));
    1. GPIOx->BRR = GPIO_Pin;
    1. }

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

posted @ 2025-11-06 11:19  张大帅哥  阅读(4)  评论(0)    收藏  举报