【雕爷学编程】MicroPython手册之麦哲伦 STM32H743 I2C总线

在这里插入图片描述
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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
麦哲伦(STM32H743)是STMicroelectronics推出的一款高性能微控制器系列,具有强大的处理能力和丰富的外设资源。以下是麦哲伦STM32H743微控制器的参考技术参数:
1、核心处理器:
ARM Cortex-M7内核,最高主频400 MHz
浮点运算单元(FPU),支持单精度和双精度浮点运算
2、存储器:
Flash存储器:1 MB
SRAM:1 MB
外部存储器接口(支持SDRAM、NOR Flash和NAND Flash等)
3、外设资源:
多个通用定时器(TIM),用于计时、PWM生成等应用
多个串行通信接口(USART、SPI、I2C等)
多个通用输入/输出口(GPIO)
多个模拟输入通道(ADC)
多个模拟输出通道(DAC)
多个通用用途DMA控制器(DMA)
多个通用同步/异步收发器(USART)
多个通用用途直流电机控制器(GPTM)
多个通用用途同步波形发生器(GPTM)
多个USB接口(USB 2.0 OTG FS/HS)
多个以太网控制器(Ethernet MAC)
多个高速串行接口(SPI、I2S等)
多个SDIO接口(支持SD卡和MMC卡)
4、封装和引脚:
LQFP和BGA封装,引脚数量和布局根据具体型号而定
5、工作电压和温度范围:
工作电压:1.7V至3.6V
工作温度范围:-40°C至+85°C或-40°C至+125°C
安全和加密:
内置硬件加速器,支持高级加密标准(AES)、数据完整性校验(CRC)等
内置硬件随机数发生器(RNG)
支持多种安全保护机制,如读保护、写保护、区域保护等
6、调试和开发支持:
JTAG/SWD调试接口
支持ST-Link调试器和开发工具
支持多种集成开发环境(IDE),如Keil MDK、IAR Embedded Workbench等

在这里插入图片描述
MicroPython的麦哲伦STM32H743开发板内置了I2C(Inter-Integrated Circuit,集成电路之间的串行通信协议)总线功能,下面将以专业的视角为您详细解释其主要特点、应用场景以及需要注意的事项。

主要特点:

多主从通信:I2C总线支持多主从通信模式,即多个主设备可以与多个从设备进行通信。麦哲伦STM32H743开发板的I2C功能支持多主从通信,可以同时与多个外部设备进行数据交换。

低速高容量:相比于其他串行通信协议,如SPI,I2C总线通信速率较低,但具有较高的容量。麦哲伦STM32H743开发板的I2C功能适用于对数据传输速率要求不高但需要传输大量数据的应用。

硬件支持:I2C总线通常由硬件实现,具有较低的处理器负载。麦哲伦STM32H743开发板的I2C功能由硬件支持,可以提高数据传输的效率和可靠性。

多设备支持:I2C总线支持多个外部设备的连接。麦哲伦STM32H743开发板的I2C功能提供了多个独立的I2C通道,可以同时与多个外部设备进行通信,提供灵活的设备扩展能力。

应用场景:

传感器与微控制器通信:I2C总线常用于传感器与微控制器之间的通信。通过麦哲伦STM32H743开发板的I2C功能,可以与各种传感器模块进行数据交换,如温度传感器、湿度传感器、加速度传感器等。

外设控制:I2C总线也广泛应用于与各种外设进行通信和控制。通过麦哲伦STM32H743开发板的I2C总线,可以与外部设备,如显示屏、电子芯片、存储器等进行数据交换和控制。

扩展模块连接:I2C总线还可用于扩展麦哲伦STM32H743开发板的功能。通过与其他MCU或扩展模块的I2C通信,可以实现功能的扩展,如连接扩展存储器、扩展ADC模块等。

需要注意的事项:

设备地址管理:在使用I2C功能时,需要正确管理外部设备的地址。每个从设备都有一个唯一的7位或10位地址,需要确保与要通信的设备地址一致,以确保正确的数据传输。

