MicroPython 开发ESP32应用教程 之 WIFI配置、连接及简单应用 WIFI及时间同步应用类的封装

ESP32的应用范围有多广,相信不用多说大家都明白,尤其是在物联网领域,所以今天我们就来讲解WIFI的配置、连接及其简单应用。

跟往常一样,我们还是先介绍WIFI的相关知识

一、硬件与软件基础

 1.1 ESP32-C3无线特性
ESP32-C3是乐鑫推出的RISC-V架构物联网芯片,配备:
- 2.4 GHz WiFi 4(802.11b/g/n)
- Bluetooth 5 LE
- 低功耗设计(仅22uA深度睡眠电流)

 1.2 MicroPython优势
- 交互式开发(REPL)
- 简化硬件操作
- 丰富的网络库支持
- 与CPython高度兼容

二、MicroPython WiFi模块详解

 2.1 核心对象说明

import network
wlan = network.WLAN(network.STA_IF)  # 创建工作站对象
wlan.active(True)                   # 激活接口
 

2.2 关键方法解析

方法参数说明
connect()ssid, password连接目标AP
disconnect()断开当前连接
scan()扫描可用网络
isconnected()返回连接状态
ifconfig()[(ip, mask, gw, dns)]获取/设置网络参数

三、WiFi连接实战

3.1 基础连接代码

    def  configwifi(self,ssid,password):
        if not self.wlan.isconnected():
            self.ssid = ssid
            self.password = password
            print(" 正在连接到",ssid)
            self.wlan.connect(ssid,password)
            
            max_wait = 10
            while max_wait > 0:
                if self.wlan.isconnected():
                    break
                max_wait -= 1
                print("等待连接……",max_wait)
                time.sleep(1)
            if not self.wlan.isconnected():
                return False
#                print("连接失败")
            else:
                return True
#                print("连接成功")
#                print("网络配置:",self.wlan.ifconfig())

3.2 增强型连接(含错误处理)

def smart_connect(ssid, password):
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    
    if wlan.isconnected():
        wlan.disconnect()
    
    visible_nets = {net[0].decode(): net for net in wlan.scan()}
    
    if ssid not in visible_nets:
        raise ValueError(f"{ssid} not found")
    
    authmode = visible_nets[ssid][4]
    print(f"Security: {authmode}")  # 0=OPEN, 1=WEP, etc.
    
    try:
        wlan.connect(ssid, password)
        for _ in range(15):
            if wlan.isconnected():
                print(f"IP: {wlan.ifconfig()[0]}")
                return True
            time.sleep(1)
        return False
    except OSError as e:
        print(f"Connection error: {e}")
        return False

3.3 增加网络配置保存、重启时自动连接功能

            self.wlan = network.WLAN(network.STA_IF)
            self.wlan.active(True)
            ssid,password = self.load_wificonfig()
            if ssid and password:
                print(ssid,password)
                self.wlan.connect(ssid,password)
                self.ssid = ssid
                self.password = password

    def save_wificonfig(self):
          with open ("wificonfig.txt","w") as f:
              f.write(self.ssid+"\n")
              f.write(self.password+"\n")
              
    def  load_wificonfig(self):
        try:
            with open("wificonfig.txt","r") as f:
                ssid = f.readline().strip()
                password = f.readline().strip()
                return ssid,password
        except:
            return None,None

 四、网络时间同步

4.1 NTP协议原理
- 使用UDP 123端口
- 支持时间服务器分层架构
- 精度通常在毫秒级

4.2 NTP服务器选择
- 国内推荐:ntp.aliyun.com
- 国际通用:pool.ntp.org

 4.3 MicroPython实现代码

    def sync_time_with_timezone(self,offset=8):
#    同步时间并设置时区
#    offset: 时区偏移(小时),东八区为8
        if not self.wlan.isconnected():
#            print("未连接到网络,请检测网络")
            return False
        try:
            ntptime.host = "ntp.aliyun.com"
            ntptime.settime()
            rtc = RTC()
            tm = list(rtc.datetime())
            
            # 调整时区
            tm[4] += offset  # 增加小时偏移
            if tm[4] >= 24:
                tm[4] -= 24
                tm[2] += 1  # 增加一天
            
            rtc.datetime(tuple(tm))
            self.is_time_sync = True
