第十八章 RTC实验
machine.RTC 类是 machine 模块下面的一个硬件类,它用于控制实时时钟(RTC)。实时时钟是一种计算机内部或外部的硬件设备,用于提供计算机系统的当前时间和日期。本章,我们将介绍ESP32-S3的内部实时时钟(RTC)。我们将使用SPILCD模块来显示日期和时间,实现一个简单的实时时钟。
本章分为如下几个小节:
18.1 machine.RTC类
18.2 硬件设计
18.3 软件设计
18.4 下载验证
18.1 machine.RTC类
machine.RTC是一个硬件类,用于控制实时时钟(RTC)设备。RTC 设备是一种计算机内部或外部的硬件设备,它独立于其他系统操作,能够提供计算机系统的当前时间和日期。实时时钟的主要功能是提供精确的实时时间,可以用于产生年、月、日、时、分、秒等信息。
通过 Machine.RTC类,用户可以在MicroPython环境下获取和设置RTC的当前时间,以及读取和写入RTC的寄存器。
1,machine.RTC类的构造方法
RTC的构造对象方法如下:
class machine.RTC() 使用示例:rtc = RTC()
返回值:RTC对象。
2,machine.RTC类的方法
①:初始化RTC设备起始时间。
其方法原型如下:
rtc.init([datatimetuple])
该方法的参数描述,如下表所示。
表18.1.2 RTC.init方法参数描述
返回值:RTC对象。
②:关闭RTC设备。
其方法原型如下:
rtc.deinit()
返回值:无。
③:获取当前时间。
其方法原型如下:
rtc.datetime([datetimetuple])
返回值:当前时间元组。
18.2 硬件设计
1. 例程功能
本章实验功能简介:通过LCD显示模块实时显示RTC时间,包括年、月、日、时、分、秒等信息。
2. 硬件资源
1)XL9555
IIC_INT-IO0(需在P5连接IO0)
IIC_SDA-IO41
IIC_SCL-IO42
2)SPILCD
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连)
PWR- IO1_3(XL9555)
RST- IO1_2(XL9555)
3)RTC
3. 原理图
本章实验使用的RTC为ESP32-S3的片上资源,因此并没有相应的连接原理图。
18.3 软件设计
18.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:
图18.3.1.1 程序流程图
18.3.2 程序解析
本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。RTC实验main.py源码如下:
from machine import Pin,RTC,SPI,I2C import atk_xl9555 as io_ex import atk_lcd as lcd import time """ * @brief 程序入口 * @param 无 * @retval 无 """ if __name__ == '__main__': # 初始化LED并输出高电平 led = Pin(1,Pin.OUT,value = 1) # IIC初始化 i2c0 = I2C(0, scl = Pin(42), sda = Pin(41), freq = 400000) # XL9555初始化 xl9555 = io_ex.init(i2c0) # 复位LCD xl9555.write_bit(io_ex.SLCD_RST,0) time.sleep_ms(100) xl9555.write_bit(io_ex.SLCD_RST,1) time.sleep_ms(100) # 初始化SPI spi = SPI(2,baudrate = 80000000, sck = Pin(12), mosi=Pin(11), miso=Pin(13)) # 初始化LCD,lcd = 0为正点原子2.4寸屏幕;lcd = 1为正点原子1.3寸SPILCD屏幕; display = lcd.init(spi,dc = Pin(40,Pin.OUT),cs=Pin(21, Pin.OUT),dir=1,lcd=0) # 开启背光 xl9555.write_bit(io_ex.SLCD_PWR,1) time.sleep_ms(100) # 显示实验信息 display.string(0, 5, 240, 32, 32, "ESP32-S3",lcd.RED) display.string(30, 70, 200, 16, 16, "RTC TEST", lcd.RED) display.string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", lcd.RED) display.string(30, 110, 200, 16, 16, "Specific:", lcd.RED) display.string(30, 130, 200, 16, 16, "Time:", lcd.RED) display.string(30, 150, 200, 16, 16, "Date:", lcd.RED) # 初始化RTC rtc = RTC() if rtc.datetime()[0] != 2023: rtc.datetime((2023, 12, 7, 2, 0, 0, 0, 0)) while True: data_time = rtc.datetime() display.string(110, 110, 200, 16, 16, str(data_time[0:3]), lcd.RED) display.string(110, 130, 200, 16, 16, str(data_time[4:7]), lcd.RED) display.string(110, 150, 200, 16, 16, str(int(data_time[3])+1), lcd.RED)
这示例代码主要是在ESP32-S3微控制器上初始化各种硬件接口和设备,包括LED、I2C、SPI、LCD显示屏,以及XL9555芯片和RTC(实时时钟)。
首先,代码初始化了LED灯并使其输出高电平。然后,它初始化了I2C接口,并使用这个接口初始化了XL9555芯片。接着,代码复位了LCD显示屏,然后初始化了SPI接口和LCD显示屏。在LCD显示屏上,它显示了一些实验信息。
此后,代码初始化了RTC芯片,如果获取的RTC时间不是2023,那么就设置RTC时间为2023年12月7日。
最后,代码进入一个无限循环,在这个循环中,它获取RTC的时间,并将其显示在LCD显示屏上。这个显示包括年、月、日等信息。需要注意的是,获取的RTC时间是一个Python元组类型,所以需要使用索引来获取年、月、日等具体的时间信息。同时,这个代码还使用了time.sleep_ms()函数来进行延时操作,以确保操作的正确性和稳定性。
18.4 下载验证
将程序下载到开发板后,系统首先获取当前的时间(年、月、日、时、分和秒),然后在SPILCD显示屏上显示当前时间,如下图所示。
图18.5.1 SPILCD显示效果图