【STM32学习笔记】GPIO相关库函数

GPIO库函数

写程序之前我们得先了解相关的GPIO配置函数

1.void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

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

参数: 1.GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。

     2.GPIO_InitStruct,GPIO的初始化相关结构体。该结构体里的成员变量决定了我们具体的初始化参数。以下进行说明:

  GPIO_Pin:指定具体的io脚,如GPIO_Pin_0,GPIO_Pin_1这样的宏定义。             

  GPIO_Mode:指定GPIO的模式,有四种模式:

 GPIO_Speed:指定IO最快翻转速度,也就是当使用IO产生频率(如PWM)的最大速度。有四种模式:

注意:当某管脚设置为上拉或者下拉输入模式,使用寄存器 Px_BSRR 和 PxBRR
 GPIO_Mode 允许同时设置 GPIO 方向(输入/输出)和对应的输入/输出设置, :位[7:4]对应 GPIO 方向,位[4:0]对应配置。 GPIO 方向有如下索引
- GPIO 输入模式 = 0x00
- GPIO 输出模式 = 0x01
下图 给出了所有 GPIO_Mode 的索引和编码

举例:

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

2.GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)

GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct) 是一个用于初始化 GPIO_InitTypeDef 结构体成员的函数。这个函数通常用于将结构体成员设置为默认值,确保在配置GPIO端口之前,各个字段都被正确初始化。以下是这个函数的定义及其解释:

函数定义

void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)
{
    /* Reset GPIO init structure parameters values */
    GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All;
    GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING;
}

详细解释

  1. GPIO_Pin_All

    • GPIO_InitStructGPIO_Pin 成员设置为 GPIO_Pin_All,表示默认情况下初始化所有GPIO引脚。GPIO_Pin_All 通常是一个宏定义,表示所有引脚的掩码值(例如0xFFFF)。
  2. GPIO_Speed_2MHz

    • GPIO_InitStructGPIO_Speed 成员设置为 GPIO_Speed_2MHz,表示GPIO引脚的默认速度为2MHz。速度选项通常包括 2MHz, 10MHz, 和 50MHz。
  3. GPIO_Mode_IN_FLOATING

    • GPIO_InitStructGPIO_Mode 成员设置为 GPIO_Mode_IN_FLOATING,表示默认情况下GPIO引脚为浮动输入模式

3.GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)

GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) 是一个用于读取指定引脚电平状态的函数。这个函数通常用于检查某个特定引脚的输入电平是高电平(逻辑1)还是低电平(逻辑0)。

函数定义和解释

以下是 GPIO_ReadInputDataBit 函数的定义及其解释:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    uint8_t bitstatus = 0x00;
    
    if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
    {
        bitstatus = (uint8_t)Bit_SET;
    }
    else
    {
        bitstatus = (uint8_t)Bit_RESET;
    }
    
    return bitstatus;
}

详细解释

  1. 参数

    • GPIOx:指向GPIO端口基地址的指针。可以是 GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, 或 GPIOG
    • GPIO_Pin:要读取的引脚编号。可以是 GPIO_Pin_0, GPIO_Pin_1, ..., GPIO_Pin_15。这些通常是宏定义,用于指定具体的引脚。
  2. 返回值

    • 函数返回 uint8_t 类型的值,表示引脚的电平状态:
      • Bit_SET:引脚电平为高电平(逻辑1)。
      • Bit_RESET:引脚电平为低电平(逻辑0)。
  3. 工作原理

    • 读取指定GPIO端口的输入数据寄存器(IDR)。
    • 使用按位与运算(&)检查 IDR 中对应引脚的位是否被置位。
    • 如果对应位被置位,则返回 Bit_SET(高电平);否则,返回 Bit_RESET(低电平)。

使用示例

下面是一个使用 GPIO_ReadInputDataBit 函数读取某个GPIO引脚状态的示例:

#include "stm32f10x_gpio.h"

int main(void)
{
    // 假设我们需要读取 GPIOA 的 Pin 0 的状态
    
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 使能 GPIOA 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 配置 GPIOA Pin 0 为输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // 速度在输入模式下无关紧要
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    while (1)
    {
        // 读取 GPIOA Pin 0 的状态
        uint8_t pinState = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
        
        // 根据 pinState 执行相应的操作
        if (pinState == Bit_SET)
        {
            // Pin 0 是高电平
        }
        else
        {
            // Pin 0 是低电平
        }
    }
}

总结

GPIO_ReadInputDataBit 函数用于读取指定GPIO引脚的电平状态,返回该引脚是高电平还是低电平。通过这个函数,可以方便地监控GPIO引脚的输入信号状态,用于各种输入检测和控制应用。