#            print("时间同步成功(UTC+%d):" % offset, rtc.datetime())
            return True
        except Exception as e:
            self.is_time_sync = False
            print("时间同步失败:", e)
            return False    

4.4 增加时间日期格式化输出

    def get_datetime(self,rtc=None):
        if self.is_time_sync == False:
            if self.sync_time_with_timezone() == False:
                return ""                
        if rtc is None:
            rtc = RTC()
        return rtc.datetime()

    def format_datetime(self):
        t = self.get_datetime()
        if t == "":
            return ""
        else:
            return "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(t[0],t[1],t[2],t[4],t[5],t[6])

    def format_date(self):
        t = self.get_datetime()
        if t == "":
            return ""
        else:
            return "{:04d}-{:02d}-{:02d}".format(t[0],t[1],t[2])

    def format_time(self):
        t = self.get_datetime()
        if t == "":
            return ""
        else:
            return "{:02d}:{:02d}:{:02d}".format(t[4],t[5],t[6])

4.5 增加定时同步时间功能

    def periodic_time_sync(self,interval=3600):
        #定期同步时间,interval :同步时间间隔(秒),默认1小时
        if interval != 0:
            self.time_sync = interval
        if self.is_time_sync:
            if self.last_synctime != None:
                rtc = RTC()
                if self.datetime_to_seconds(rtc.datetime()) - self.datetime_to_seconds(self.last_synctime) < self.time_sync:
                    return
                
        if self.auto_sync_time():
#            print("同步时间成功,当前时间:",self.format_time())
            rtc = RTC()
            self.last_synctime = rtc.datetime()
            print("同步时间:",self.format_datetime())

这个功能的实现方式比较多,我们后续的课程会探讨在中断处理程序中实现定时同步时间及获取天气信息。 

五、WIFI及时间同步的封装

有关知识点我们基本介绍了,直接上代码:(该部分代码包括上面全部的代码功能)

import network
import time
import ntptime
import urequests
from machine import RTC

class esp32_wifi(object):
    ssid=""
    password = ""
    last_synctime = None
    time_sync = 3600		#  自动同步时间间隔(秒)
    is_time_sync = False
    def __init__(self,mode="STA_MODE",esp32ssid="ESP32C3-AP",esp32psw = "",esp32authmode=network.AUTH_WPA_WPA2_PSK):
        if mode == "STA_MODE":
            self.wlan = network.WLAN(network.STA_IF)
            self.wlan.active(True)
            ssid,password = self.load_wificonfig()
            if ssid and password:
                print(ssid,password)
                self.wlan.connect(ssid,password)
                self.ssid = ssid
                self.password = password
        elif mode == "AP_MODE":
            self.ap = network.WLAN(network.AP_IF)
            self.ap.config(essid = esp32ssid,password = esp32psw,authmode = esp32authmode)
            self.ap.active(True)
            self.ssid = esp32ssid
            self.password = esp32psw
            self.authmode = esp32authmode
            print("ESP32C3 AP IP地址:",self.ap.ifconfig()[0])
        
        
    def  scanwifi(self):
        networks = self.wlan.scan()
        for net in networks:
                print(net[0],net[3])
    
    def  configwifi(self,ssid,password):
        if not self.wlan.isconnected():
            self.ssid = ssid
            self.password = password
            print(" 正在连接到",ssid)
            self.wlan.connect(ssid,password)
            
            max_wait = 10
            while max_wait > 0:
                if self.wlan.isconnected():
                    break
                max_wait -= 1
                print("等待连接……",max_wait)
                time.sleep(1)
            if not self.wlan.isconnected():
                return False
#                print("连接失败")
            else:
                return True
#                print("连接成功")
#                print("网络配置:",self.wlan.ifconfig())
            
    def  check_wifi(self):
        if self.wlan.isconnected():
            return True
#            print("已连接到网络")
#            print("IP地址:",self.wlan.ifconfig()[0])
#            print("子网掩码:",self.wlan.ifconfig()[1])
#            print("网关:",self.wlan.ifconfig()[2])
#            print("DNS:",self.wlan.ifconfig()[3])
        else:
            return False
