【秋招】嵌入式面试八股文 - 定时器 详解

【秋招】嵌入式面试八股文 - 最全专栏

STM32定时器常见面试题

STM32定时器是STM32微控制器中非常重要的外设,在嵌入式系统开发中有广泛应用。以下是STM32定时器相关的常见面试题及解答:

1. STM32定时器的基本类型

STM32系列微控制器通常包含以下几种类型的定时器:

  1. 基本定时器:如TIM6、TIM7只有计数功能,主要用于触发DAC和产生中断16位计数器,无捕获/比较通道
  2. 通用定时器:如TIM2、TIM3、TIM4、TIM516位或32位计数器(TIM2/TIM5在某些系列中是32位)多个捕获/比较通道支持PWM输出、输入捕获等功能
  3. 高级定时器:如TIM1、TIM816位计数器支持通用定时器的所有功能额外支持互补输出、死区控制、刹车输入等功能适用于电机控制等应用
  4. 低功耗定时器:如LPTIM在低功耗模式下仍可工作功能相对简单,但功耗极低

2. 定时器的基本工作原理

// 基本定时器配置示例
void TIM_BasicConfig(void) {
    // 时钟使能
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
    
    // 定时器基本配置
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 1000 - 1;        // 自动重装载值
    TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;       // 预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
    
    // 使能定时器中断
    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
    
    // 启动定时器
    TIM_Cmd(TIM6, ENABLE);
}


关键参数解析

  1. 预分频器(PSC):对输入时钟进行分频实际分频值 = PSC + 1
  2. 自动重装载寄存器(ARR):定义计数器的周期计数器达到ARR值时会产生更新事件
  3. 计数模式:向上计数:从0计数到ARR向下计数:从ARR计数到0中心对齐模式:在0和ARR之间来回计数

3. 定时器中断计算公式

定时时间 = (PSC + 1) * (ARR + 1) / 时钟频率


例如,对于72MHz的时钟频率,要实现1ms的定时:

// 方案1:PSC=71, ARR=999
TIM_TimeBaseStructure.TIM_Period = 1000 - 1;    // ARR=999
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;   // PSC=71
// 计算: (71+1)*(999+1)/72MHz = 1ms

// 方案2:PSC=7199, ARR=9
TIM_TimeBaseStructure.TIM_Period = 10 - 1;      // ARR=9
TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; // PSC=7199
// 计算: (7199+1)*(9+1)/72MHz = 1ms


4. PWM输出配置

void TIM_PWM_Config(void) {
    // 时钟使能
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // GPIO配置
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 定时器基本配置
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 1000 - 1;
    TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    
    // PWM配置
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 500;  // 50%占空比
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);
    
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
    TIM_ARRPreloadConfig(TIM3, ENABLE);
    
    // 启动定时器
    TIM_Cmd(TIM3, ENABLE);
}


PWM模式解析

  1. PWM模式1:计数器值 < CCR值时,通道输出有效电平计数器值 ≥ CCR值时,通道输出无效电平
  2. PWM模式2:与PWM模式1相反的输出逻辑
  3. 占空比计算:

5. 输入捕获配置

void TIM_IC_Config(void) {
    // 时钟使能
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // GPIO配置
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 定时器基本配置
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
    TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    
    // 输入捕获配置
    TIM_ICInitTypeDef TIM_ICInitStructure;
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter = 0x0;
    TIM_ICInit(TIM3, &TIM_ICInitStructure);
    
    // 使能捕获中断
    TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
    
    // 启动定时器
    TIM_Cmd(TIM3, ENABLE);
}

// 中断处理函数
void TIM3_IRQHandler(void) {
    if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) {
        // 读取捕获值
        uint16_t captureValue = TIM_GetCapture1(TIM3);
        // 处理捕获值...
        
        // 清除中断标志
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
    }
}


输入捕获应用

  1. 测量脉冲宽度:
  2. 测量频率:

6. 高级定时器特有功能

互补输出与死区时间

void TIM_AdvancedPWM_Config(void) {
    // 时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
    
    // GPIO配置
    GPIO_InitTypeDef GPIO_InitStructure;
    // PWM输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;  // TIM1_CH1
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 互补输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;  // TIM1_CH1N
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    // 定时器基本配置
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 1000 - 1;
    TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
    TIM_Ti

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

双非本,211硕。本硕均为机械工程,自学嵌入式,在校招过程中拿到小米、格力、美的、比亚迪、海信、海康、大华、江波龙等offer。八股文本质是需要大家理解,因此里面的内容一定要详细、深刻!这个专栏是我个人的学习笔记总结,是对很多面试问题进行的知识点分析,专栏保证高质量,让大家可以高效率理解与吸收里面的知识点!掌握这里面的知识,面试绝对无障碍!

全部评论

相关推荐

05-12 10:10
已编辑
门头沟学院 人工智能
写这篇之前我犹豫了挺久。一方面是怕被人骂,&quot;又一个收割焦虑的转行帖&quot;;另一方面是看了太多用&nbsp;GPT&nbsp;套娃出来的「学习路线」文章,AI&nbsp;味重得让人没法读完。所以这篇全是亲身踩过的坑,时间线、用过的项目、当时的心路全都尽量原样写出来。如果你是大学生在迷茫要不要转&nbsp;AI,或者已经在转的路上,希望能给点参考。&nbsp;一个反共识的开场:你以为进&nbsp;OpenAI&nbsp;的人都是博士?&nbsp;先讲个故事,跟我没关系,但跟所有想转&nbsp;AI&nbsp;的人都有关系。&nbsp;OpenAI&nbsp;的&nbsp;Sora&nbsp;团队(就是搞文生视频那个)一共&nbsp;13&nbsp;个人。这里面有两个人特别有意思:&nbsp;Will&nbsp;DePue,密歇根大学计算机系,直接辍学了。17...
_hengheng:我也本,也算是做ai相关,我最开始感觉做ai工程师有多么多么困难,后来发现懂了原理后整体训练完全可以看成一个流程化的内容,开源方案太多了,大多基本都是按着模子在自家业务上做各种操作,就算是大厂的小部门也没那么多资源去训基模,反而更多的是像怎么把技术往业务方向靠近了,不过当前时代如果本科学历没那么好加上自己执行力不是特别强还真不建议走ai工程师这条路,可以试试其他ai的偏业务方向,不然校招不太好杀出来
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务