STM32外设GPIO(学习笔记)

这篇具有很好参考价值的文章主要介绍了STM32外设GPIO(学习笔记)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在编写stm32程序时,对寄存器进行操着需要知道每个外设的基地址,标准库的stm32f10x.h文件里也有各种外设的基地址。

比如GPIO:在定义输出数据寄存器地址GPIOA_ODR_Addr时,在GPIOA_BASE(GPIO端口A的基址地址)地址基础上偏移

#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 

在stm32f10x.h文件里面有定义GPIOA_BASE,是APB2PERIPH_BASE(APB2(Advanced Peripheral Bus 2)总线的基址地址,高速总线)偏移0x0800

APB2PERIPH_BASE是在PERIPH_BASE地址基础上偏移0x10000

PERIPH_BASE地址就是表示内存地址空间的起始地址

/**********************************************************/
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)



/**********************************************************/
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)



/**********************************************************/
#define PERIPH_BASE           ((uint32_t)0x40000000)

//通用IO口地址映射表

STM32外设GPIO(学习笔记),stm32,学习,笔记STM32外设GPIO(学习笔记),stm32,学习,笔记

typedef struct
{
  __IO uint32_t CRL;         // 端口配置低寄存器, 地址偏移 0X00
  __IO uint32_t CRH;         // 端口配置高寄存器, 地址偏移 0X04
  __IO uint32_t IDR;         // 端口数据输入寄存器, 地址偏移 0X08
  __IO uint32_t ODR;         // 端口数据输出寄存器, 地址偏移 0X0C
  __IO uint32_t BSRR;        // 端口位设置/清除寄存器,地址偏移 0X10
  __IO uint32_t BRR;         // 端口位清除寄存器, 地址偏移 0X14
  __IO uint32_t LCKR;        // 端口位锁定寄存器, 地址偏移 0X18
} GPIO_TypeDef;

这段代码定义了一个名为GPIO_TypeDef的结构体类型,这是一种通用输入输出端口(GPIO)的类型定义。

"__IO"前缀相当于代表了C 语言中的关键字“volatile”,在 C 语言中该关键字用于表示变量是易变的,要求编译器不要优化。因为GPIO_TypeDef这个结构体里面都对应着寄存器,经常由外设或者STM32芯片状态修改,即使CPU不去改变这些寄存器内的值,这些寄存器内的值也会发生变化,当使用这些变量时,就要求CPU重新去访问地址读取数据,若没有“__IO”前缀,就会从CPU某个缓存区读取没及时更新的旧的数据。

下面是结构体中每个成员的含义:

  1. CRL(Configuration Low Register)- 低字节配置寄存器,用于配置端口低8位引脚的模式、速度和上拉/下拉选择。
  2. CRH(Configuration High Register)- 高字节配置寄存器,用于配置端口高8位引脚的模式、速度和上拉/下拉选择。
  3. IDR(Input Data Register)- 输入数据寄存器,用于存储输入引脚的状态。
  4. ODR(Output Data Register)- 输出数据寄存器,用于存储输出引脚的状态。
  5. BSRR(Bit Set/Reset Register)- 位设置/复位寄存器,用于单独设置或复位引脚的状态。
  6. BRR(Bit Reset Register)- 位复位寄存器,用于复位引脚的状态。
  7. LCKR(Lock Register)- 锁寄存器,用于锁定GPIO的配置寄存器,防止意外修改。

在使用库函数时,里面经常会看到下面这些:

#define I2C1                ((I2C_TypeDef *) I2C1_BASE)
#define EXTI                ((EXTI_TypeDef *) EXTI_BASE)
#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
#define ADC1                ((ADC_TypeDef *) ADC1_BASE)
#define TIM1                ((TIM_TypeDef *) TIM1_BASE)
#define SPI1                ((SPI_TypeDef *) SPI1_BASE)
#define USART1              ((USART_TypeDef *) USART1_BASE)

比如#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)为例,定义GPIO_TypeDef结构体指针,结构体里面成员的类型和分布顺序是和寄存器里面一一对应的(结构体里面成员是32位的(即四个字节),下表GPIO寄存器里面也是每一个偏移4个字节)

