定制带U盘功能的bootloader实现拖拽下载固件

TopSemic嵌入式 2023-09-22 08:04


  • 引言

  • 原理

  • 实现

    • 硬件相关

    • 软件相关

    • 用户应用程序

  • 总结

    • known issue


引言

我们在向一些非专业开发者发放开发板时,有时对方没有调试器,开发者就无法下载体验在后续发布支持新功能的固件。并且,对于非专业开发者的用户来说,仅仅是体验新功能,而不介入开发工作,专门搭建一套开发环境,性价比实在不高。即使有调试器硬件,在不同操作系统平台上,还需要安装专门的工具软件配合工作,才能实现下载固件的功能,操作比较繁琐。为了简化下载固件的操作,本例使用MM32F5270微控制器,基于芯片自带的USB外设,实现了一个基于U盘拖拽更新固件的解决方案。我期望实现的结果是:

  • 将开发板同PC连接后,PC将识别出一个U盘
  • 可将开发板的固件(bin 格式)文件拖拽存放至该U盘中
  • 复位开发板后,开发板能够执行新的固件程序

相对于板载带有U盘拖拽下载功能的daplink方案,本例节约了一个专门运行daplink程序的芯片,利用微控制器自带的USB外设直接建立同PC的连接,更可有机会被实现成ROM,固化在芯片内部。

关于项目的源码及相关的资料,见Gitee站点:https://gitee.com/suyong_yq/mcu-udisk-bootloader

原理

MM32F5270片内集成了256KB Flash,但可通过QSPI接口外扩spiflash存储设备,并可在外扩spiflash中执行程序(XIP)。本例实际将运行bootloader的片内Flash当做BOOT ROM,而将可执行程序的固件存放在对接的spiflash存储介质中。当芯片上电后,通过一些外部控制手段(例如使用一个按键选择启动模式),先运行带有USB功能的bootloader程序,由bootloader的程序将芯片模拟成U盘(U盘的物理存储空间位于外扩spiflash的后半段)。PC可以看到模拟U盘中的现存文件,也可以向其中拖拽新文件。当拖拽新文件后,bootloader程序会继续将新文件的程序内容复制到程序的执行区域,覆盖掉之前的程序,然后再跳转到程序的执行区域执行程序。

这里专门使用一块物理存储区域(spiflash存储器的后半段)的原因是,USB协议栈模拟U盘时,对文件系统的管理操作全部交由PC完成,这就意味着,PC向模拟U盘发送包含文件内容的数据包时,不一定是按照物理上的先后顺序发送的,微控制器端难以通过数据包本身解析出数据包的先后顺序。但是,bootloader向程序执行区域复制可执行程序的内容必须是顺序且连续的。PC在同U盘的通信过程中,数据包之间的内容可能不连续,但最终发送完成的文件内容一定是完整的。因此,这里使用使用了一个能包含整个固件文件大小的区域作为缓冲区,先缓冲下来整个完整的文件,然后再将完整的文件内容按顺序复制到程序的可执行区域。

理想情况下,如果能用一块RAM作为整个文件的缓冲区,通过U盘拖拽下载过程将会非常快。但本例中使用spiflash作为缓冲区,虽然擦除spiflash并向其写入数据需要花费更多的时间,但能容纳更大的程序文件。

如果芯片内部集成足够大的片内Flash,也可以不依赖外扩spiflash,对内部的Flash做分区,分别作为bootloader、运行程序及文件缓存的存储区。

实现

硬件相关

本例使用BIRD-F5270开发板,开发板基本情况如下:

  • 晶振 12MHz
  • 使用QSPI接口对接外扩spiflash存储芯片FM25Q16(2MB Flash),引脚与MM32F5280片内合封所使用的引脚保持一致:
    • QSPI_NSS - PF6
    • QSPI_SCK - PG7
    • QSPI_D0 - PG6
    • QSPI_D1 - PF8
    • QSPI_D2 - PF10
    • QSPI_D3 - PG8
  • USB 引脚
    • USB_DP - PA12
    • USB_DM - PA11
  • 按键引脚
    • SW1 - RESET
    • SW2 - BOOT0
    • SW3 - PA0