#            print("未连接到网络")
#            self.configwifi(self.ssid,self.password)
            
    def save_wificonfig(self):
          with open ("wificonfig.txt","w") as f:
              f.write(self.ssid+"\n")
              f.write(self.password+"\n")
              
    def  load_wificonfig(self):
        try:
            with open("wificonfig.txt","r") as f:
                ssid = f.readline().strip()
                password = f.readline().strip()
                return ssid,password
        except:
            return None,None

    def sync_ntp_time(self):
        if not self.wlan.isconnected():
            print("未连接到网络,请检测网络")
            return False
        
        try:
            ntptime.host = "ntp.aliyun.com"
            ntptime.settime()
            
            rtc = RTC()
            print("同步成功!当前时间:",rtc.datetime())
            self.is_time_sync = True
            return True
        except Exception as e:
            self.is_time_sync = False
            print("时间同步失败:",e)
            return False
        
    def sync_time_with_timezone(self,offset=8):
#    同步时间并设置时区
#    offset: 时区偏移(小时),东八区为8
        if not self.wlan.isconnected():
#            print("未连接到网络,请检测网络")
            return False
        try:
            ntptime.host = "ntp.aliyun.com"
            ntptime.settime()
            rtc = RTC()
            tm = list(rtc.datetime())
            
            # 调整时区
            tm[4] += offset  # 增加小时偏移
            if tm[4] >= 24:
                tm[4] -= 24
                tm[2] += 1  # 增加一天
            
            rtc.datetime(tuple(tm))
            self.is_time_sync = True
#            print("时间同步成功(UTC+%d):" % offset, rtc.datetime())
            return True
        except Exception as e:
            self.is_time_sync = False
            print("时间同步失败:", e)
            return False    

    def get_datetime(self,rtc=None):
        if self.is_time_sync == False:
            if self.sync_time_with_timezone() == False:
                return ""                
        if rtc is None:
            rtc = RTC()
        return rtc.datetime()

    def format_datetime(self):
        t = self.get_datetime()
        if t == "":
            return ""
        else:
            return "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(t[0],t[1],t[2],t[4],t[5],t[6])

    def format_date(self):
        t = self.get_datetime()
        if t == "":
            return ""
        else:
            return "{:04d}-{:02d}-{:02d}".format(t[0],t[1],t[2])

    def format_time(self):
        t = self.get_datetime()
        if t == "":
            return ""
        else:
            return "{:02d}:{:02d}:{:02d}".format(t[4],t[5],t[6])

    def auto_sync_time(self,max_retries = 3,retry_delay=10):
        #max_retries: 最大重试次数
        #retry_delay:重试间隔(秒)
        retry = 0
        while retry < max_retries:
            if self.sync_time_with_timezone(8):
                return True
            retry += 1
            time.sleep(retry_delay)
        return False

    def days_in_month(self,year, month):
        # 返回某年某月的天数(修正闰年)
        if month == 2:
            return 29 if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0) else 28
        return [31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month-1]

    def datetime_to_seconds(self,dt):
        year, month, day, _, hour, minute, second, _ = dt
        total_days = 0
        for y in range(2000, year):
            total_days += 366 if (y % 4 == 0 and y % 100 != 0) or (y % 400 == 0) else 365
        for m in range(1, month):
            total_days += self.days_in_month(year, m)
        total_days += day - 1
        return total_days * 86400 + hour * 3600 + minute * 60 + second
        
    def periodic_time_sync(self,interval=3600):
        #定期同步时间,interval :同步时间间隔(秒),默认1小时
        if interval != 0:
            self.time_sync = interval
        if self.is_time_sync:
            if self.last_synctime != None:
                rtc = RTC()
                if self.datetime_to_seconds(rtc.datetime()) - self.datetime_to_seconds(self.last_synctime) < self.time_sync:
                    return
                
        if self.auto_sync_time():
#            print("同步时间成功,当前时间:",self.format_time())
            rtc = RTC()
            self.last_synctime = rtc.datetime()
            print("同步时间:",self.format_datetime())
            
    

 六、i2c驱动aht20并显示

aht20的介绍比较多,有兴趣的朋友可以参考:CH592F /CH582通过硬件IIC读写AHT10 /AHT20

直接上代码: 

# The MIT License (MIT)
#
# Copyright (c) 2020 Kattni Rembor for Adafruit Industries
# Copyright (c) 2020 Andreas Bühl
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
"""
MicroPython driver for the AHT10 and AHT20 Humidity and Temperature Sensor
Author(s): Andreas Bühl, Kattni Rembor
"""