4.GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)

GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) 是一个用于读取指定引脚的输出数据状态的函数。这个函数用于检查某个特定引脚的输出电平是高电平(逻辑1)还是低电平(逻辑0)。

函数定义和解释

以下是 GPIO_ReadOutputDataBit 函数的定义及其解释:

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    uint8_t bitstatus = 0x00;

    if ((GPIOx->ODR & GPIO_Pin) != (uint32_t)Bit_RESET)
    {
        bitstatus = (uint8_t)Bit_SET;
    }
    else
    {
        bitstatus = (uint8_t)Bit_RESET;
    }
    
    return bitstatus;
}

详细解释

  1. 参数

    • GPIOx:指向GPIO端口基地址的指针。可以是 GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, 或 GPIOG
    • GPIO_Pin:要读取的引脚编号。可以是 GPIO_Pin_0, GPIO_Pin_1, ..., GPIO_Pin_15。这些通常是宏定义,用于指定具体的引脚。
  2. 返回值

    • 函数返回 uint8_t 类型的值,表示引脚的输出电平状态:
      • Bit_SET:引脚电平为高电平(逻辑1)。
      • Bit_RESET:引脚电平为低电平(逻辑0)。
  3. 工作原理

    • 读取指定GPIO端口的输出数据寄存器(ODR)。
    • 使用按位与运算(&)检查 ODR 中对应引脚的位是否被置位。
    • 如果对应位被置位,则返回 Bit_SET(高电平);否则,返回 Bit_RESET(低电平)。

使用示例

下面是一个使用 GPIO_ReadOutputDataBit 函数读取某个GPIO引脚输出状态的示例:

#include "stm32f10x_gpio.h"

int main(void)
{
    // 假设我们需要读取 GPIOA 的 Pin 0 的输出状态

    GPIO_InitTypeDef GPIO_InitStructure;

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

    // 配置 GPIOA Pin 0 为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 设置 GPIOA Pin 0 输出高电平
    GPIO_SetBits(GPIOA, GPIO_Pin_0);

    while (1)
    {
        // 读取 GPIOA Pin 0 的输出状态
        uint8_t pinState = GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0);

        // 根据 pinState 执行相应的操作
        if (pinState == Bit_SET)
        {
            // Pin 0 输出高电平
        }
        else
        {
            // Pin 0 输出低电平
        }
    }
}

总结

GPIO_ReadOutputDataBit 函数用于读取指定GPIO引脚的输出电平状态,返回该引脚是高电平还是低电平。通过这个函数,可以方便地监控GPIO引脚的输出信号状态,用于各种输出控制和状态监测应用。

5.GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)

GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) 是一个用于将指定的 GPIO 引脚设置为高电平(逻辑1)的函数。这个函数在 STM32 库中非常常用,用于设置某个或多个 GPIO 引脚的输出状态。

函数定义和解释

以下是 GPIO_SetBits 函数的定义及其解释:

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    GPIOx->BSRR = GPIO_Pin;
}

详细解释

  1. 参数

    • GPIOx:指向 GPIO 端口基地址的指针。可以是 GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, 或 GPIOG
    • GPIO_Pin:要设置的引脚编号。可以是 GPIO_Pin_0, GPIO_Pin_1, ..., GPIO_Pin_15。这些通常是宏定义,用于指定具体的引脚。
  2. 工作原理

    • 函数通过将指定引脚的位设置到端口的位设置/位重置寄存器(BSRR)中来将引脚设置为高电平。
    • BSRR 寄存器用于同时控制 GPIO 端口的多个引脚。写入 BSRR 的低 16 位会将相应的引脚设置为高电平,写入高 16 位会将相应的引脚设置为低电平。

使用示例

下面是一个使用 GPIO_SetBits 函数设置某个 GPIO 引脚为高电平的示例:

#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

void ConfigureGPIO(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

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

    // 配置 GPIOA Pin 0 为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

int main(void)
{
    // 配置 GPIO
    ConfigureGPIO();

    while (1)
    {
        // 设置 GPIOA Pin 0 输出高电平
        GPIO_SetBits(GPIOA, GPIO_Pin_0);

        // 延时
        for (int i = 0; i < 1000000; i++);

        // 设置 GPIOA Pin 0 输出低电平
        GPIO_ResetBits(GPIOA, GPIO_Pin_0);

        // 延时
        for (int i = 0; i < 1000000; i++);
    }
}

总结

GPIO_SetBits 函数用于将指定 GPIO 引脚设置为高电平(逻辑1)。通过这个函数,可以方便地控制 GPIO 引脚的输出状态,用于各种控制和状态指示应用。

6.GPIO_ResetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)

