【雕爷学编程】MicroPython手册之达芬奇 TKM32F499 引脚和GPIO口

发布于:2023-10-25 ⋅ 阅读:(147) ⋅ 点赞:(0)

在这里插入图片描述
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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
达芬奇 TKM32F499是一款基于ARM Cortex-M4内核的微控制器,以下是其主要的参考技术参数:
1、内核和性能:
内核: ARM Cortex-M4
最高主频: 240 MHz
性能: 225 DMIPS / 608 CoreMark
2、存储器:
Flash存储器: 1 MB
RAM: 192 KB
存储器接口: 支持外部存储器扩展(例如,SD卡,NOR Flash等)
3、外设接口:
通用IO口(GPIO): 支持多达 101 个GPIO引脚,可用于数字输入/输出、中断等。
串行通信接口: 包括多个UART、SPI、I2C接口,用于与外部设备进行通信。
USB接口: 支持USB 2.0 FS(全速)。
定时器: 包括多个定时器/计数器,可用于定时、脉冲宽度调制(PWM)等应用。
ADC和DAC: 内置多个模数转换器(ADC)和数模转换器(DAC),用于模拟信号的采集和输出。
LCD控制器: 支持液晶显示器(LCD)的控制和驱动。
触摸控制器: 支持电容式触摸屏的控制和输入。
SD卡控制器: 支持SD卡的读写操作。
Ethernet控制器: 支持以太网通信。
4、电源管理:
电源供应: 支持广泛的电源电压范围,包括 3.0V 至 3.6V 的工作电压。
低功耗模式: 支持多种低功耗模式,以最小化功耗。
5、安全性:
安全特性: 支持硬件加密和解密、随机数生成器等安全功能,保护系统的数据和通信安全。
6、开发工具支持:
开发环境: 支持常见的开发环境,如Keil MDK、IAR Embedded Workbench等。
调试接口: 支持标准的SWD(Serial Wire Debug)调试接口。

在这里插入图片描述

MicroPython的达芬奇TKM32F499具有强大的定时器功能,下面将以专业的视角为您详细解释其主要特点、应用场景以及需要注意的事项。

主要特点:

多个定时器:达芬奇TKM32F499支持多个定时器,可以同时管理多个定时任务。每个定时器都有独立的计数器和配置寄存器,可以进行个性化的定时设置。

灵活的定时模式:该微控制器的定时器支持多种定时模式,包括定时器、计数器和PWM输出等。可以根据应用的需求选择不同的模式,并根据需要进行定时器的配置和操作。

中断功能:达芬奇TKM32F499的定时器可以配合中断功能使用,当定时器计数满足设定的条件时,会触发中断请求。这可以用于实现定时任务的精确控制和时间触发的事件处理。

高精度支持:该微控制器的定时器具有较高的精度,可以满足对时间精确度要求较高的应用。通过合理的配置和使用,可以实现微秒级别的定时和测量。

应用场景:

实时任务调度:达芬奇TKM32F499的定时器可以用于实时任务调度,通过设置定时器的周期和中断功能,可以精确地控制任务的执行时间和频率,实现实时性要求较高的应用。

PWM输出控制:通过定时器的PWM输出功能,可以实现对电机、LED灯等设备的精确控制。可以根据需求设置定时器的周期和占空比,实现各种PWM波形的生成。

测量和计时应用:达芬奇TKM32F499的定时器可以用于测量和计时应用,如测量脉冲宽度、计算时间间隔等。利用定时器的计数功能,可以实现高精度的测量和计时操作。

需要注意的事项:

定时器冲突:当使用多个定时器时,需要注意定时器之间的冲突和资源占用情况。合理规划和管理定时器的使用,避免冲突和资源竞争。

中断处理:在使用定时器的中断功能时,需要编写相应的中断处理函数,并正确处理中断请求。合理的中断处理设计可以确保定时器的稳定和可靠运行。

定时器溢出:定时器的计数范围是有限的,当计数器溢出时需要进行处理。可以通过设置定时器的自动重载功能,以及合理的定时器配置,来避免计数器溢出导致的问题。

综上所述,MicroPython的达芬奇TKM32F499的定时器功能具有多个定时器、灵活的定时模式、中断功能和高精度支持。它适用于实时任务调度、PWM输出控制以及测量和计时应用。在使用定时器时需要注意定时器冲突、中断处理和定时器溢出等问题。

案例一:使用MicroPython控制达芬奇 TKM32F499的LED灯闪烁

from machine import Pin, Timer
import time

# 初始化LED引脚,这里使用的是TKM32F499的GPIO13引脚
led = Pin(13, Pin.OUT)

def led_blink():
    led.value(0)
    time.sleep(1)
    led.value(1)
    time.sleep(1)

timer = Timer(1)
timer.start(lambda: led_blink())

要点解读:
导入所需的库和模块。
初始化LED引脚,这里使用的是TKM32F499的GPIO13引脚。
定义一个定时器函数led_blink(),用于实现LED灯的闪烁效果。
在定时器回调函数中,调用led_blink()函数来实现LED灯的闪烁效果。
创建一个定时器对象timer,并设置定时器间隔为1秒。
启动定时器,并在定时器回调函数中调用led_blink()函数实现LED灯的闪烁效果。

案例二:使用MicroPython读取达芬奇 TKM32F499的温度传感器数据

from machine import Pin, I2C
import time
import dht

# 初始化温度传感器,这里使用的是TKM32F499的I2C接口和DHT11温度传感器。
i2c = I2C(scl=Pin(2), sda=Pin(3))
dht_sensor = dht.DHT11(Pin(4))

