1. 定时器与数码管基础概述
在嵌入式系统开发中,定时器和数码管是最基础也最核心的外设模块。我从业十余年,从51单片机到STM32,几乎每个项目都会用到这两个模块。定时器就像系统的心跳,负责精确计时和事件触发;而数码管则是人机交互的窗口,直接展示系统状态给用户。
本章将深入解析定时器的工作原理和数码管的驱动方法。不同于教科书式的理论讲解,我会结合多年实战经验,重点分享那些容易踩坑的细节和优化技巧。无论你是刚接触硬件的学生,还是需要快速上手的工程师,这些内容都能帮你少走弯路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 定时器模块深度解析
2.1 定时器的核心工作原理
定时器的本质是一个自动递增的计数器。以常见的16位定时器为例,它从0开始计数,每收到一个时钟脉冲就加1,当达到最大值65535时会溢出并产生中断。这个简单的机制却能实现多种功能:
-
定时功能:通过设定计数频率和重载值,可以精确控制定时周期。例如:
c复制// 假设系统时钟72MHz,预分频72,则计数器每1MHz计数 TIM_Prescaler = 71; // 72MHz/(71+1)=1MHz TIM_Period = 999; // 1000次计数=1ms -
PWM生成:通过比较寄存器控制占空比
c复制TIM_OCPulse = 300; // 30%占空比(300/1000) -
输入捕获:测量脉冲宽度或频率
关键经验:定时器精度受时钟树影响很大。我曾遇到过一个项目,因为忽略了APB分频器配置,导致实际定时误差达到3%。建议始终用示波器验证关键定时。
2.2 定时器配置实战步骤
以STM32标准库为例,配置定时器的完整流程:
-
时钟使能:
c复制
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); -
时基初始化:
c复制TIM_TimeBaseInitTypeDef timerInit; timerInit.TIM_Prescaler = 7199; // 72MHz/7200=10kHz timerInit.TIM_CounterMode = TIM_Co
