GPIO Test: 探索GPIO输入输出模式和验证

作者:demo2024.01.18 00:57浏览量:119

简介:本文将介绍GPIO的输入输出模式,包括浮空输入、上拉输入、下拉输入、模拟输入、开漏输出、推挽输出等,并通过测试代码验证这些模式的工作原理。

在嵌入式系统和微控制器应用中,GPIO(General-Purpose Input/Output)是一个重要的组件。它允许我们控制数字信号的输入和输出,从而实现各种硬件交互和控制任务。本文将详细介绍GPIO的输入输出模式,并通过测试代码进行验证。
一、GPIO的输入模式

  1. 浮空输入:多用于外部按键输入,io状态不确定完全由外部输入决定。
  2. 上拉输入:IO口输入设定为高电平输入(1)。
  3. 下拉输入:IO口输入设定为低电平输入(0)。
  4. 模拟输入:应用ADC模拟输入。
    二、GPIO的输出模式
  5. 开漏输出:只可以输出高低电平,高电平需要靠外部电阻拉高,适合做电流型驱动。
  6. 推挽式输出:可以输出高低电平,连接数字器件。
    三、测试代码分析
    以下测试代码将通过验证GPIO的输入输出模式来演示其工作原理。我们将使用一个LED灯作为示例,通过控制GPIO引脚来控制灯的亮灭。
  7. GPIO复位值验证
    首先,我们需要验证GPIO的复位值。复位值为功能规范中各寄存器的复位值。我们将使用以下代码进行验证:
    1. // 假设GPIOx为GPIOA,GPIO_PIN_0为PIN0
    2. GPIO_InitTypeDef GPIO_InitStruct;
    3. uint32_t GPIO_Pin = GPIO_PIN_0;
    4. uint32_t GPIOx = GPIOA;
    5. uint32_t backup = 0;
    6. // 获取当前GPIO引脚配置并备份
    7. backup = GPIO_ReadInputDataBit(GPIOx, GPIO_Pin);
    8. // 配置GPIO引脚为输出模式
    9. GPIO_InitStruct.GPIO_Pin = GPIO_Pin;
    10. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    11. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    12. GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    13. GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    14. GPIO_Init(GPIOx, &GPIO_InitStruct);
    15. // 复位GPIO引脚配置
    16. GPIOx->CRL &= ~(GPIO_CRL_MODE0 | GPIO_CRL_MODE1); // 清空MODE[1:0]配置位,复位到默认模式(默认是浮空输入模式)
    17. // 恢复备份的GPIO引脚配置
    18. if(backup == 0) // 原始配置为低电平(0)
    19. {
    20. GPIOx->CRL |= GPIO_CRL_MODE0; // 设置MODE0为下拉模式(低电平)
    21. }
    22. else // 原始配置为高电平(1)
    23. {
    24. GPIOx->CRL |= GPIO_CRL_MODE1; // 设置MODE1为上拉模式(高电平)
    25. }
    这段代码首先获取了当前GPIO引脚的配置并进行了备份。然后,我们配置了引脚为输出模式,并设置了相应的速度和类型。接下来,我们清空了MODE[1:0]配置位,将引脚复位到默认模式(浮空输入模式)。最后,我们根据备份的配置恢复了引脚的电平状态。通过这种方式,我们可以验证GPIO引脚的复位值是否符合预期。
  8. GPIO读写验证
    接下来,我们将对GPIO的读写功能进行验证。我们将使用以下代码进行测试:
    ```csharp
    // 设置GPIOx和GPIO_Pin分别为输出和需要控制的引脚
    // 配置IO口为正常输入口(不使能漏极开路驱动)并选择输出寄存器进行数据输出。这里假设使用的是推挽输出模式。如果使用开漏输出模式,需要选择相应的寄存器进行配置。
    // 设置发送信号源为GPIO_TCR,选择端口方向为输出,并设置输出数据。这里假设初始状态为低电平(0),因此我们设置输出数据为1(高电平)。然后观察LED灯的状态是否与预期一致(灯亮表示高电平,灯灭表示低电平)。接下来更改端口方向为输入并设置相应的数据并进行验证,观察LED灯的状态是否与预期一致。在验证过程中,可以使用调试器或者观察IO口状态变化来判断写入