import utime
from micropython import const


class AHT10:
    """Interface library for AHT10/AHT20 temperature+humidity sensors"""

    AHTX0_I2CADDR_DEFAULT = const(0x38)  # Default I2C address
    AHTX0_CMD_INITIALIZE = 0xE1  # Initialization command
    AHTX0_CMD_TRIGGER = const(0xAC)  # Trigger reading command
    AHTX0_CMD_SOFTRESET = const(0xBA)  # Soft reset command
    AHTX0_STATUS_BUSY = const(0x80)  # Status bit for busy
    AHTX0_STATUS_CALIBRATED = const(0x08)  # Status bit for calibrated

    def __init__(self, i2c, address=AHTX0_I2CADDR_DEFAULT):
        utime.sleep_ms(20)  # 20ms delay to wake up
        self._i2c = i2c
        self._address = address
        self._buf = bytearray(6)
        self.reset()
        if not self.initialize():
            raise RuntimeError("Could not initialize")
        self._temp = None
        self._humidity = None

    def reset(self):
        """Perform a soft-reset of the AHT"""
        self._buf[0] = self.AHTX0_CMD_SOFTRESET
        self._i2c.writeto(self._address, self._buf[0:1])
        utime.sleep_ms(20)  # 20ms delay to wake up

    def initialize(self):
        """Ask the sensor to self-initialize. Returns True on success, False otherwise"""
        self._buf[0] = self.AHTX0_CMD_INITIALIZE
        self._buf[1] = 0x08
        self._buf[2] = 0x00
        self._i2c.writeto(self._address, self._buf[0:3])
        self._wait_for_idle()
        if not self.status & self.AHTX0_STATUS_CALIBRATED:
            return False
        return True

    @property
    def status(self):
        """The status byte initially returned from the sensor, see datasheet for details"""
        self._read_to_buffer()
        return self._buf[0]

    @property
    def relative_humidity(self):
        """The measured relative humidity in percent."""
        self._perform_measurement()
        self._humidity = (
            (self._buf[1] << 12) | (self._buf[2] << 4) | (self._buf[3] >> 4)
        )
        self._humidity = (self._humidity * 100) / 0x100000
        return self._humidity

    @property
    def temperature(self):
        """The measured temperature in degrees Celcius."""
        self._perform_measurement()
        self._temp = ((self._buf[3] & 0xF) << 16) | (self._buf[4] << 8) | self._buf[5]
        self._temp = ((self._temp * 200.0) / 0x100000) - 50
        return self._temp

    def _read_to_buffer(self):
        """Read sensor data to buffer"""
        self._i2c.readfrom_into(self._address, self._buf)

    def _trigger_measurement(self):
        """Internal function for triggering the AHT to read temp/humidity"""
        self._buf[0] = self.AHTX0_CMD_TRIGGER
        self._buf[1] = 0x33
        self._buf[2] = 0x00
        self._i2c.writeto(self._address, self._buf[0:3])

    def _wait_for_idle(self):
        """Wait until sensor can receive a new command"""
        while self.status & self.AHTX0_STATUS_BUSY:
            utime.sleep_ms(5)

    def _perform_measurement(self):
        """Trigger measurement and write result to buffer"""
        self._trigger_measurement()
        self._wait_for_idle()
        self._read_to_buffer()


class AHT20(AHT10):
    AHTX0_CMD_INITIALIZE = 0xBE  # Calibration command


利用aht20模块读取当前的温湿度并显示:

from ahtx0 import AHT20


i2c = I2C(0,scl=Pin(2),sda=Pin(3),freq=200000)
aht20_sensor = AHT20(i2c)
wendu = aht20_sensor.temperature
shidu = aht20_sensor.relative_humidity
oled.show_chinese("温",3,43,1)
oled.text("{:>4.1f}".format(wendu),23,48,1)
oled.show_chinese("湿",64,43,1)
oled.text("{:>4.1f}".format(shidu),84,48,1)

aht20的硬件连接 :

aht20ESPC3
sclIO2
sdaIO3

调用以上模块并显示的代码:


from machine import I2C,SPI,Pin,Timer
import time
from neopixel import NeoPixel
from ssd1306 import SSD1306_SPI
from esp32_wifi import esp32_wifi
from ahtx0 import AHT20

