【雕爷学编程】MicroPython手册之 SAMD21 时钟和时间

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
SAMD21是一系列使用32位ARM® Cortex®-M0+处理器的低功耗微控制器,由Microchip Technology公司开发。SAMD21的技术参数如下:

1、处理器:32位ARM® Cortex®-M0+,最高工作频率为48MHz,每兆赫兹可达2.46 Coremark。
2、存储器:闪存容量从32KB到256KB不等,SRAM容量从4KB到32KB不等。
3、电源管理:支持多种低功耗模式,如空闲和待机模式,最低功耗为3.5μA/MHz。
4、外设:拥有丰富的智能和灵活的外设,如直接内存访问控制器(DMAC)、事件系统、定时器/计数器(TC/TCC)、实时时钟(RTC)、看门狗定时器(WDT)、CRC-32生成器、通用串行总线(USB)2.0接口、串行通信接口(SERCOM)、Inter-IC Sound(I2S)接口、模数转换器(ADC/DAC)、模拟比较器(AC)和外设触摸控制器(PTC)。
5、封装:支持多种封装形式,从32引脚到64引脚不等,包括TQFP、QFN、UFBGA和WLCSP。
6、标准:符合AEC-Q100 Grade 1的汽车级标准,工作温度范围为-40°C到+125°C。

在这里插入图片描述

MicroPython的SAMD21时钟和时间是指在SAMD21微控制器上使用MicroPython语言进行时钟和时间管理的过程。

主要特点:

时钟源和分频器:SAMD21微控制器提供多种时钟源和分频器,用于生成不同频率的时钟信号。开发者可以通过MicroPython语言对时钟源和分频器进行配置和控制,以满足不同应用的时钟需求。
精确的时间测量:SAMD21微控制器具有高精度的时钟模块,可以进行精确的时间测量。通过MicroPython语言提供的时间函数,开发者可以获取当前时间、计算时间间隔等,实现对时间的精确控制和管理。
低功耗时钟模式:SAMD21微控制器支持低功耗时钟模式,可以在需要节省能源的场景下使用。通过配置和控制时钟模块,可以实现低功耗的时钟管理,延长电池寿命。

应用场景:

实时时钟(RTC)应用:SAMD21微控制器内置了实时时钟(RTC)模块,用于提供持久的时间记录和定时功能。通过MicroPython语言,开发者可以配置RTC模块,实现实时时钟的应用,如时间戳记录、定时任务等。
定时器和计时器应用:SAMD21微控制器的定时器和计时器模块可用于实现各种定时和计时功能。通过MicroPython语言,开发者可以配置和控制定时器和计时器,实现定时触发事件、测量时间间隔等应用。
低功耗应用:SAMD21微控制器的低功耗时钟模式适用于需要长时间运行并且对能源消耗敏感的应用。通过MicroPython语言,开发者可以配置和管理低功耗时钟模式,实现低功耗应用,如物联网设备、传感器节点等。

注意事项:

时钟配置和初始化:在使用SAMD21的时钟功能时,需要进行正确的时钟配置和初始化。根据具体应用需求,选择合适的时钟源和分频器,并确保正确的初始化过程。
时钟精度和稳定性:SAMD21微控制器的时钟精度和稳定性对于时间管理非常重要。开发者需要注意选择合适的时钟源,并进行合理的校准和校验,以确保时钟的准确性和稳定性。
时钟模块冲突:SAMD21微控制器的时钟模块可能会与其他外设模块存在冲突。在进行时钟配置时,需注意避免与其他功能模块的冲突,确保各模块正常运行。

综上所述,MicroPython的SAMD21时钟和时间管理利用SAMD21微控制器丰富的时钟模块和MicroPython语言的支持,实现对时钟和时间的灵活配置和精确管理。适用于实时时钟应用、定时器和计时器应用以及低功耗应用等场景。在使用时钟和时间功能时,需要注意时钟的配置和初始化、时钟精度和稳定性,以及时钟模块的冲突等问题,以确保时钟和时间的准确性和可靠性。

在这里插入图片描述

在MicroPython中,我们可以使用SAMD21微控制器的时钟和时间功能来实现精确的时间控制。以下是几个实际运用程序参考代码案例:

案例一:使用machine.Pin()设置引脚为输入模式

import machine

pin = machine.Pin(2, machine.Pin.IN)  # 设置引脚2为输入模式

重点解读:这个程序使用machine.Pin()函数创建一个引脚对象,然后通过Pin.IN参数设置引脚为输入模式。在这个例子中,我们将引脚2设置为输入模式,以便读取外部信号。

案例二:使用timer.delay()实现延迟

import time

time.sleep(2)  # 延迟2秒
print("延迟结束")

重点解读:这个程序使用Python内置的time.sleep()函数实现延迟,参数为延迟的秒数。在这个例子中,程序会暂停2秒后再继续执行。

案例三:使用machine.RTC()获取当前时间

import machine

rtc = machine.RTC()
print("当前时间:", rtc.datetime())

重点解读:这个程序使用machine.RTC()函数创建一个实时时钟对象,然后通过datetime()方法获取当前时间并打印出来。

案例四:使用timer.Timer()实现定时器

import machine
from machine import Pin, Timer

def task():
    print("任务执行")

pin = Pin(2, Pin.OUT)  # 设置引脚2为输出模式
timer = Timer(-1)  # 创建一个定时器,初始值为-1,表示立即执行

timer.init(period=1000, mode=Timer.PERIODIC, callback=task)  # 初始化定时器,周期为1000毫秒(1秒),模式为周期性,回调函数为task

