标签 树莓派 下的文章

树莓派配置DS3231时钟模块

前言:

最近跟随大佬们撸电子垃圾,撸到了一台网络设备。这个设备有白色铁皮壳子,外面两根天线。打开外壳,内部有一块没有焊接USB口的树莓派 B+,通过一块扩展板连接了一枚RT5372无线网卡,并将一个USB口引出。里面有一枚16G存储卡,不知道里面啥系统,也懒得研究了。直接格式化并写入Raspbian系统。扩展板上还有一套基于DS3231 的RTC电路,测了一下,纽扣电池电量还很足,不利用起来岂不可惜?于是就有了本文。

读懂实践本文,你可能需要在技能树中点亮以下技能:
1:基本的Windows系统操作;
2:至少会使用一种工具连接到树莓派的Shell;(比如SSH工具或TTL线)
3:会为树莓派安装系统并进行初始配置;
4:基本电路知识以确保DS3231正确连接

准备:

1:安装好系统的树莓派;
2:可与树莓派连接的带电池DS3231模块;
3:与树莓派可靠的Shell连接

安装时钟模块:

本人的这台网络设备,它的DS3231时钟模块是连接在I2C1上面的,据了解市面上大多数可直插树莓派的时钟模块也是如此,因为I2C1附近易于获取电源为I2C模块供电。

1,使用gpio readall命令可以获取树莓派各IO口的状态,在此我们看到,SDA.1在40P接插件的3脚,SCL.1在5脚,3V3和GND分别在1、9脚。

 +-----+-----+---------+------+---+---Pi B+--+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 | ALT0 | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 | ALT0 | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 0 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI | ALT0 | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO | ALT0 | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK | ALT0 | 0 | 23 || 24 | 1 | OUT  | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | OUT  | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi B+--+---+------+---------+-----+-----+

2:确保上面提到的四个插针可靠的与DS3231模块连接即可。

系统配置:

1:使用以下命令安装I2C工具。

sudo apt-get install -y python-smbus
sudo apt-get install -y i2c-tools

2:打开I2C功能。在Shell中输入sudo raspi-config打开树莓派配置工具,移动光标选择Interfacing Options,Enter键进入;移动光标选择I2C,将其设置为Enable后退出配置工具并使用sudo reboot命令重启树莓派。
3:测试时钟模块是否正常。使用sudo i2cdetect -y 1命令探测I2C通道1上的设备地址。若能检测到地址为0x68的设备,这表明树莓派可以正常与DS3231模块通信。
4:将DS3231添加到Device Tree中。使用sudo nano /boot/config.txt命令打开配置文件,在文件末尾添加以下一行代码,按Ctrl+X,输入Y,保存并退出。

dtoverlay=i2c-rtc,ds3231

5:使用sudo reboot命令重启树莓派,然后再次使用sudo i2cdetect -y 1命令,会发现原来的0x68地址处变成了UU,此信息表示该地址设备使用中。这表明,实时时钟已经正确配置了。
此时,我们可以使用以下命令与RTC通信了:

sudo hwclock -r 显示RTC时间
sudo hwclock -s 通过RTC时间设置系统时间
sudo hwclock -w 把系统时间写入RTC
sudo hwclock --set --date="2020-04-09 14:01:08" 修改RTC时间为任意值
sudo hwclock -h 获取帮助

通过Systemd配置同步:

上文中已经配置了DS3231 RTC模块,接下来我们需要让系统开机时自动从RTC中获取时间。据说以前的Linux系统启动采用init进程,此方案启动时间长,启动脚本复杂。后来有了Systemd,事情就变得简单了。笔者接触Linux较晚,当然要用新技术。本文通过创建两个Systemd配置文件分别实现开机读取RTC时间,关机时保存时间到RTC。
1:使用以下命令打开nano并准备创建/lib/systemd/system/hwclock-sync.service文件。

sudo nano /lib/systemd/system/hwclock-sync.service

2:在出现的nano窗口中输入以下内容:

[Unit]
Description=Sync time from RTC when startup
After=fake-hwclock.service
#After=network.target

[Service]
Type=oneshot
ExecStart=/sbin/hwclock -s
TimeoutSec=0

[Install]
WantedBy=multi-user.target

注:笔者系统中有fake-hwclock,所以配置为在fake-hwclock.service后面启动,若您的系统中没有这个软件包,请删除After=fake-hwclock.service行,并删除下一行的#号注释
3:按Ctrl+X,Y,Enter保存/lib/systemd/system/hwclock-sync.servic文件并退出。
4:使用以下命令打开nano并准备创建/lib/systemd/system/hwclock-save.service文件。

sudo nano /lib/systemd/system/hwclock-save.service

5:在出现的nano窗口中输入以下内容:

[Unit]
Description=Sync HardWare RTC to System Clock when Shutdown
DefaultDependencies=no
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/sbin/hwclock -w

[Install]
WantedBy=reboot.target halt.target poweroff.target

6:按Ctrl+X,Y,Enter保存/lib/systemd/system/hwclock-save.service文件并退出。
7:使用以下命令使以上两个配置文件开机启动:

systemctl enable hwclock-sync.servic hwclock-save.service

8:这样,我们就完成了时间同步的配置。

如何验证是否正常工作?或许首先应该排除网络时间同步(systemd-timesyncd.service)的干扰,然后大家自行研究,本文就不在此赘述了。

参考:

1:树莓派下 DS3231 时钟模块的配置(I2C接口)-树莓派实验室
2:Raspbian内建硬件驱动-Cocoonshu
3:树莓派模块:使用DS3231时钟模块
4:树莓派使用实时时钟DS3231-nick_zm
5:Linux systemd启动守护进程,service启动顺序分析及调整service启动顺序-MrWang_tju
6:Systemd 入门教程:命令篇-阮一峰
7:Systemd 入门教程:实战篇-阮一峰
8:计算机系统的时间-osoft
9:systemd关机流程 以及 自定义systemd关机脚本和服务-zhangatong