和上述的GPIO_SetBits差不多,只不过GPIO_ResetBits是将io口设置为低电平。

7.GPIO_WriteBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin, BitAction BitVal)

GPIO_WriteBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin, BitAction BitVal) 是一个用于设置指定 GPIO 引脚输出值的函数。这个函数通常在嵌入式系统开发中使用,特别是在 STM32 系列微控制器的 HAL(硬件抽象层)库中常见。

函数的定义和解释如下:

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
{
    if (BitVal != Bit_RESET)
    {
        GPIOx->BSRR = GPIO_Pin;
    }
    else
    {
        GPIOx->BRR = GPIO_Pin;
    }
}

详细解释:

  • GPIOx:指向 GPIO 端口基地址的指针,可以是 GPIOA、GPIOB 等。
  • GPIO_Pin:要设置的引脚编号,可以是 GPIO_Pin_0GPIO_Pin_15 等具体的宏定义。
  • BitVal:要写入的引脚状态,是一个枚举类型 BitAction,通常有两个值:
    • Bit_RESET 表示将引脚设置为低电平(逻辑 0)。
    • Bit_SET 表示将引脚设置为高电平(逻辑 1)。

工作原理:

  • 函数根据 BitVal 的值来决定将 GPIO 端口的 BSRR(位设置/位重置寄存器)或者 BRR(位复位寄存器)寄存器写入,来设置或者复位指定的引脚。
    • 如果 BitVal 不等于 Bit_RESET,则将 GPIO_Pin 设置到 BSRR 寄存器中,使得对应引脚设置为高电平。
    • 否则,将 GPIO_Pin 设置到 BRR 寄存器中,使得对应引脚设置为低电平。

使用示例:

#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

void ConfigureGPIO(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

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

    // 配置 GPIOA Pin 0 为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

int main(void)
{
    // 配置 GPIO
    ConfigureGPIO();

    while (1)
    {
        // 设置 GPIOA Pin 0 输出高电平
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);

        // 延时
        for (int i = 0; i < 1000000; i++);

        // 设置 GPIOA Pin 0 输出低电平
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);

        // 延时
        for (int i = 0; i < 1000000; i++);
    }
}

在这个示例中,首先配置了 GPIOA 的 Pin 0 为推挽输出模式,然后在主循环中交替使用 GPIO_WriteBit 函数将 GPIOA 的 Pin 0 设置为高电平和低电平,并通过延时产生可见的状态变化。

8.GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal)

GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal) 是一个用于同时设置指定 GPIO 端口的所有引脚状态的函数。在 STM32 系列的 HAL(硬件抽象层)库中,这样的函数通常用于一次性设置整个 GPIO 端口的输出状态。

函数的定义和解释如下:

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
{
    GPIOx->ODR = PortVal;
}

详细解释:

  • GPIOx:指向 GPIO 端口基地址的指针,可以是 GPIOA、GPIOB 等。
  • PortVal:要写入的值,是一个 16 位的整数,表示要设置的 GPIO 端口的输出状态。每一位对应 GPIO 端口的一个引脚,例如 0x0001 表示第一个引脚设置为高电平,0x0000 表示所有引脚设置为低电平。

工作原理:

  • 函数将 PortVal 的值直接写入 GPIO 端口的输出数据寄存器(ODR),从而同时设置整个 GPIO 端口的输出状态。
  • 每一位 PortVal 对应 GPIO 端口的一个引脚,该引脚的状态会根据 PortVal 中的对应位设置为高电平或者低电平。

使用示例:

#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

void ConfigureGPIO(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

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

    // 配置 GPIOA 的引脚为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

int main(void)
{
    // 配置 GPIO
    ConfigureGPIO();

    while (1)
    {
        // 设置 GPIOA 所有引脚输出高电平
        GPIO_Write(GPIOA, 0xFFFF);

        // 延时
        for (int i = 0; i < 1000000; i++);

        // 设置 GPIOA 所有引脚输出低电平
        GPIO_Write(GPIOA, 0x0000);

        // 延时
        for (int i = 0; i < 1000000; i++);
    }
}

在这个示例中,首先配置了 GPIOA 的所有引脚为推挽输出模式,然后在主循环中交替使用 GPIO_Write 函数设置 GPIOA 的所有引脚为高电平和低电平,并通过延时产生可见的状态变化。

9.GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)

GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) 是一个用于锁定指定 GPIO 引脚的配置寄存器的函数。在 STM32 系列的 HAL(硬件抽象层)库中,这个函数通常用于保护已经配置好的 GPIO 引脚设置,防止被意外或恶意修改。