STM32外设GPIO(学习笔记),stm32,学习,笔记

然后就可以通过该结构体指针就可以直接操作

STM32外设GPIO(学习笔记),stm32,学习,笔记

用操作寄存器写一个配置GPIO的示例程序:(知道就行)

#include "stm32f10x.h"

void GPIOA_PinConfig(uint32_t GPIO_Pin)
{
    // 1. 使能GPIOA的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 2. 获取GPIOA对应的寄存器地址
    GPIO_TypeDef *GPIOx = GPIOA; // 指向GPIOA寄存器的指针

    // 3. 配置引脚为复用推挽模式(AF_PP)
    GPIOx->CRH &= ~(0x0F << (4 * GPIO_Pin)); // 清除模式位
    GPIOx->CRH |= (GPIO_Mode_Out_PP << (4 * GPIO_Pin)); // 设置模式位

    // 4. 配置输出速度
    GPIOx->CRH &= ~(0x03 << (2 * GPIO_Pin)); // 清除速度位
    GPIOx->CRH |= (GPIO_Speed_50MHz << (2 * GPIO_Pin)); // 设置输出速度
}

int main(void)
{
    // 系统初始化
    SystemInit();

    // 配置GPIOA的第0号引脚
    GPIOA_PinConfig(GPIO_Pin_0);

    // 主循环
    while (1)
    {

    }
}
  1. 使能GPIOA的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 这行代码是用来使能STM32的时钟控制模块(RCC)中GPIOA端口的时钟。在STM32中,GPIO端口是映射到APB2总线上的,所以使用RCC_APB2PeriphClockCmd函数来控制其时钟。ENABLE是一个参数,表示使能时钟。

  2. 获取GPIOA对应的寄存器地址 GPIO_TypeDef *GPIOx = GPIOA; // 指向GPIOA寄存器的指针 这里定义了一个指向GPIOA端口寄存器的指针。GPIO_TypeDef是STM32的寄存器定义结构体,用于存放端口的寄存器地址。GPIOx是一个类型为GPIO_TypeDef的指针变量,通过这个指针可以访问到GPIOA的所有寄存器。

  3. 配置引脚为复用推挽模式(AF_PP) GPIOx->CRH &= ~(0x0F << (4 * GPIO_Pin)); // 清除模式位 GPIOx->CRH |= (GPIO_Mode_Out_PP << (4 * GPIO_Pin)); // 设置模式位 这两行代码用于配置GPIOA的某一个引脚的模式。CRH是GPIOA端口的高字节寄存器,用于控制第11到第15引脚的配置。GPIO_Pin是一个宏,代表你要配置的引脚编号。0x0F是一个十六进制数,左移四位后用来清除模式位。GPIO_Mode_Out_PP是一个宏,代表复用推挽输出模式。这两行代码的组合效果就是清除原来的模式位并设置新的模式位,将引脚配置为复用推挽模式。

  4. 配置输出速度 GPIOx->CRH &= ~(0x03 << (2 * GPIO_Pin)); // 清除速度位 GPIOx->CRH |= (GPIO_Speed_50MHz << (2 * GPIO_Pin)); // 设置输出速度 这里设置GPIOA引脚的输出速度。CRH寄存器的高四位用于设置输出速度。GPIO_Speed_50MHz是一个宏,表示输出速度为50MHz。通过清除原来的速度位并设置新的速度位,将引脚的输出速度配置为50MHz。

用标准库函数写一个配置GPIO的示例程序:

#include "stm32f10x.h"

void GPIOA_PinConfig(void)
{
    // 1. 首先,我们需要使能GPIOA的时钟,这样相关的寄存器才能被访问
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 2. 配置GPIOA的第0号引脚为复用推挽模式(AF_PP),用于输出
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 选择PA0
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 复用推挽模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度为50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的第0号引脚
}

int main(void)
{
    // 系统初始化
    SystemInit();

    // 配置GPIOA的第0号引脚
    GPIOA_PinConfig();

    // 主循环
    while (1)
    {
    }
}

标准库的GPIO库函数:

void GPIO_DeInit(GPIO_TypeDef* GPIOx);
void GPIO_AFIODeInit(void);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