软件相关

启动到2nd bootloader

芯片上电复位后,默认是直接执行到用户程序中,但也可以通过指定的手段改为执行bootloader,执行U盘程序。本例使用一个按键,绑定到一个指定的GPIO输入(BOOT引脚),芯片在启动过程中判定启动模式:默认启动到用户程序,当按键按下时,启动到带有U盘程序的bootloader。

MM32F5芯片自带的BOOT0引脚虽然在微控制器复位后可作为普通GPIO使用,但可能会将芯片引导到芯片内部已经固化到ROM中的bootloader程序中,因此不适合作为2nd bootloader的BOOT引脚。BIRD-F5270开发板上除RESET和BOOT0 之外,还有PA0引脚实现按键(SW3)功能,可作为2nd bootloader中的BOOT引脚。

当 SW3 被按下时,PA0 为低电平,可执行 U 盘任务,当 SW3 松开时,PA0 为高电平,可执行跳转程序的任务,具体实现代码如下:

/* read gpio pin level, select boot mode. */
if (GPIO_ReadInDataBit(BOARD_BTN_PORT, BOARD_BTN_PIN))
{
    /* update app & run. */
    jump_to_app();
}
else
{
    /* run usb msc task. */
    msc_task();
}

/* cannot run here. */
while(1)
{}

基于USB外设模拟U盘

MM32F5270微控制器集成了USB外设,配合TinyUSB协议栈,可模拟U盘(MSC设备)。

当运行模拟U盘的程序时,需要指定一块存储区域作为U盘的存储空间,在本例中,将外扩的spiflash存储区域一分为二,前半部分作为执行程序区域,存储需要执行的应用程序,后半部分作为U盘的物理存储空间,将用于缓存用户通过拖拽方式下载的固件。

注意,spiflash作为U盘的存储介质时需要解决一个问题,spiflash的最小擦除块大小是4KB,而U盘设备对存储介质的擦除块大小是512B,擦除块大小不匹配。该问题有两种解法:

  • 每次修改spiflash前,先将包含目标操作空间的4KB大小的数据块读取数据到RAM中缓存,修改指定位置的数据内容后,擦除spiflash中对应的整块,再将修改后的数据块写入到spiflash中。
  • 每次修改spiflash前,先将包含目标操作空间的4KB大小的数据块读取数据到RAM中缓存,修改指定位置的数据内容后,暂不写回到spiflash中。如果接下来要写入的数据仍在该块中,则继续写入RAM缓存。只有当将要新写入的数据不在缓存的数据块中时,才写回最近缓存的数据块,并读出新的数据块到RAM缓存中。另外,每次在写操作之后的读操作,也都会重新清空RAM缓存中的数据。

第一种方法简单易实现,但会频繁擦写spiflash,消耗存储器件的寿命。第二种方法相当于实现了一个cache机制,操作行为较为复杂。当前暂时选择第一种做法,先验证原理,如果后续考虑将这个带U盘功能的bootloader集成到芯片内部,到时也可以专门集成一块以512B作为操作单元的dflash作为固件的缓存存储设备。

运行TinyUSB协议栈的程序中,在执行MSC任务时,会执行对spiflash存储设备进行读写操作的回调函数,如下:

从spiflash读数据:

// Callback invoked when received READ10 command.
// Copy disk's data to buffer (up to bufsize) and return number of copied bytes.
int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
{
    (void) lun;

    uint8_t * addr = (uint8_t*)(BOARD_MEM_BASE + lba * 512 + offset);
    memcpy(buffer, addr, bufsize);

    return bufsize;
}

向spiflash写数据:

static uint8_t flash_buf[4096];