重点解读:这个程序使用machine模块中的Pin和Timer类实现定时器功能。首先,我们设置引脚2为输出模式,然后创建一个定时器对象,指定周期为1000毫秒(1秒),并设置回调函数为task。当定时器到达设定的周期时,会自动执行回调函数task。

案例五:获取当前时间

import machine  
import utime  
  
# 获取当前时间  
current_time = utime.localtime()  
print("当前时间:", current_time)

要点解读:

首先导入了machine和utime模块。machine模块包含了许多与硬件相关的功能,而utime模块则提供了与时间相关的函数。
使用utime.localtime()函数获取当前时间,并将其存储在current_time变量中。
通过打印语句将当前时间输出到串口。

案例六:设置RTC时间

import machine  
import utime  
  
# 初始化RTC模块  
rtc = machine.RTC()  
  
# 设置RTC时间  
rtc.init((2023, 7, 5, 10, 0, 0, 0, 367))  
  
# 获取并打印当前RTC时间  
current_rtc_time = rtc.now()  
print("当前RTC时间:", current_rtc_time)

要点解读:

首先导入了machine和utime模块。
使用machine.RTC()初始化RTC模块。
使用rtc.init()函数设置RTC时间为2023年7月5日10:00:00。在这个元组中,前四个参数分别代表年、月、日和星期几,后面的参数则是小时、分钟、秒和纳秒。最后一个参数是夏令时标记,这里设置为367,表示启用夏令时。
使用rtc.now()获取当前RTC时间,并将其存储在current_rtc_time变量中。
通过打印语句将当前RTC时间输出到串口。

案例七:使用定时器中断

import machine  
import utime  
  
# 设置定时器中断回调函数  
def timer_callback():  
    print("定时器中断触发")  
  
# 初始化定时器并设置中断回调函数  
timer = machine.Timer(2)  # Timer2  
timer.init(period=1000000, mode=machine.Timer.IMMEDIATE, callback=timer_callback)  
timer.start()  # 启动定时器  
  
# 主循环中加入延时以观察定时器中断的触发情况  
while True:  
    utime.sleep(1)  # 延迟1秒,观察定时器中断触发的结果

要点解读:

导入了machine和utime模块。
定义了一个名为timer_callback的回调函数,该函数在定时器中断时被调用,并输出一条信息到串口。
使用machine.Timer(2)初始化定时器2,设置周期为1秒(1000000微秒),模式为立即触发(machine.Timer.IMMEDIATE),并指定了回调函数timer_callback。
使用timer.start()启动定时器。
在主循环中使用utime.sleep(1)进行延时,以便观察定时器中断触发的结果,这里的延时为1秒。如果定时器中断被正确触发,每秒钟会打印一条信息到串口。

案例八:使用RTC模块设置和获取日期和时间

from machine import RTC

rtc = RTC() # 创建RTC对象
rtc.datetime((2023, 4, 6, 4, 11, 54, 3, 0)) # 设置RTC日期和时间
print(rtc.datetime()) # 获取RTC日期和时间,返回一个元组

这个案例使用了RTC模块,它可以创建和控制实时时钟对象。RTC模块没有参数。RTC对象有datetime方法,它可以接受一个包含年、月、日、星期、时、分、秒、微秒的元组,来设置RTC的日期和时间。也可以不带参数调用datetime方法,来获取RTC的日期和时间。

RTC模块需要连接一个32kHz晶振才能正常工作。如果没有连接晶振,RTC的日期和时间可能不准确或不稳定。

RTC模块使用2000年1月1日作为纪元开始日期,与time模块一致。

案例九:使用time模块延迟和计时

import time

start = time.ticks_ms() # 获取当前的毫秒计数器
time.sleep(1) # 延迟1秒
end = time.ticks_ms() # 获取当前的毫秒计数器
delta = time.ticks_diff(end, start) # 计算两个计数器之间的差值
print(delta) # 打印差值,应该接近1000

这个案例使用了time模块,它提供了获取当前时间和日期、测量时间间隔和延迟的函数。time模块有以下几个函数:

time.sleep(seconds):以秒为单位延迟指定的时间,可以是整数或浮点数。
time.sleep_ms(ms):以毫秒为单位延迟指定的时间,必须是整数。
time.sleep_us(us):以微秒为单位延迟指定的时间,必须是整数。
time.ticks_ms():返回一个递增的毫秒计数器,该计数器在某个值之后环绕。该值未明确公开,但保证是2的幂。
time.ticks_us():返回一个递增的微秒计数器,该计数器在某个值之后环绕。该值未明确公开,但保证是2的幂。
time.ticks_diff(ticks1, ticks2):测量两个计数器之间的差值,作为可能环绕的带符号值。参数顺序与减法运算符相同。

案例十:使用ntptime模块同步网络时间

import ntptime
import network

sta = network.WLAN(network.STA_IF) # 创建一个STA对象
sta.active(True) # 激活STA对象
sta.connect('ssid', 'password') # 连接到指定的WiFi网络

ntptime.settime() # 同步网络时间到本地RTC
print(ntptime.time()) # 打印网络时间,以秒为单位

这个案例使用了ntptime模块,它可以从网络服务器获取当前的UTC时间,并设置到本地RTC中。ntptime模块有以下几个函数:
ntptime.settime():从默认或指定的服务器获取UTC时间,并设置到本地RTC中。如果没有指定服务器,则使用pool.ntp.org作为默认服务器。
ntptime.time():从默认或指定的服务器获取UTC时间,并返回以秒为单位的值。如果没有指定服务器,则使用pool.ntp.org作为默认服务器。
ntptime.host(server):设置要从中获取UTC时间的服务器名称或IP地址。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。确保正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/133433395