在智能硬件项目中,时间并不是一个装饰字段。数据采集设备需要记录采样时间,门禁系统需要保存刷卡时间,环境监测设备需要形成日志,离线运行的控制器也需要在没有网络的情况下知道当前年月日和时分秒。对于嵌入式开发而言,实时时钟模块的价值就在于让设备具备独立计时能力,而不是每次上电都从程序里重新设置时间。
本实验使用 CanMV K210 开发板通过 GPIO 模拟 DS1302 的三线通信时序,实现 DS1302 实时时钟模块的 RAM 通信测试、时间写入、时钟启动和时间循环读取。程序运行后,会先向 DS1302 的 RAM 地址写入数值88,再读取该地址验证通信是否正常。通信测试通过后,程序会把时间设置为2026-05-04 16:30:00,启动 DS1302 计时,并在终端中每隔 1 秒打印一次当前时间列表。
| 学习目标 | 说明 |
|---|---|
| 理解实时时钟模块 | 认识 DS1302 在离线计时、日志记录和定时任务中的作用 |
| 掌握三线通信关系 | 理解 DS1302 的CLK、DAT / DIO、RST / CE三根控制线 |
| 学会 GPIO 模拟时序 | 使用 GPIOHS 输出时钟脉冲、控制复位线并读写数据线 |
| 理解寄存器读写 | 通过寄存器地址读取秒、分、时、日期、星期、月份和年份 |
| 掌握 BCD 时间转换 | 理解 DS1302 内部时间数据与普通十进制时间之间的转换 |
| 建立硬件自检思路 | 先通过 RAM 写入和读取测试通信,再进行时间设置和读取 |
这个案例的重点不只是读取时间,而是把 Python 代码、GPIO 电平变化、DS1302 寄存器和真实硬件计时能力连接起来。代码中的write_byte()和read_byte()负责按位发送和读取数据,get_reg()和set_reg()负责访问芯片寄存器,set_datetime()和get_datetime()则把底层通信封装成更容易理解的时间读写接口。
文章目录
- 理论基础
- 硬件设施
- 软件代码
- 扩展应用
- 总结
理论基础
DS1302 是常见的实时时钟模块,主要用于保存年月日、星期、时分秒等时间信息。它的作用不是让开发板运行得更快,而是让设备在没有网络时间、没有电脑连接、甚至断电后重新上电时,仍然可以从硬件时钟模块中读取到相对可靠的时间信息。带备用电池的 DS1302 模块在主电源断开后,仍可以依靠电池维持计时。
和 I2C、SPI 这类常见通信总线不同,DS1302 使用三线通信方式。CLK是时钟线,负责给每一位数据提供通信节拍;DAT / DIO是双向数据线,写入时由开发板输出数据,读取时由 DS1302 返回数据;RST / CE是通信使能线,拉高后表示一次通信开始,拉低后表示通信结束。
本实验并没有使用专门的 DS1302 硬件库,而是通过 GPIO 模拟通信过程。程序通过self.clk.value(1)和self.clk.value(0)产生时钟跳变,通过self.rst.value(1)开始通信,通过self.dio.value()写入或读取数据位。这样可以直观看到硬件驱动的本质:很多模块的通信,最终都可以还原成引脚电平的有序变化。