1.void GPIO_DeInit(GPIO_TypeDef* GPIOx);

        将GPIOx外设寄存器初始化为其默认重置值。

  // 假设此时你需要重置GPIOB到默认状态
  GPIO_DeInit(GPIOB);

2.void GPIO_AFIODeInit(void);

        取消初始化备用函数(重新映射、事件控制和EXTI配置)注册到它们的默认重置值。

        通俗讲:将AFIO模块的配置恢复到出厂默认设置。包括将所有复用功能配置重置为GPIO模式,确保没有其他外设占用这些端口。在系统复位或初始化时调用这个函数,可以确保所有的GPIO端口都是按照预期的方式配置的。

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

        根据指定初始化GPIOx外设GPIO_InitStruct中的*参数。

        void 表示函数没有返回值。

        GPIO_Init 是函数名。

        GPIO_TypeDef* GPIOx 是函数的第一个参数,它是一个指向 GPIO_TypeDef 类型的指针,这个类型定义了GPIO端口的相关结构和特性。GPIOx 通常用来指代不同的GPIO端口,比如 GPIOAGPIOBGPIOC 等。

        GPIO_InitTypeDef* GPIO_InitStruct 是函数的第二个参数,它是一个指向 GPIO_InitTypeDef 类型的指针,这个类型定义了GPIO端口的初始化结构体,包含了端口的各种配置选项,如模式、速度、输出类型、输出速度、上下拉配置等。

        这个函数的作用是根据 GPIO_InitStruct 结构体中指定的参数来配置 GPIOx 端口的相关特性。例如,你可以设置端口为输入模式,并配置内部上下拉电阻;或者设置端口为输出模式,并配置输出速度和类型。

	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);

4.void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)

        用默认值填充每个GPIO_InitStruct成员。

        将配置好的GPIO_InitStructure结构体成员恢复默认。

5.uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

        读取指定的输入端口引脚。

// 读取GPIOx的Pin0的状态
uint8_t pin_state = GPIO_ReadInputDataBit(GPIOx, GPIO_Pin_0);

/*返回(uint8_t)Bit_SET或者(uint8_t)Bit_RESET;*/

6.uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

        读取指定的GPIO输入数据端口。

    while (1)
    {
        // 读取GPIOx的所有引脚的状态
        uint16_t input_data = GPIO_ReadInputData(GPIOx);

        // 检查每个引脚的状态
        for (int i = 0; i < 16; i++) { // 假设GPIOA有16个引脚
            if ((input_data & (1 << i)) != 0) {
                // 如果第i个引脚是高电平
                printf("Pin %d is HIGH\n", i);
            } else {
                // 如果第i个引脚是低电平
                printf("Pin %d is LOW\n", i);
            }
        }
    }

先定义了要使用的 GPIO 端口。然后在主循环中,使用 GPIO_ReadInputData 函数来读取 GPIOA 端口的所有引脚的状态。我们将读取的数据循环检查每个引脚的状态,并通过printf函数输出是高电平还是低电平。

7.uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

        读取指定的输出数据端口位。

8.uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

        读取指定的GPIO输出数据端口。

9.void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);将GPIOx的GPIO_Pin_x脚置高电平。
   void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);将GPIOx的GPIO_Pin_x脚置低电平。

10.void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);设置或清除所选数据端口位。
     void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);将数据写入指定的GPIO数据端口。

        // 切换GPIOA的Pin0和Pin1的状态
        GPIO_WriteBit(GPIOA, GPIO_PIN0, Bit_RESET);
        GPIO_WriteBit(GPIOA, GPIO_PIN1, Bit_SET);

    // 设置GPIOA的所有引脚为高电平
    uint16_t all_pins = 0xFFFF; // 16位全为1,表示所有引脚
    GPIO_Write(GPIOA, all_pins);

11.void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

        锁定GPIO引脚配置寄存器。
12.void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

        选择用作事件输出的GPIO引脚。

     void GPIO_EventOutputCmd(FunctionalState NewState);

        启用或禁用事件输出。

#include "stm32f10x.h"

// 假设我们使用GPIOA的Pin0作为事件输出源
#define GPIO_PortSource GPIOA
#define GPIO_PinSource GPIO_Pin_0