spi = SPI(1,baudrate = 8000000,
              polarity = 0,
              phase = 0,
              sck=Pin(4),
              mosi=Pin(5),
              miso=None)
dc = Pin(6,Pin.OUT)
cs = Pin(7,Pin.OUT)
rst= Pin(10,Pin.OUT)

oled = SSD1306_SPI(128, 64, spi,dc,rst,cs) #OLED显示屏初始化:128*64分辨率
i2c = I2C(0,scl=Pin(2),sda=Pin(3),freq=200000)
aht20_sensor = AHT20(i2c)

# 定义全局变量
WS2812_NUM = 1
WS2812_LED_LEVEL = 0x10
G = 0xff
R = 0
B = 0

pin = Pin(8, Pin.OUT)   #配置GPIO8为输出端口,控制ws2812灯珠的DIN信号
np = NeoPixel(pin, WS2812_NUM,3,1)

def ws2812_LED_On(phase):
    global G,R,B
    
    for i in range(WS2812_NUM - 1):
        np[WS2812_NUM -1 - i] = np[WS2812_NUM - 2 - i]
        
    if phase < WS2812_LED_LEVEL:
        G = int(G - (0xff / WS2812_LED_LEVEL))
        R = int(R + (0xff / WS2812_LED_LEVEL))
        phase += 1
        if phase == WS2812_LED_LEVEL:
            G = 0
            R = 0xff
    elif phase < (WS2812_LED_LEVEL * 2):
        R = int(R - (0xff / WS2812_LED_LEVEL))
        B = int(B + (0xff / WS2812_LED_LEVEL))
        phase += 1        
        if phase == (WS2812_LED_LEVEL * 2):
            R = 0
            B = 0xff
    elif  phase < (WS2812_LED_LEVEL * 3):
        B = int(B - (0xff / WS2812_LED_LEVEL))
        G = int(G + (0xff / WS2812_LED_LEVEL))
        phase += 1        
        if phase == (WS2812_LED_LEVEL * 3):
            phase = 0
            B = 0
            G = 0xff
    np[0] = (G,R,B)
    return phase


if __name__ == "__main__":
    
#    pin = Pin(36, Pin.OUT)
    p9 = Pin(9, Pin.IN) #配置GPIO9为输入端口
    WS2812_POWERON = 1
    WS2812_POWEROFF = 0
    ws2812_status = WS2812_POWEROFF
    offset = 0

    
    wlan = esp32_wifi("STA_MODE")
#    wlan.configwifi("weald2000","fkepln_730401")
#    wlan.save_wificonfig()
    while True:
        if wlan.check_wifi():
            wlan.periodic_time_sync(3600)
#        if wlan.sync_time_with_timezone():
#           print("当前时间:",wlan.format_time())
        
        if (p9.value() == 0):	#是否有按键?有,切换RGB灯的状态
            ws2812_status ^= 1
            while True:
                if (p9.value() == 1):  #等待按键释放
                    break
        datetimetxt = wlan.format_date()
        oled.Set_gb_font_name("GB18030P.BIN")
        oled.fill(0x0)
        oled.rect(0,0,128,64,1)
        oled.show_chinese("日期",3,3,1)
        oled.text(datetimetxt,40,8,1)
        oled.show_chinese("时间",3,23,1)
        datetimetxt = wlan.format_time()
        oled.text(datetimetxt,40,28,1)

        wendu = aht20_sensor.temperature
        shidu = aht20_sensor.relative_humidity
        oled.show_chinese("温",3,43,1)
        oled.text("{:>4.1f}".format(wendu),23,48,1)
        oled.show_chinese("湿",64,43,1)
        oled.text("{:>4.1f}".format(shidu),84,48,1)

#        oled.show_chinese("深圳源悦科技",3,3,1)
        oled.show()
        time.sleep_ms(100)
        
        

 完整的代码请参考:MicroPythonforesp32wifi配置,时间同步,获取天气信息并显示资源-优快云文库

通过本文的实践,您已掌握ESP32-C3的无线连接和时间同步核心技术。

ESP32-C3的WIFI连接的不仅仅是网络,更是通向智能世界星光大道——让我们用MicroPython在这条大道上狂飙!