电平兼容:在连接外部设备时,需要注意I2C信号的电平兼容性。确保外部设备的I2C信号电平与麦哲伦STM32H743开发板的I2C电平兼容,避免电平不匹配导致的通信问题或损坏设备。

错误处理:I2C通信可能会出现错误,如数据传输错误、设备无响应等。在使用I2C功能时,需要适当处理和处理这些错误情况,以确保通信的可靠性和稳定性。

综上所述,MicroPython的麦哲伦STM32H743开发板的I2C总线功能具有多主从通信、低速高容量、硬件支持和多设备支持等特点。它适用于传感器与微控制器通信、外设控制、扩展模块连接等应用场景。在使用I2C功能时,需要注意设备地址管理、电平兼容性以及错误处理等方面的注意事项。

案例1:使用I2C读取设备数据

from machine import I2C  
import time  
  
# 初始化I2C总线  
i2c = I2C(scl=Pin(10), sda=Pin(9), freq=400000)  
  
# 定义设备地址  
DEVICE_ADDRESS = 0x50  
  
# 写入数据  
i2c.writeto_mem(DEVICE_ADDRESS, 0x00, b'\x01\x02\x03\x04')  
  
# 等待一段时间以确保设备已准备好读取  
time.sleep(0.1)  
  
# 从设备读取数据  
data = i2c.readfrom_mem(DEVICE_ADDRESS, 0x00, 4)  
  
# 打印读取到的数据  
print(data)

要点解读:此示例初始化I2C总线并使用它来向一个设备写入数据,然后从该设备读取数据。首先,定义了I2C总线的频率为400kHz,并使用GPIO10和GPIO9作为SCL和SDA线。然后,定义了设备的地址,并使用writeto_mem函数向该设备的地址写入4字节的数据。在写入完成后,等待一段时间以确保设备已准备好读取。最后,使用readfrom_mem函数从该设备的同一地址读取4字节的数据,并打印出来。

案例2:使用I2C扫描设备

from machine import I2C  
  
# 初始化I2C总线  
i2c = I2C(scl=Pin(10), sda=Pin(9), freq=400000)  
  
# 遍历所有设备  
for address in range(128):  
    try:  
        i2c.writeto_mem(address, 0x00, b'\x01\x02\x03\x04')  # 向地址写入数据以检测设备是否存在  
        time.sleep(0.01)  # 等待一段时间以确保设备已准备好读取  
        data = i2c.readfrom_mem(address, 0x00, 4)  # 尝试从地址读取数据  
        if data:  # 如果读取到的数据不为空,说明该设备存在  
            print("Device found at address 0x{:02X}: {}".format(address, data))  
    except Exception as e:  
        print("Error while communicating with device at address 0x{:02X}: {}".format(address, str(e)))

要点解读:此示例扫描所有可能的I2C设备地址,以找出哪些设备已经连接。首先,定义了I2C总线的频率为400kHz,并使用GPIO10和GPIO9作为SCL和SDA线。然后,通过循环遍历所有可能的设备地址(范围从0x00到0x7F),并向每个地址写入4字节的数据。如果设备存在,它将在稍后的时间点返回数据。如果从某个地址读取到的数据不为空,就打印出该设备地址和数据。如果在与某个地址通信时出现错误,则打印出该设备地址和错误信息。

案例3:使用I2C控制设备

from machine import I2C  
import time  
  
# 初始化I2C总线  
i2c = I2C(scl=Pin(10), sda=Pin(9), freq=400000)  
  
# 定义设备地址和寄存器地址  
DEVICE_ADDRESS = 0x50  
REGISTER_ADDRESS = 0x01  
  
# 向指定寄存器地址写入数据,以控制设备  
i2c.writeto_mem(DEVICE_ADDRESS, REGISTER_ADDRESS, b'\x01\x02\x03\x04')  # 向寄存器地址写入数据以控制设备  
  
# 等待一段时间以确保设备已接收到控制指令并已准备好读取响应数据  
time.sleep(0.1)  # 根据具体设备的响应时间和你的应用程序需要的时间进行调整  
  