void EXTI0_IRQHandler(void) // EXTI0中断处理函数
{
    // 检查是否是GPIOA的Pin0产生的中断
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        // 清除中断标志
        EXTI_ClearITPendingBit(EXTI_Line0);

        // 这里添加中断处理代码
        printf("GPIOA Pin0 interrupt occurred!\n");
    }
}

int main(void)
{
    // 系统初始化代码(略)

    // 配置GPIOA的Pin0作为事件输出源!!!!!!!!!!!
    GPIO_EventOutputConfig(GPIO_PortSource, GPIO_PinSource);
    // 启用GPIOA的Pin0的事件输出功能
    GPIO_EventOutputCmd(GPIO_PortSource, GPIO_PinSource, ENABLE);

    // 配置GPIOA的Pin0为上拉输入,并配置为中断模式
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_PinSource;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 输入模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 上拉
    GPIO_Init(GPIO_PortSource, &GPIO_InitStructure);

    // 配置EXTI线为中断模式
    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
    EXTI_Init(&EXTI_InitStructure);

    // 使能中断!!!!!!!!!!!
    NVIC_EnableIRQ(EXTI0_IRQn);

    // 主循环
    while (1)
    {
        // 可以在这里添加其他代码
    }
}


13.void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);

        更改指定引脚的映射。

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);


重映射后记得打开复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); /* 打开GPIO时钟 */


14.void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

        选择用作EXTI线的GPIO引脚。

#include "stm32f10x.h" // STM32F10x 系列的标准库头文件

// 假设我们使用GPIOB的Pin0作为外部中断源
#define GPIO_PortSource GPIOB
#define GPIO_PinSource GPIO_Pin_0

void EXTI0_IRQHandler(void) // EXTI0中断处理函数
{
    // 检查是否是GPIOB的Pin0产生的中断
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        // 清除中断标志
        EXTI_ClearITPendingBit(EXTI_Line0);

        // 这里添加中断处理代码
        printf("GPIOB Pin0 interrupt occurred!\n");
    }
}

int main(void)
{
    // 系统初始化代码(略)

    // 配置GPIOB的Pin0为外部中断源
    GPIO_EXTILineConfig(GPIO_PortSource, GPIO_PinSource);

    // 配置EXTI线为中断模式
    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
    EXTI_Init(&EXTI_InitStructure);

    // 使能中断
    NVIC_EnableIRQ(EXTI0_IRQn);

    // 主循环
    while (1)
    {
        // 可以在这里添加其他代码
    }
}


15.void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

        选择以太网媒体接口。文章来源地址https://www.toymoban.com/news/detail-848645.html

GPIO功能框图讲解:
网下图2,3,4部分是GPIO输入部分;5,6,7部分是输出部分;
STM32外设GPIO(学习笔记),stm32,学习,笔记
TTL肖特基触发器(也叫施密特触发器)如果输入电压大于某一阈值,输出就会瞬间升为高电平,如果输入电压小于某─阈值。输出就会瞬间降为低电平。大于2V为高电平,低于1.2V为低电平。
STM32外设GPIO(学习笔记),stm32,学习,笔记
推挽输出
        OUT处相当于肉眼可见的芯片引脚,引脚的两个保护二级管可以防止引脚外部过高或过低的电压输入,当引脚电压高于 VDD 时,上方的二极管导通,当引脚电压低于 VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。(不能直接接大功率驱动芯片)
        INT(相当于芯片内部GPIO的ODR数据输出寄存器输出的值),当INT为1时,经过反向放大器,2处为0,PMOS管导通,NMOS管关闭,对外输出高电平;
        当INT为0时,经过反向放大器,2处为1,PMOS管关闭,NMOS管导通,对外输出低电平;
PMOS管负责灌电流,NMOS管负责拉电流。
        推挽结构指两个三极管受两路互补的信号控制,总是在一个导通的时候 另外一个截止,优点开关效率效率高,电流大,驱动能力强。
        输出高电平时,电流输出到负载,叫灌电流,可以理解成推,输出低电 平时,负载电流流向芯片,叫拉电流,即挽。
