1. 项目背景与硬件介绍
大家好,今天我来分享一个非常实用的嵌入式开发项目:用STM32F103C8T6驱动TM1650数码管模块。这个项目特别适合刚开始接触嵌入式开发的朋友,因为TM1650数码管模块价格便宜、使用简单,而且STM32F103C8T6(也就是我们常说的"蓝莓板")更是性价比极高的开发板。
让我先介绍一下这两个核心硬件。STM32F103C8T6是ST公司推出的Cortex-M3内核微控制器,72MHz主频,64KB Flash,20KB RAM,完全足够处理各种嵌入式应用。而TM1650是一款专用的LED驱动控制芯片,最大特点就是只需要两根线(IIC总线)就能控制多个数码管,大大简化了硬件连接。
为什么选择模拟IIC而不是硬件IIC呢?在实际项目中,我发现在STM32F103C8T6上,硬件IIC有时候会遇到各种奇怪的问题,比如死锁、时序不匹配等。而模拟IIC虽然速度稍慢,但稳定性极高,调试起来也更容易。特别是当你需要同时驱动多个IIC设备时,模拟IIC可以灵活分配引脚,避免硬件资源冲突。
2. 环境搭建与CubeMX配置
首先我们需要准备好开发环境。我推荐使用STM32CubeMX + Keil MDK的组合,这是最经典的STM32开发环境。打开CubeMX后,选择STM32F103C8T6芯片,然后开始配置引脚。
关键的一步是配置两个GPIO引脚作为模拟IIC的SCL和SDA线。我选择的是PB10和PB11,你也可以根据实际需要选择其他引脚。这里有个小技巧:一定要将这两个引脚配置为开漏输出(Open-Drain)模式,而不是推挽输出。为什么呢?因为IIC总线需要支持多设备共享,开漏模式配合外部上拉电阻可以实现"线与"功能,这是IIC总线的基础特性。
在GPIO配置中,将PB10和PB11都设置为:
- GPIO输出模式:开漏输出
- GPIO推挽模式:不开
- GPIO上拉/下拉:不上拉也不下拉
- GPIO速度:低速即可
接下来配置时钟树。STM32F103C8T6的外部晶振通常是8MHz,我们需要通过PLL倍频到72MHz。具体设置是:HSE作为时钟源,PLL倍频9倍,系统时钟选择PLL输出。APB1总线时钟设置为36MHz,APB2总线时钟设置为72MHz。
最后配置一个基本的定时器用于微秒级延时。我通常使用TIM4,预分频设置为72-1,这样计数器每计数一次就是1微秒。记得开启定时器的中断。
生成代码时,选择MDK-ARM工具链,这样就能直接在Keil中打开项目了。
3. TM1650驱动原理深度解析
TM1650虽然是个小芯片,但功能相当强大。它内部集成了数码管显示控制、按键扫描、亮度调节等多种功能。今天我们主要关注显示功能。
TM1650的通信协议是基于IIC的,但有一些特殊的约定。首先,它的设备地址是固定的0x48(写地址)和0x49(读地址)。每次通信都需要先发送起始信号,然后发送设备地址,接着是命令或数据,最后是停止信号。
显示控制方面,TM1650支持4位数码管,每位数码管有8个段(包括小数点)。它内部有显示寄存器,地址从0x68开始,每个地址对应一个数码管。比如:
- 0x68:第一个数码管
- 0x6A:第二个数码管
- 0x6C:第三个数码管
- 0x6E:第四个数码管
亮度控制是通过配置命令实现的。TM1650支持8级亮度调节,对应的命令是:
- 0x88 | (level << 4):开启显示并设置亮度
- 0x80:关闭显示
我在实际使用中发现,TM1650对时序要求不是很严

1万+

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