while True:
    # 读取温度传感器数据
    humidity, temperature = dht_sensor.read()

    # 如果读取成功,打印温度和湿度值;否则,打印无法读取温度传感器数据的提示信息。
    if humidity is not None and temperature is not None:
        print("温度:{:.1f}℃,湿度:{:.1f}%".format(temperature, humidity))
    else:
        print("无法读取温度传感器数据")

    # 延时1秒后继续循环,避免频繁读取导致CPU占用过高。
    time.sleep(1)

要点解读:
导入所需的库和模块。
初始化I2C接口和温度传感器,这里使用的是TKM32F499的I2C接口和DHT11温度传感器。
在循环中,首先读取温度传感器数据,然后判断是否读取成功。
如果读取成功,打印温度和湿度值;否则,打印无法读取温度传感器数据的提示信息。
延时1秒后继续循环,避免频繁读取导致CPU占用过高。

案例三:使用MicroPython控制达芬奇 TKM32F499的LCD显示屏显示当前时间

from machine import Pin, I2C
import time
import ssd1306

# 初始化I2C接口和OLED显示屏,这里使用的是TKM32F499的I2C接口和SSD1306 OLED显示屏。
i2c = I2C(scl=Pin(5), sda=Pin(4))
oled = ssd1306.SSD1306_I2C(128, 64)

while True:
    # 获取当前时间
    current_time = time.localtime()

    # 格式化时间字符串
    time_str = time.strftime("%Y-%m-%d %H:%M:%S")

    # 在屏幕上显示时间字符串,包括标题和实际时间值。
    oled.text("当前时间:", 0, 0)
    oled.text("{:s}", 0, 10)
    oled.show()

    # 延时1秒后继续循环,避免频繁更新导致CPU占用过高。
    time.sleep(1)

要点解读:
导入所需的库和模块。
初始化I2C接口和OLED显示屏,这里使用的是TKM32F499的I2C接口和SSD1306 OLED显示屏。
在循环中,首先获取当前时间,然后格式化为字符串。
在屏幕上显示时间字符串,包括标题和实际时间值。
延时1秒后继续循环,避免频繁更新导致CPU占用过高。

案例四:GPIO 输出

from machine import Pin  
  
# 将GPIO2配置为输出  
pin = Pin(2, Pin.OUT)  
  
# 循环输出高低电平  
while True:  
    pin.value(1)  # 高电平  
    delay(1000)  # 延迟1秒  
    pin.value(0)  # 低电平  
    delay(1000)  # 延迟1秒

在这个示例中,我们使用 MicroPython 的 machine 模块将 GPIO2 配置为输出,然后创建一个无限循环来周期性地切换 GPIO2 的电平状态,以此控制一个连接到 GPIO2 的 LED 灯的亮度。

案例五:控制LED灯

from machine import Pin

# 将引脚P0配置为输出
led_pin = Pin(0, Pin.OUT)

# 控制LED灯亮和灭
led_pin.value(1)  # 点亮LED灯
led_pin.value(0)  # 熄灭LED灯

要点解读:
使用machine.Pin类创建引脚对象,其中第一个参数指定引脚编号,第二个参数指定引脚模式(输出或输入)。
将引脚配置为输出模式后,可以使用value方法控制引脚的电平状态。
led_pin.value(1)将引脚设置为高电平,点亮LED灯。
led_pin.value(0)将引脚设置为低电平,熄灭LED灯。

案例六:读取按钮状态

from machine import Pin

# 将引脚P1配置为输入
button_pin = Pin(1, Pin.IN)

# 读取按钮状态
button_state = button_pin.value()
print("Button state: {}".format(button_state))

要点解读:
使用machine.Pin类创建引脚对象,其中第一个参数指定引脚编号,第二个参数指定引脚模式(输出或输入)。
将引脚配置为输入模式后,可以使用value方法读取引脚的电平状态。
button_pin.value()返回引脚当前的电平状态,可以用于读取按钮的状态。

案例七:外部中断触发

from machine import Pin
import utime

# 外部中断回调函数
def interrupt_callback(pin):
    print("External interrupt")

# 将引脚P2配置为输入
input_pin = Pin(2, Pin.IN)

# 配置引脚P2为外部中断触发引脚
input_pin.irq(trigger=Pin.IRQ_RISING, handler=interrupt_callback)

# 主循环
while True:
    utime.sleep(1)

要点解读:
使用machine.Pin类创建引脚对象,其中第一个参数指定引脚编号,第二个参数指定引脚模式(输出或输入)。
将引脚配置为输入模式后,可以使用irq方法配置引脚的中断功能。
input_pin.irq()用于配置引脚的中断触发条件和中断回调函数。
在示例中,将引脚P2配置为上升沿触发的外部中断,并指定中断回调函数为interrupt_callback。
在主循环中保持程序的运行。

案例八:LED闪烁

from machine import Pin
import time 

led = Pin('PA5', Pin.OUT)

while True:
   led.value(1)
   time.sleep(1)
   led.value(0)
   time.sleep(1)

要点: 将PA5设置为输出模式,控制LED闪烁。

案例九:类按键输入

from machine import Pin

btn = Pin('PC13', Pin.IN, Pin.PULL_UP)

while True:
   if not btn.value():
      print('Button Pressed')

要点: PC13作为输入引脚,读取按钮按下事件。

案例十:串口打印

from machine import UART, Pin

uart = UART(2, tx=Pin('PB10'), rx=Pin('PB11'))

while True:
   uart.write('Hello World!\n')

要点: 使用UART2串口打印输出。

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

在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到