STM32外设GPIO(学习笔记),stm32,学习,笔记开漏输出
1、只能输出低电平,不能输出高电平。
2、如果要输出高电平,则需要外接上拉。
3、开漏输出具有“线与”功能,一个为低,全部为低,多用于I2C和
SMBUS总线。
        开漏输出一般应用在 I2C、 SMBUS 通讯等需要“线与”功能的总线电路中。除此之外,还用在电平不匹配的场合,如需要输出 5 伏的高电平,就可以在外部接一个上拉电阻,上拉电源为 5 伏,并且把 GPIO 设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出 5 伏的电平。
         STM32外设GPIO(学习笔记),stm32,学习,笔记
自建固件库:
以端口位设置/清除寄存器(GPIOx_BSRR) (x=A..E)为例,设置GPIO口为高电平只需让该寄存器低16为置一即可。
#define GPIO_Pin_12   ((uint16_t)0x1000)  /*!< 选择Pin12 */   //(00010000 00000000)b
STM32外设GPIO(学习笔记),stm32,学习,笔记
只对低16位操作,又是整型,所以是uint16_t,0x1000是16进制,一个16进制位对应4个二进制位,所以是0x1000
STM32外设GPIO(学习笔记),stm32,学习,笔记
#define GPIO_Pin_0    ((uint16_t)0x0001)  /*!< 选择Pin0 */    //(00000000 00000001)b
#define GPIO_Pin_1    ((uint16_t)0x0002)  /*!< 选择Pin1 */    //(00000000 00000010)b
#define GPIO_Pin_2    ((uint16_t)0x0004)  /*!< 选择Pin2 */    //(00000000 00000100)b
#define GPIO_Pin_3    ((uint16_t)0x0008)  /*!< 选择Pin3 */    //(00000000 00001000)b
#define GPIO_Pin_4    ((uint16_t)0x0010)  /*!< 选择Pin4 */    //(00000000 00010000)b
#define GPIO_Pin_5    ((uint16_t)0x0020)  /*!< 选择Pin5 */    //(00000000 00100000)b
#define GPIO_Pin_6    ((uint16_t)0x0040)  /*!< 选择Pin6 */    //(00000000 01000000)b
#define GPIO_Pin_7    ((uint16_t)0x0080)  /*!< 选择Pin7 */    //(00000000 10000000)b

#define GPIO_Pin_8    ((uint16_t)0x0100)  /*!< 选择Pin8 */    //(00000001 00000000)b
#define GPIO_Pin_9    ((uint16_t)0x0200)  /*!< 选择Pin9 */    //(00000010 00000000)b
#define GPIO_Pin_10   ((uint16_t)0x0400)  /*!< 选择Pin10 */   //(00000100 00000000)b
#define GPIO_Pin_11   ((uint16_t)0x0800)  /*!< 选择Pin11 */   //(00001000 00000000)b
#define GPIO_Pin_12   ((uint16_t)0x1000)  /*!< 选择Pin12 */   //(00010000 00000000)b
#define GPIO_Pin_13   ((uint16_t)0x2000)  /*!< 选择Pin13 */   //(00100000 00000000)b
#define GPIO_Pin_14   ((uint16_t)0x4000)  /*!< 选择Pin14 */   //(01000000 00000000)b
#define GPIO_Pin_15   ((uint16_t)0x8000)  /*!< 选择Pin15 */   //(10000000 00000000)b
#define GPIO_Pin_All  ((uint16_t)0xFFFF)  /*!< 选择全部引脚*/ //(11111111 11111111)b