// Callback invoked when received WRITE10 command.
// Process data in buffer to disk's storage and return number of written bytes
int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize)
{
    (void) lun;

    /* read the 4K sector from spiflash to local buff. */
    uint8_t * flash_addr = (uint8_t *)((BOARD_MEM_BASE + lba * 512) & 0xFFFFF000);
    memcpy(flash_buf, flash_addr, 4096);
    /* erase the sector in spiflash. */
    BOARD_EraseSector4KB((uint32_t)flash_addr);
    /* write the new data into local buff. */
    uint8_t * block = flash_buf + ((lba * 512) &0xFFF) + offset;
    memcpy(block, buffer, bufsize);
    /* write the data from local buff to spiflash. */
    BOARD_WriteSector4KB((uint32_t)flash_addr, flash_buf);

    return bufsize;
}

另外,还有一种做法是不需要真实存在的物理存储空间作为U盘的存储介质,而是实时解算PC发过来的要存储在Flash上的数据包,解析其中哪些数据是文件系统相关的信息,哪些数据是文件本身内容。此时,可丢弃文件系统相关的信息,而将文件本身内容按顺序存放在spiflash的指定区域。该方法不需要将spiflash空间一分为二,可提高对spiflash的空间利用率,但该实现该方法需要十分熟悉FAT文件系统格式,且万一电脑未按照指定的序列发数数据时,该方法无法正确解算出文件内容,造成更新固件失败,因此,在本例中未实现该功能。

判断是否存在新固件