函数的定义和解释如下:

void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    uint32_t tmp = GPIO_Pin;

    // 锁定引脚
    GPIOx->LCKR = tmp | GPIO_LCKR_LCK;

    // 再次写入以确认锁定
    GPIOx->LCKR = tmp;

    // 再次读取确认锁定状态
    tmp = GPIOx->LCKR;

    // 再次写入以解锁
    GPIOx->LCKR = GPIO_Pin;
}

详细解释:

  • GPIOx:指向 GPIO 端口基地址的指针,可以是 GPIOA、GPIOB 等。
  • GPIO_Pin:要锁定的引脚编号,可以是 GPIO_Pin_0GPIO_Pin_15 等具体的宏定义。

工作原理:

  • 函数通过对 GPIO 端口的锁定控制寄存器(LCKR)进行特定的写入操作来锁定或解锁指定的引脚。
  • 这个函数通常用于在配置 GPIO 引脚之后,通过锁定操作来确保引脚配置不被修改,提高系统的稳定性和安全性。
  • 锁定操作涉及多次写入和读取 LCKR 寄存器,以确认锁定或解锁状态。

注意事项:

  • 锁定后的引脚配置无法再被修改,直到系统复位或者进行特定的解锁操作。
  • 这个函数在使用时应该小心谨慎,确保正确理解和使用锁定功能,避免意外导致的引脚配置问题。

这个函数通常在需要保护 GPIO 引脚配置不被修改的场景下使用,如在特定配置完成后调用以确保不会意外改变引脚的功能或状态

10.GPIO_PinRemapConfig(u32 GPIO_Remap, FunctionalState NewState)

端口重映射后面详细介绍。

11.GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)

GPIO_EXTILineConfig 函数通常用于配置外部中断线(External Interrupt Line)与 GPIO 引脚的映射关系。在许多微控制器中,外部中断可以通过配置来映射到不同的 GPIO 引脚,这为处理外部事件(如按钮按下、传感器触发等)提供了灵活性。

函数定义和解释

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
参数说明:
  • GPIO_PortSource:指定的 GPIO 端口源,用于指定要映射到外部中断线的 GPIO 端口。
  • GPIO_PinSource:指定的 GPIO 引脚源,用于指定要映射到外部中断线的具体 GPIO 引脚。

工作原理:

该函数的主要作用是将指定的 GPIO 引脚映射到外部中断线。在一些微控制器中,外部中断线有多个,可以通过配置来选择连接到哪个 GPIO 引脚,从而允许系统在外部事件发生时触发中断处理函数。

使用示例:

以下是一个示例,展示如何使用 GPIO_EXTILineConfig 函数来配置外部中断线与 GPIO 引脚的映射关系:

#include "stm32f10x_gpio.h"
#include "stm32f10x_exti.h"

void ConfigureExternalInterrupt(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;

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

    // 配置 GPIOA Pin 0 为输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  // 下拉输入模式
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置外部中断线 0(对应 GPIOA Pin 0)
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

    // 配置外部中断线 0 的触发方式
    EXTI_InitStruct.EXTI_Line = EXTI_Line0;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;  // 上升沿触发
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStruct);

    // 配置外部中断中断优先级
    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}

// 外部中断 0 的中断处理函数
void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        // 处理外部中断事件
        // 清除中断标志
        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}

int main(void)
{
    // 配置外部中断
    ConfigureExternalInterrupt();

    while (1)
    {
        // 主应用程序循环
    }
}

解释和注意事项:

  1. 配置 GPIO 和外部中断:在 ConfigureExternalInterrupt 函数中,首先配置了 GPIOA Pin 0 作为输入模式,并将其配置到外部中断线 0。

  2. 配置外部中断触发方式:使用 EXTI_InitStruct 结构体配置了外部中断线 0 的触发方式,例如在上升沿触发时执行中断处理。

  3. 中断处理函数:定义了 EXTI0_IRQHandler 函数作为外部中断 0 的中断处理函数,在该函数中可以处理外部中断触发时的操作。

  4. 注意事项:具体的配置和操作依赖于使用的硬件平台和具体的微控制器型号,需要参考相应的芯片手册和开发板资料进行适当的调整和配置。

通过以上示例,希望能够帮助你理解 GPIO_EXTILineConfig 函数的作用和用法,以及外部中断与 GPIO 引脚的映射配置。

 电路连接

如图发光二极管的正极连接到3.3v,我们如果需要电亮led的话,只需拉低另外一段的电压就行。

程序:

首先我们可以配置GPIO口,然后用GPIO_SetBits将io拉高,然后我们到主程序里面拉低。

我们拉低对应引脚就可以点亮了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值