到了这里,关于STM32外设GPIO(学习笔记)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32学习笔记(二)——STM32的GPIO和AFIO

    1.1 特殊功能引脚和普通功能引脚 STM32F103C8T6共有48个引脚 特殊功能引脚(11个) Vdd+Vss给芯片供电引脚 共三队, 六个 VDDA+VSSA模拟电压 两个 (A~Analog模拟的) BOOT0启动方式选择引脚 一个 VBAT备用电池引脚(Battery) 一个 NRST复位引脚 一个 普通IO口引脚(37个) 其中特殊功能引脚

    2024年01月21日
    浏览(39)
  • 一眼就能看懂STM32的外设GPIO(通用输入输出)

    GPIO,简称通用输入输出,关键在于他是通用的。任何外设都可以用它,他的主要目的在于控制的IO,输出或由外部输入高低电平,与之对应的是AFIO的复用输入输出,当用到引脚的第二个功能的时候,就需要启用它; 你只需要记住他:他是控制引脚(IO口)的输入输出功能,高

    2024年02月04日
    浏览(47)
  • 【STM32】STM32学习笔记-GPIO相关API概述(06-1)

    文件: stm32f10x_gpio.h和stm32f10x_gpio.c 参考实现 参考: 【STM32】江科大STM32学习笔记汇总

    2024年04月29日
    浏览(36)
  • STM32 GPIO设置(GPIO初始化)学习笔记

    GPIO 都知道是 通用输入输出接口 的意思就不详细解释 那么我们就直接进入怎么设置GPIO接口: 这里我的编译软件是keil5,相信大家都应该知道stm32有各种的工作模式上拉、下拉、推挽、开漏等等。如果想要了解具体的工作模式原理这里我推荐大家看:推挽 开漏 高阻 这都是谁

    2024年03月28日
    浏览(59)
  • stm32——hal库学习笔记(GPIO)

    一、GPIO的八种模式分析(熟悉) GPIO_Mode_IN_FLOATING 浮空输入 GPIO_Mode_IPU 上拉输入 GPIO_Mode_IPD 下拉输入 GPIO_Mode_AIN 模拟输入 GPIO_Mode_Out_OD 开漏输出 GPIO_Mode_Out_PP 推挽输出 GPIO_Mode_AF_OD 复用开漏输出 GPIO_Mode_AF_PP 复用推挽输出 应用总结 1、上拉输入、下拉输入可以用来检测外部信号

    2024年02月21日
    浏览(42)
  • stm32学习笔记-3GPIO通用输入输出口

    注:笔记主要参考B站 江科大自化协 教学视频“STM32入门教程-2023持续更新中”。 注:工程及代码文件放在了本人的Github仓库。 GPIO (General Purpose Input Output) 通用输入输出口 可配置为8种输入输出模式。 引脚电平范围为0V~3.3V ,部分引脚可容忍5V(图1-6中IO口电平为FT标识的)

    2024年02月15日
    浏览(118)
  • STM32的GPIO初始化配置-学习笔记

            由于刚开始没有学懂GPIO的配置原理,导致后面学习其它外设的时候总是产生阻碍,因为其它外设要使用前,大部分都要配置GPIO的初始化,因此这几天重新学习了一遍GPIO的配置,记录如下。         首先我们要知道芯片上的引脚,并不是只有GPIO的功能,还能复用成

    2024年04月17日
    浏览(56)
  • 江科大自化协STM32学习笔记(部分C语言知识、STM32简介和GPIO口的使用)

    本篇文章是根据B站UP主江科大自化协的教学视频STM32入门教程-2023持续更新中,在了解、学习与实操后整理的学习笔记,内容部分来自UP主的课程资料,并包含了一些个人的理解,如有谬误欢迎指正,详细知识点可以观看UP主的视频进行了解。 希望大家都能早日掌握单片机。

    2024年02月01日
    浏览(53)
  • 【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!)

    注:本学习笔记基于stm32f4系列 使用的开发板为正点原子stmf407ZGT6探索者开发板 GPIO引脚使用时,可输入或输出数字信号 例如: 检测按键输入信号(Read_Pin)输出信号(Write_Pin) 输出信号点亮或熄灭LED GPIO引脚内部结构图 GPIO状态 输入浮空状态 :上拉下拉电阻均不使用(复位时

    2024年01月20日
    浏览(53)
  • STM32 F103C8T6学习笔记2:GPIO的认识—GPIO的基本输入输出—点亮一个LED

    今日继续学习使用  STM32 F103C8T6开发板 点亮一个LED灯,文章提供源码,测试工程,实验效果图,希望我的归纳总结会对大家有帮助~ 目录 GPIO的认识与分类 : 引脚安排整理: 定时器的引脚例举: 串口的引脚例举:  CAN串口通信: SPI通信: IIC通信:  其余引脚: 烧录引脚:

    2024年02月11日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包