前文中实现的U盘功能,将包括文件系统信息的新固件储存在了spiflash的后半段空间中,bootloader程序要读取新固件中的内容也需要能够操作文件系统,本例中为bootloader程序性集成了嵌入式系统上常见的文件系统组件为 FatFs(http://elm-chan.org/fsw/ff/00index_e.html)

本项目中,仅需要 FatFs 实现文件的读功能,不需要对文件进行写操作,因此只需要在适配接口上实现读操作即可, 配置文件ff_conf.h中配置宏选项 FF_FS_READONLY 的值为1。然后在diskio.c文件中适配文件系统对具体物理介质的读操作函数disk_read()如下:

DRESULT disk_read (
    BYTE pdrv,      /* Physical drive nmuber to identify the drive */
    BYTE *buff,     /* Data buffer to store read data */
    LBA_t sector,   /* Start sector in LBA */
    UINT count      /* Number of sectors to read */
)

{
    (void) pdrv;

    BYTE *flash_addr = (BYTE*)(BOARD_MEM_BASE + sector * FF_MAX_SS);
    memcpy(buff, flash_addr, count * FF_MAX_SS);

    return 0;
}

如何在文件系统中的众多文件中识别微控制器可执行程序的固件呢?本例采用通过文件名来确定是否为固件。

通过 FatFs 尝试打开一个有宏BOARD_APP_NAME指定名称的文件,若能成功打开该文件,则说明有可用的固件文件存在。

if (FR_OK == f_open(&file, "0:/"BOARD_APP_NAME, FA_READ) )
{
 ...
}

为什么不能使用任意bin判断文件作为固件呢?这里考虑到,当文件系统中有多个bin文件时,bootloader 没有依据判断哪一个固件为新固件(根据修改日期判断是否可行,作为可移动存储设备,会插在不同电脑上,如果不同电脑的时间不一致,则会出现判断失误的情况,因此不选择使用修改日期作为新固件的判断依据),指定固定文件名的方式判断固件,最简单有效,问题最少。

验证固件的有效性

不少人都应该有这样的经历,在网上下载大文件如大型游戏时,往往下载页面会提供一串 MD5 码,这段 MD5 码的作用是验证下载的文件是否完整,当用户在网上下载大文件完成后,可在 CMD 中使用 certutil -hashfile MD5 指令求出该文件的 MD5 码,与下载页面提供的 MD5 进行对比,判断文件是否下载完整。

Microsoft Windows [版本 10.0.22621.1848]
(c) Microsoft Corporation。保留所有权利。

E:\>certutil -hashfile project.bin MD5
MD5 的 project.bin 哈希:
615ca0da12d496b7a8b1bd6c21876a97
CertUtil: -hashfile 命令成功完成。

E:\>

在嵌入式领域,Arm的MbedTLS加解密算法库中提供了MD5的计算方法,因此可使用MbedTLS计算MD5,有程序如下:

/* calc md5. */
mbedtls_md5_context md5_ctx;

mbedtls_md5_init(&md5_ctx);
mbedtls_md5_starts(&md5_ctx);

while(1)
{
    UINT br = 0;
    f_read(&file, app_buf, sizeof(app_buf), &br);

    mbedtls_md5_update(&md5_ctx, app_buf, br);

    if (br < sizeof(app_buf))
    {
        break;
    }
}

f_lseek(&file, 0);
uint8_t md5_val[16] = {0};
mbedtls_md5_finish(&md5_ctx, md5_val);

除了 MD5 以外,还可以使用如 SHA1,SHA2 或者 SM3 等更高安全等级的散列值算法作为新固件的判断依据。

复制固件到执行区域

复制固件到执行区域的做法较为简单,就是使用 f_read() 函数读取数据,再写入到spiflash的指定区域即可。

但除了复制固件文件内容本身,其文件的MD5值也要写入到Flash中。应在写新固件之前将之前的MD5值擦除,写新固件完成之后,再将新MD5值写入,如此一来,MD5除了作为检查新固件的完整性的方法外,还可作为执行区域固件完整性检查的重要依据。

本例中,将MD5值存放在片内flash的末尾。

检查新固件和复制固件到执行区域的代码如下:

/* check md5, the md5 length is 16 byte. */
if (memcmp((uint8_t*)BOARD_MD5_BASE, md5_val, sizeof(md5_val)) != 0)
{
    /* new file, update. */
    BOARD_EraseSector4KB(BOARD_MD5_BASE);

    uint32_t has_write = 0;
    while(1)
    {
        UINT br = 0;
        memset(app_buf, 0xffsizeof(app_buf));
        f_read(&file, app_buf, sizeof(app_buf), &br);

        BOARD_EraseSector4KB(has_write);
        BOARD_WriteSector4KB(has_write, app_buf);
        has_write+=4096;

        if (br < sizeof(app_buf))
        {
            break;
        }
    }

    /* write new md5. */
    memset(app_buf, 0xffsizeof(app_buf));
    memcpy(app_buf, md5_val, sizeof(md5_val));
    BOARD_WriteSector4KB(BOARD_MD5_BASE, app_buf);
}

需要使用完整的一个块存放MD5值,MD5必须保证单独擦除,单独写入。除了MD5以外,该区域还可以可根据需要存放一些固件相关的信息,比如说修改时间,固件大小等信息,充分利用空间。

跳转执行

跳转程序需要做的事情包括:恢复系统时钟,修改中断向量表位置,复位栈指针,执行应用程序的复位程序等。具体操作如下:

void jump_to_app(void)
{
    ...
    /* jump to app. */
    CLOCK_ResetToDefault();

    vtor = (uint32_t *)BOARD_APP_BASE;

    __disable_irq();
    SCB->VTOR = BOARD_APP_BASE;

    __ISB();
    __DSB();

    __set_MSP(vtor[0]);
    __set_PSP(vtor[0]);

    __enable_irq();
    ((void(*)(void))vtor[1])();
}

用户应用程序

为了配合bootloader正常工作,需要用户在自己的应用程序需调整以下内容:

  • 在Linker File中指定可执行程序在分块后的存储区
  • 避免误配置GPIO和QSPI导致BOOT按键或外扩spiflash失效

本例实现的bootloader,spiflash作为应用程序的执行区域,代码段的起始位置位于spiflash的起始映射地址0x90000000,不是片内Flash的0x08000000,因此,需要调整Linker中对应的配置如下:

/*--------------------- Flash Configuration ----------------------------------
 Flash Configuration
;    Flash Base Address <0x0-0xFFFFFFFF:8>
;    Flash Size (in Bytes) <0x0-0xFFFFFFFF:8>

 *----------------------------------------------------------------------------*/
#define __ROM_BASE      0x90000000
#define __ROM_SIZE      0x00100000

若使用spiflash存储应用程序,bootloader在执行应用程序前就应该将 QSPI 接口和 GPIO 引脚配置好。在用户应用程序中,如果需要操作QSPI或者bootloader中使用的GPIO,要特别注意避开。

总结

通过USB接口将BIRD-F5270连接电脑,保持SW3按键按下时,再按下并松开RESET按键,稍后会在PC上看到一个大小约为1MB的U盘,将新编译好的名为 “project.bin” 的固件文件拖拽存放至该U盘中,然后保持SW3按键松开的状态下再次按下并松开RESET按键,稍后即可发现微控制器已经在执行新固件中的应用程序了。

作为下载新固件的 U 盘,还可以存放一些别的文件,供应用程序使用,例如一张图片,一首音乐,或一段文字,但需要注意的是,应用程序对该文件系统只有读操作的权限,不能进行写操作(或者在bootloader中实现安全写操作的接口,让应用程序去调用相应的写操作接口)

known issue

开发板通过 USB 连接电脑,保持 SW3 按键按下的状态,多次快速按下复位键,可能会造成文件系统损坏,文件丢失,需重新格式化才能正常使用,其原因是两次按下复位键中间,电脑正在修改 Flash 中的内容,但复位操作打断了写操作,造成文件系统损坏。因此需避免快速多次按下复位键的操作。这里可考虑使用一个可编程的指示灯,指示芯片内部程序的工作状态:当拖拽固件文件到芯片时,指示灯快速闪烁;当复制新固件文件到程序运行区域时,指示灯保持常亮;当复制完毕后,指示灯熄灭。仅当指示灯熄灭后,方可重新复位芯片执行新程序。


TopSemic嵌入式 TopSemic,让芯片使用更简单。 专注分享:嵌入式,单片机,STM32,ARM,RTOS,Linux, 软硬件,半导体,电子技术等相关内容。
评论
  • 振动样品磁强计是一种用于测量材料磁性的精密仪器,广泛应用于科研、工业检测等领域。然而,其测量准确度会受到多种因素的影响,下面我们将逐一分析这些因素。一、温度因素温度是影响振动样品磁强计测量准确度的重要因素之一。随着温度的变化,材料的磁性也会发生变化,从而影响测量结果的准确性。因此,在进行磁性测量时,应确保恒温环境,以减少温度波动对测量结果的影响。二、样品制备样品的制备过程同样会影响振动样品磁强计的测量准确度。样品的形状、尺寸和表面处理等因素都会对测量结果产生影响。为了确保测量准确度,应严格按照规
    锦正茂科技 2025-02-28 14:05 134浏览
  •           近日受某专业机构邀请,参加了官方举办的《广东省科技创新条例》宣讲会。在与会之前,作为一名技术工作者一直认为技术的法例都是保密和侵权方面的,而潜意识中感觉法律有束缚创新工作的进行可能。通过一个上午学习新法,对广东省的科技创新有了新的认识。广东是改革的前沿阵地,是科技创新的沃土,企业是创新的主要个体。《广东省科技创新条例》是广东省为促进科技创新、推动高质量发展而制定的地方性法规,主要内容包括: 总则:明确立法目
    广州铁金刚 2025-02-28 10:14 103浏览
  • Matter 协议,原名 CHIP(Connected Home over IP),是由苹果、谷歌、亚马逊和三星等科技巨头联合ZigBee联盟(现连接标准联盟CSA)共同推出的一套基于IP协议的智能家居连接标准,旨在打破智能家居设备之间的 “语言障碍”,实现真正的互联互通。然而,目标与现实之间总有落差,前期阶段的Matter 协议由于设备支持类型有限、设备生态协同滞后以及设备通信协议割裂等原因,并未能彻底消除智能家居中的“设备孤岛”现象,但随着2025年的到来,这些现象都将得到完美的解决。近期,
    华普微HOPERF 2025-02-27 10:32 212浏览
  • 1,微软下载免费Visual Studio Code2,安装C/C++插件,如果无法直接点击下载, 可以选择手动install from VSIX:ms-vscode.cpptools-1.23.6@win32-x64.vsix3,安装C/C++编译器MniGW (MinGW在 Windows 环境下提供类似于 Unix/Linux 环境下的开发工具,使开发者能够轻松地在 Windows 上编写和编译 C、C++ 等程序.)4,C/C++插件扩展设置中添加Include Path 5,
    黎查 2025-02-28 14:39 140浏览
  •         近日,广电计量在聚焦离子束(FIB)领域编写的专业著作《聚焦离子束:失效分析》正式出版,填补了国内聚焦离子束领域实践性专业书籍的空白,为该领域的技术发展与知识传播提供了重要助力。         随着芯片技术不断发展,芯片的集成度越来越高,结构也日益复杂。这使得传统的失效分析方法面临巨大挑战。FIB技术的出现,为芯片失效分析带来了新的解决方案。它能够在纳米尺度上对芯片进行精确加工和分析。当芯
    广电计量 2025-02-28 09:15 116浏览
  • 应用趋势与客户需求,AI PC的未来展望随着人工智能(AI)技术的日益成熟,AI PC(人工智能个人电脑)逐渐成为消费者和企业工作中的重要工具。这类产品集成了最新的AI处理器,如NPU、CPU和GPU,并具备许多智能化功能,为用户带来更高效且直观的操作体验。AI PC的目标是提升工作和日常生活的效率,通过深度学习与自然语言处理等技术,实现更流畅的多任务处理、实时翻译、语音助手、图像生成等功能,满足现代用户对生产力和娱乐的双重需求。随着各行各业对数字转型需求的增长,AI PC也开始在各个领域中显示
    百佳泰测试实验室 2025-02-27 14:08 252浏览
  • 在2024年的科技征程中,具身智能的发展已成为全球关注的焦点。从实验室到现实应用,这一领域正以前所未有的速度推进,改写着人类与机器的互动边界。这一年,我们见证了具身智能技术的突破与变革,它不仅落地各行各业,带来新的机遇,更在深刻影响着我们的生活方式和思维方式。随着相关技术的飞速发展,具身智能不再仅仅是一个技术概念,更像是一把神奇的钥匙。身后的众多行业,无论愿意与否,都像是被卷入一场伟大变革浪潮中的船只,注定要被这股汹涌的力量重塑航向。01为什么是具身智能?为什么在中国?最近,中国具身智能行业的进
    艾迈斯欧司朗 2025-02-28 15:45 221浏览
  • 请移步 gitee 仓库 https://gitee.com/Newcapec_cn/LiteOS-M_V5.0.2-Release_STM32F103_CubeMX/blob/main/Docs/%E5%9F%BA%E4%BA%8ESTM32F103RCT6%E7%A7%BB%E6%A4%8DLiteOS-M-V5.0.2-Release.md基于STM32F103RCT6移植LiteOS-M-V5.0.2-Release下载源码kernel_liteos_m: OpenHarmon
    逮到一只程序猿 2025-02-27 08:56 195浏览
  • 一、VSM的基本原理震动样品磁强计(Vibrating Sample Magnetometer,简称VSM)是一种灵敏且高效的磁性测量仪器。其基本工作原理是利用震动样品在探测线圈中引起的变化磁场来产生感应电压,这个感应电压与样品的磁矩成正比。因此,通过测量这个感应电压,我们就能够精确地确定样品的磁矩。在VSM中,被测量的样品通常被固定在一个震动头上,并以一定的频率和振幅震动。这种震动在探测线圈中引起了变化的磁通量,从而产生了一个交流电信号。这个信号的幅度和样品的磁矩有着直接的关系。因此,通过仔细
    锦正茂科技 2025-02-28 13:30 100浏览
  • 美国加州CEC能效跟DOE能效有什么区别?CEC/DOE是什么关系?美国加州CEC能效跟DOE能效有什么区别?CEC/DOE是什么关系?‌美国加州CEC能效认证与美国DOE能效认证在多个方面存在显著差异‌。认证范围和适用地区‌CEC能效认证‌:仅适用于在加利福尼亚州销售的电器产品。CEC认证的范围包括制冷设备、房间空调、中央空调、便携式空调、加热器、热水器、游泳池加热器、卫浴配件、光源、应急灯具、交通信号模块、灯具、洗碗机、洗衣机、干衣机、烹饪器具、电机和压缩机、变压器、外置电源、消费类电子设备
    张工nx808593 2025-02-27 18:04 120浏览
  • RGB灯光无法同步?细致的动态光效设定反而成为产品客诉来源!随着科技的进步和消费者需求变化,电脑接口设备单一功能性已无法满足市场需求,因此在产品上增加「动态光效」的形式便应运而生,藉此吸引消费者目光。这种RGB灯光效果,不仅能增强电脑周边产品的视觉吸引力,还能为用户提供个性化的体验,展现独特自我风格。如今,笔记本电脑、键盘、鼠标、鼠标垫、耳机、显示器等多种电脑接口设备多数已配备动态光效。这些设备的灯光效果会随着音乐节奏、游戏情节或使用者的设置而变化。想象一个画面,当一名游戏玩家,按下电源开关,整
    百佳泰测试实验室 2025-02-27 14:15 137浏览
  • 在物联网领域中,无线射频技术作为设备间通信的核心手段,已深度渗透工业自动化、智慧城市及智能家居等多元场景。然而,随着物联网设备接入规模的不断扩大,如何降低运维成本,提升通信数据的传输速度和响应时间,实现更广泛、更稳定的覆盖已成为当前亟待解决的系统性难题。SoC无线收发模块-RFM25A12在此背景下,华普微创新推出了一款高性能、远距离与高性价比的Sub-GHz无线SoC收发模块RFM25A12,旨在提升射频性能以满足行业中日益增长与复杂的设备互联需求。值得一提的是,RFM25A12还支持Wi-S
    华普微HOPERF 2025-02-28 09:06 143浏览
  • 2025年2月26日,广州】全球领先的AIoT服务商机智云正式发布“Gokit5 AI智能体开发板”,该产品作为行业首个全栈式AIoT开发中枢,深度融合火山引擎云原生架构、豆包多模态大模型、扣子智能体平台和机智云Aiot开发平台,首次实现智能体开发全流程工业化生产模式。通过「扣子+机智云」双引擎协同架构与API开放生态,开发者仅需半天即可完成智能体开发、测试、发布到硬件应用的全流程,标志着智能体开发进入分钟级响应时代。一、开发框架零代码部署,构建高效开发生态Gokit5 AI智能体开发板采用 “
    机智云物联网 2025-02-26 19:01 162浏览
  • 更多生命体征指标风靡的背后都只有一个原因:更多人将健康排在人生第一顺位!“AGEs,也就是晚期糖基化终末产物,英文名Advanced Glycation End-products,是存在于我们体内的一种代谢产物” 艾迈斯欧司朗亚太区健康监测高级市场经理王亚琴说道,“相信业内的朋友都会有关注,最近该指标的热度很高,它可以用来评估人的生活方式是否健康。”据悉,AGEs是可穿戴健康监测领域的一个“萌新”指标,近来备受关注。如果站在学术角度来理解它,那么AGEs是在非酶促条件下,蛋白质、氨基酸
    艾迈斯欧司朗 2025-02-27 14:50 400浏览
  • 构建巨量的驾驶场景时,测试ADAS和AD系统面临着巨大挑战,如传统的实验设计(Design of Experiments, DoE)方法难以有效覆盖识别驾驶边缘场景案例,但这些边缘案例恰恰是进一步提升自动驾驶系统性能的关键。一、传统解决方案:静态DoE标准的DoE方案旨在系统性地探索场景的参数空间,从而确保能够实现完全的测试覆盖范围。但在边缘案例,比如暴露在潜在安全风险的场景或是ADAS系统性能极限场景时,DoE方案通常会失效,让我们看一些常见的DoE方案:1、网格搜索法(Grid)实现原理:将
    康谋 2025-02-27 10:00 252浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