嵌入式大厂面经GPIO常见考点(持续更新中!)

这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!

GPIO常见面试题总结

1. GPIO基本概念

Q: 什么是GPIO?它的基本功能是什么?

GPIO(通用输入输出端口)是微控制器上可以由用户程序控制的引脚,可以配置为输入或输出模式。

基本功能:

  • 数字输入:读取外部设备的高低电平状态
  • 数字输出:向外部设备输出高低电平信号
  • 可配置为特殊功能引脚:连接到内部外设(UART、SPI、I2C等)
  • 中断触发:检测电平变化并触发中断

Q: GPIO的常见工作模式有哪些?

常见的GPIO工作模式:

  1. 输入模式:浮空输入:不连接上拉或下拉电阻上拉输入:内部连接上拉电阻下拉输入:内部连接下拉电阻模拟输入:用于ADC采样
  2. 输出模式:推挽输出:可主动输出高低电平开漏输出:只能主动下拉,需外接上拉电阻开源输出:只能主动上拉,需外接下拉电阻
  3. 特殊模式:复用功能:连接到内部外设中断模式:配置为输入并启用中断功能

2. GPIO配置与使用

Q: 如何配置GPIO的输入输出模式?

以STM32为例的GPIO配置:

// 配置GPIO为输出模式
void GPIO_OutputConfig(void) {
    // 使能GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 定义GPIO初始化结构体
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 配置PA5为推挽输出,50MHz
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

// 配置GPIO为输入模式
void GPIO_InputConfig(void) {
    // 使能GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
    // 定义GPIO初始化结构体
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 配置PB1为上拉输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}

Q: 什么是GPIO的上拉和下拉电阻?它们的作用是什么?

上拉电阻

  • 将引脚默认拉至高电平
  • 防止引脚悬空,提高抗干扰能力
  • 适用于连接常开开关、按键等

下拉电阻

  • 将引脚默认拉至低电平
  • 防止引脚悬空,提高抗干扰能力
  • 适用于连接常闭开关等

作用:

  • 定义引脚的默认电平状态
  • 防止输入引脚处于高阻态时受干扰
  • 限制电流,保护GPIO和外部设备

Q: 推挽输出和开漏输出有什么区别?各自适用于什么场景?

推挽输出

  • 由一对互补的MOS管组成(一个P-MOS和一个N-MOS)
  • 可主动输出高电平和低电平
  • 驱动能力强,上升沿和下降沿速度快
  • 适用场景:LED驱动、数字信号输出、需要快速切换的场合

开漏输出

  • 只有一个N-MOS管,只能主动下拉
  • 输出高电平时需要外部上拉电阻
  • 可实现线与功能(多个输出连接到同一条线)
  • 适用场景:I2C总线、多设备共享总线、电平转换

3. GPIO中断与防抖

Q: 如何配置GPIO中断?常见的中断触发方式有哪些?

GPIO中断配置步骤(以STM32为例):

void GPIO_InterruptConfig(void) {
    // 1. 配置GPIO为输入模式
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 2. 配置EXTI线
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
    
    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
    
    // 3. 配置NVIC
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

常见的中断触发方式:

  • 上升沿触发:信号从低电平变为高电平时触发
  • 下降沿触发:信号从高电平变为低电平时触发
  • 双边沿触发:信号发生任何电平变化时触发
  • 高电平触发:信号保持高电平时触发
  • 低电平触发:信号保持低电平时触发

Q: 什么是按键抖动?如何实现按键消抖?

按键抖动:机械按键按下或释放时,由于机械弹片的弹性作用,会在短时间内产生多次接通和断开,导致一次按键操作被误判为多次。

软件消抖方法

  1. 延时消抖
// 延时消抖
bool Button_Read(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) {
    if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == 0) {
        delay_ms(20);  // 延时20ms
        if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == 0) {
            return true;  // 按键按下
        }
    }
    return false;
}

  1. 定时器采样消抖
// 定时器采样消抖
#define DEBOUNCE_COUNT 5
uint8_t button_samples[DEBOUNCE_COUNT] = {0};
uint8_t sample_index = 0;

// 在定时器中断中调用(如10ms周期)
void Button_SampleInTimer(void) {
    // 读取当前按键状态
    button_samples[sample_index] = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
    sample_index = (sample_index + 1) % DEBOUNCE_COUNT;
    
    // 检查是否所有样本一致
    bool all_same = true;
    for(int i = 1; i < DEBOUNCE_COUNT; i++) {
        if(button_samples[i] != button_samples[0]) {
            all_same = false;
            break;
        }
    }
    
    if(all_same) {
        // 按键状态稳定,可以处理
        button_state = button_samples[0];
    }
}

  1. 状态机消抖
// 状态机消抖
typedef enum {
    BUTTON_STATE_RELEASED,
    BUTTON_STATE_PRESSED,
    BUTTON_STATE_DEBOUNCING_PRESS,
    BUTTON_STATE_DEBOUNCING_RELEASE
} ButtonState;

ButtonState button_state = BUTTON_STATE_RELEASED;
uint32_t debounce_time = 0;
#define DEBOUNCE_DELAY 20  // 20ms消抖时间

// 在主循环或定时器中调用
void Button_StateMachine(void) {
    uint32_t current_time = GetTickCount();
    bool button_raw = (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0);
    
    switch(button_state

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式面试八股文全集 文章被收录于专栏

这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论
😱😱😱😱😱😱😱😱
点赞 回复 分享
发布于 03-26 10:14 上海

相关推荐

【vivo内推】https://recruit.vivo.xyz/jobs/a0af8cc383a502de5cf80c1e1ea01defda2b09d7ba67963b5a72b383bd9e951322f3d856efd33f5607c262b199ecb0ff05c7daa415958c25081611ff6ac3f6f9,点击链接查看职位详情,欢迎加入vivo推荐人:雷祖志设计类东莞若干人8年及以上本科职位详情岗位职责:&nbsp;1、可承担项目组架构Leader角色,主导智能终端产品的整机硬件系统架构设计任务;主导协调周边技术团队及内外部资源配合,完成项目前端硬件系统架构方案构思和开发、3D堆叠设计、相关技术可行性、成本、品质、进度等,保障产品落地性及外观等综合竞争力。&nbsp;2、深入系统硬件整机架构基础技术和相关四新技术研究,主导完成必要的技术预研开发及验证,为项目可量产性做准备。&nbsp;3、洞察与研究行业发展趋势、前沿技术及资源,为整机系统硬件架构设计储备技术资源。&nbsp;岗位要求:&nbsp;1、本科以上学历,8年以上消费电子产品结构设计或堆叠架构设计相关工作经验,具备穿戴产品、平板电脑、手机、无人机、运动相机、精密运动产品相关经验优先;&nbsp;2、熟悉结构设计基础知识、生产流程、及结构件常用的加工工艺,熟悉消费电子产品核心零部件(如屏、电池、摄像头、音频等)基本功能原理及基本知识;对硬件系统散热、天线、ESD、硬件等相关知识也有一定的了解;&nbsp;3、具备优秀的洞察力和潜力,出色的问题分析解决、逻辑思考能力,学习意愿强。&nbsp;4、性格开朗外向、自驱力强,优秀的沟通和协同工作能力,拥有跨团队/部门/公司协同合作经验,吃苦耐劳抗压力强,责任心强,自驱力强;&nbsp;5、精通Creo、AutoCAD等结构设计工具。
投递vivo等公司6个岗位
点赞 评论 收藏
分享
评论
4
4
分享

创作者周榜

更多
牛客网
牛客企业服务