Proteus仿真踩坑实录:用STM32F103实现带闹钟的数码管时钟时,我遇到的5个致命错误
1. RTC时钟偏差:你以为的1秒可能只有0.8秒
在调试过程中,我发现数码管显示的时间总是比实际时间走得慢。最初以为是代码逻辑问题,经过反复排查才发现是RTC时钟源配置不当导致的。
问题现象:
- 仿真运行1小时后,时间显示比实际慢约12分钟
- 断电重启后时间丢失
根本原因: STM32F103的RTC时钟源可以选择LSI(内部低速时钟)或LSE(外部低速晶振)。默认情况下,Proteus仿真使用LSI,而实际LSI频率并非标称的40kHz,存在较大偏差。
解决方案:
// 正确的RTC初始化代码片段
void RTC_Configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
// 使用LSE作为RTC时钟源(32.768kHz晶振)
RCC_LSEConfig(RCC_LSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
RTC_WaitForLastTask();
}
关键参数对比:
| 时钟源 | 标称频率 | 实际频率范围 | 日误差 |
|---|---|---|---|
| LSI | 40kHz | 30-50kHz | ±5分钟 |
| LSE | 32.768kHz | 32.768kHz±20ppm | ±1.7秒 |
提示:在Proteus中需要手动添加32.768kHz晶振模型,否则仿真时仍会使用LSI
2. 数码管鬼影:当你的数字开始"分身"
在动态扫描显示时,数码管经常出现残影现象,表现为上一个数字的片段仍然微弱发光。
典型表现:
- 显示"12:34"时,"1"的b段残留在"2"上
- 快速切换时出现模糊重影
问题根源:
- 段选和位选信号切换时序不当
- 消隐时间不足
- 驱动电流不匹配
优化方案:
// 改进的数码管显示驱动代码
void SMG_Display(uint8_t *buf, uint8_t brightness)
{
static uint8_t pos = 0;
// 先关闭所有位选(消隐)
GPIO_Write(GPIOB, 0xFF);


2839

被折叠的 条评论
为什么被折叠?