<think>好的,我现在需要帮助用户查找ESP8266的工作流程图。首先,用户提到了之前的引用资料1、2、3,这些资料涉及ESP8266的应用实例、存储结构以及传感器项目。用户的上一个问题关于MQ-135传感器的流程图,现在转向ESP8266的工作流程,可能需要类似的结构化回答。 首先,我需要回忆ESP8266的基本架构。根据引用[2],ESP8266EX芯片内置存储控制器,包含ROM和SRAM,没有内部可编程存储器,程序需外部Flash。同时,支持多种编程方式如Arduino、MicroPython和IDF库(引用[1])。用户可能需要一个从启动到运行的流程,结合这些信息。 用户上次的MQ-135流程图分为核心流程、数据处理和系统集成,所以这次可能也需要分层次的结构。需要确定ESP8266的关键工作阶段:启动流程、程序执行、网络通信、外设交互等。 启动流程方面,引用[2]提到外部Flash存储用户程序,因此上电后需要从Flash加载程序到RAM。可能需要包括ROM Bootloader的步骤,检查GPIO状态决定启动模式(如从Flash启动)。 程序执行部分,需要考虑存储仲裁器如何管理iBus、dBus和AHB接口的访问(引用[2])。这部分可能涉及内核如何从Flash读取指令,通过总线访问内存和外设。 网络通信是ESP8266的核心功能,需结合WiFi连接流程,如初始化、扫描网络、连接AP、获取IP等步骤。引用[1]中的WiFi时钟项目可能涉及NTP同步,可作为例子。 外设交互部分,用户提到了使用传感器(如温度湿度,引用[3]),所以需要包括ADC读取、GPIO控制、数据传输到服务器等步骤。可能需要流程图展示数据从传感器到网络传输的过程。 另外,用户提到的Arduino编程和MicroPython支持(引用[1][3]),可能在流程图中区分不同编程模式下的工作流程差异,比如Arduino的setup-loop结构,或者MicroPython的解释器运行方式。 需要确保流程图符合Mermaid语法,结构清晰,步骤正确。同时,根据用户之前的问题,可能需要分层次,如核心流程、数据处理、系统集成。但ESP8266作为微控制器,可能更适合分为启动、执行、通信、外设等模块。 最后,生成相关问题,需围绕ESP8266的启动机制、程序存储、多任务处理、低功耗模式等,参考用户之前的问题结构。比如启动模式选择、外部Flash的作用、如何管理多任务等。</think>根据引用资料[1][2][3]和ESP8266技术特性,其工作流程可分为以下三级架构,并附带对应的流程图说明: ### 一、核心工作流程(结合引用[1][2]) ```mermaid graph TD A[上电复位] --> B{GPIO15状态检测} B -->|低电平| C[启动ROM Bootloader] B -->|高电平| D[从Flash加载用户程序] D --> E[初始化存储控制器] E --> F[分配iBus/dBus/AHB总线] F --> G[执行用户程序] G --> H{编程模式判断} H -->|Arduino| I[setup()初始化] H -->|MicroPython| J[启动REPL解释器] I/J --> K[主循环任务执行] ``` ### 二、网络通信流程(扩展引用[1][3]) 1. **WiFi连接阶段** - 协议栈初始化:$$ T_{init} = \frac{1}{f_{crystal}} \cdot N_{clock} $$ *其中$f_{crystal}=26MHz$(引用[2]时钟系统)* ```mermaid graph LR A[WiFi初始化] --> B[扫描AP列表] B --> C[连接指定SSID] C --> D[获取IP地址] D --> E[建立TCP/UDP连接] E --> F[数据透传模式] ``` 2. **数据交互流程**(基于引用[3]案例) ``` 传感器采样 → GPIO/ADC读取 → 数据封装WiFi发送 → 服务器接收 → MySQL存储 → Web展示 ``` ### 三、存储管理流程(详解引用[2]) ```mermaid graph TB A[CPU指令请求] --> B{总线类型判断} B -->|iBus指令总线| C[访问Flash存储器] B -->|dBus数据总线| D[访问SRAM] B -->|AHB总线| E[访问外设寄存器] C --> F[通过SPI接口读取] D --> G[直接内存访问] E --> H[寄存器映射操作] ``` *注:存储仲裁器采用时间片轮转机制,优先级顺序:AHB > dBus > iBus(引用[2]存储控制器说明)*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

永远的元子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值