# 从设备读取数据,以获取设备的状态或响应你的控制指令  
data = i2c.readfrom_mem(DEVICE_ADDRESS
# 解析读取到的数据,根据设备协议将二进制数据转换为有意义的结果  
response = []  
for byte in data:  
    response.append(byte)  
      
# 根据设备的响应结果,你的应用程序可以进行相应的操作或判断  
if response[0] == 0x01:  # 假设设备的响应是0x01,表示操作成功  
    print("Device controlled successfully.")  
elif response[0] == 0x02:  # 假设设备的响应是0x02,表示操作失败  
    print("Device control failed.")  
      
# 可以根据具体设备的协议和操作方法,继续添加对响应数据的处理

要点解读:此示例是对示例2的延伸,进一步展示了如何使用I2C控制设备。在示例2中,我们已经扫描到设备并确认其存在。在此基础上,我们向设备的特定寄存器地址写入数据,以发送控制指令。然后,我们等待一段足够的时间,以确保设备已接收到指令并已准备好返回响应数据。最后,我们读取设备返回的响应数据,根据设备的协议将其解析为有意义的结果,并根据结果进行相应的操作或判断。需要注意的是,上述代码示例中的时间等待和数据解析部分,可能需要根据具体设备的响应时间和协议进行调整和修改。

案例4:读取传感器数据

from machine import I2C, Pin
import time

# 初始化I2C总线和SDA引脚
i2c = I2C(scl=Pin(8), sda=Pin(9))

def read_sensor_data():
    # 发送读取命令
    i2c.writeto(0x68, b'\x01')
    # 等待数据准备
    time.sleep_ms(10)
    # 读取数据
    data = bytearray(4)
    i2c.readfrom_mem(0x68, 0x02, data)
    return data

while True:
    # 读取传感器数据并打印
    data = read_sensor_data()
    print("Temperature: {} C, Humidity: {} %".format(data[0] * 0.01, data[2] * 0.01))
    time.sleep(1)

要点解读:
使用machine.I2C和machine.Pin模块初始化I2C总线和SDA引脚。
定义read_sensor_data函数,用于读取传感器数据。
在函数中,首先发送读取命令,接着等待数据准备,最后读取数据。
在主循环中,不断调用read_sensor_data函数读取传感器数据并打印。

案例5:控制LED

from machine import Pin
import time

# 初始化LED引脚
led = Pin(2, Pin.OUT)

def control_led(state):
    # 设置LED状态
    led.value(state)

while True:
    # 控制LED灯闪烁
    control_led(1)
    time.sleep(1)
    control_led(0)
    time.sleep(1)

要点解读:
使用machine.Pin模块初始化LED引脚。
定义control_led函数,用于控制LED灯的状态。
在主循环中,不断切换LED灯的状态(亮或灭)并等待一段时间。

案例6:控制蜂鸣器

from machine import Pin, PWM
import time

# 初始化蜂鸣器引脚和PWM对象
buzzer = PWM(Pin(5), freq=1000, duty=50)

def control_buzzer(duration):
    # 控制蜂鸣器持续时间
    buzzer.duty(50)
    time.sleep(duration)
    buzzer.duty(0)

while True:
    # 控制蜂鸣器发出不同频率的声音
    control_buzzer(0.5)
    time.sleep(0.5)
    control_buzzer(1)
    time.sleep(1)

要点解读:
使用machine.Pin和machine.PWM模块初始化蜂鸣器引脚和PWM对象。
定义control_buzzer函数,用于控制蜂鸣器的持续时间。
在主循环中,不断改变蜂鸣器的频率和持续时间。

案例7:I2C传感器读取

import machine

i2c = machine.I2C(scl=machine.Pin('PB8'), sda=machine.Pin('PB9'))  # 初始化I2C对象,设置SCL引脚为PB8,SDA引脚为PB9

# I2C传感器读取
while True:
    i2c.writeto(0x50, b'\x00')  # 向I2C设备地址为0x50的传感器发送写命令
    data = i2c.readfrom(0x50, 4)  # 从I2C设备地址为0x50的传感器读取4个字节的数据
    print("Received data:", data)

解读:
该程序使用machine模块控制麦哲伦开发板上的I2C总线功能,用于读取I2C传感器数据。通过创建I2C对象初始化I2C,设置SCL引脚为PB8,SDA引脚为PB9。在主循环中,通过i2c.writeto()方法向I2C设备地址为0x50的传感器发送写命令,这里是发送一个字节的数据0x00。然后使用i2c.readfrom()方法从I2C设备地址为0x50的传感器读取4个字节的数据,并将其存储在data变量中。最后,打印接收到的数据。

案例8:I2C LCD显示

import machine
import utime

i2c = machine.I2C(scl=machine.Pin('PB8'), sda=machine.Pin('PB9'))  # 初始化I2C对象,设置SCL引脚为PB8,SDA引脚为PB9

# I2C LCD显示
def lcd_command(command):
    i2c.writeto(0x27, bytearray([0x00, command]))

def lcd_write(data):
    i2c.writeto(0x27, bytearray([0x40, data]))

def lcd_init():
    lcd_command(0x33)
    lcd_command(0x32)
    lcd_command(0x28)
    lcd_command(0x0C)
    lcd_command(0x06)
    lcd_command(0x01)

def lcd_clear():
    lcd_command(0x01)

def lcd_display(message):
    lcd_clear()
    for char in message:
        lcd_write(ord(char))

lcd_init()
lcd_display("Hello, MicroPython!")

while True:
    utime.sleep(1)

解读:
该程序使用machine模块控制麦哲伦开发板上的I2C总线功能,用于驱动I2C LCD显示器。通过创建I2C对象初始化I2C,设置SCL引脚为PB8,SDA引脚为PB9。然后定义了一系列函数,包括lcd_command()用于发送LCD命令,lcd_write()用于发送LCD数据,lcd_init()用于初始化LCD,lcd_clear()用于清空LCD屏幕,lcd_display()用于显示消息。在主循环中,首先调用lcd_init()进行LCD初始化,然后通过lcd_display()显示"Hello, MicroPython!"消息。最后,使用utime.sleep()函数进行一秒的延时。

案例9:I2C EEPROM读写

import machine

i2c = machine.I2C(scl=machine.Pin('PB8'), sda=machine.Pin('PB9'))  # 初始化I2C对象,设置SCL引脚为PB8,SDA引脚为PB9

# I2C EEPROM读写
def eeprom_write_byte(address, data):
    i2c.writeto(0x50, bytearray([address >> 8, address & 0xFF, data]))

def eeprom_read_byte(address):
    i2c.writeto(0x50, bytearray([address >> 8, address & 0xFF]))
    data = i2c.readfrom(0x50, 1)
    return data[0]

address = 0x100  # EEPROM地址

# 写入数据
eeprom_write_byte(address, 0xAA)

# 读取数据
data =很抱歉,上述代码截断了。以下是完整的第三个案例:

3. I2C EEPROM读写
```python
import machine

i2c = machine.I2C(scl=machine.Pin('PB8'), sda=machine.Pin('PB9'))  # 初始化I2C对象,设置SCL引脚为PB8,SDA引脚为PB9

# I2C EEPROM读写
def eeprom_write_byte(address, data):
    i2c.writeto(0x50, bytearray([address >> 8, address & 0xFF, data]))

def eeprom_read_byte(address):
    i2c.writeto(0x50, bytearray([address >> 8, address & 0xFF]))
    data = i2c.readfrom(0x50, 1)
    return data[0]

address = 0x100  # EEPROM地址

# 写入数据
eeprom_write_byte(address, 0xAA)

# 读取数据
data = eeprom_read_byte(address)
print("Read data:", data)

解读:
该程序使用machine模块控制麦哲伦开发板上的I2C总线功能,用于读写I2C EEPROM。通过创建I2C对象初始化I2C,设置SCL引脚为PB8,SDA引脚为PB9。然后定义了两个函数,eeprom_write_byte()用于向EEPROM写入数据,eeprom_read_byte()用于从EEPROM读取数据。在主程序中,首先定义了一个EEPROM地址(address)。然后通过调用eeprom_write_byte()函数向EEPROM写入一个字节的数据0xAA。接下来,通过调用eeprom_read_byte()函数从EEPROM读取数据,并将其存储在data变量中。最后,打印读取到的数据。

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

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值