STM32H750 SDRAM W9825G6KH读写操作实现
简介:本项目旨在介绍如何在STM32H750微控制器上实现与W9825G6KH SDRAM的交互。通过详细步骤解释初始化、模式寄存器加载、自刷新、预充电和读写操作,展示了使用STM32 HAL库驱动简化STM32H7系列单片机开发的过程。提供了针对STM32H750的代码实例,强调了兼容性考虑,如外设引脚、时钟配置和外设功能映射,以确保在其他STM32H7型号上的可移植性。该项目对于深入理解STM32H7系列高级用法以及在嵌入式系统中处理外部存储扩展非常有帮助。 
1. STM32H750微控制器特点及应用场景分析
STM32H750微控制器,作为STMicroelectronics推出的一款高性能ARM Cortex-M7内核微控制器,标志着STM32系列的又一重大升级。该微控制器拥有高达400 MHz的运行频率,并且集成了丰富的功能和接口,使其能够满足工业控制、消费电子、医疗健康等领域的多元化应用需求。
1.1 特点分析
在技术特性上,STM32H750引入了改进的DSP指令集和浮点运算单元(FPU),显著提升了数字信号处理能力。同时,它还具备了具有双精度运算能力的FPU,使得对精度要求极高的算法得以在本地微控制器上实现,降低了对外部DSP的依赖。
1.2 应用场景
由于STM32H750的高性能处理能力,它特别适合于需要大量数据处理的应用,如工业自动化控制系统、高级图像处理和机器视觉应用、音频和多媒体应用以及先进的通信系统等。在这些场景下,其强大的计算性能和丰富的接口资源可以保证快速响应和高效数据处理,满足实时性要求。
在实际应用中,开发者不仅需要深入理解STM32H750的硬件特性,还需要掌握如何将其性能优势转化为应用优势。例如,通过正确的外设配置、高效的任务调度、以及在实际应用中的优化,可以最大程度地利用STM32H750的潜力。
让我们继续深入探讨,看看下一章如何细致解读SDRAM W9825G6KH芯片规格,并分析其在嵌入式系统中的重要应用。
2. SDRAM W9825G6KH芯片规格解读与应用
2.1 SDRAM W9825G6KH的技术参数详述
2.1.1 存储容量与组织结构
SDRAM W9825G6KH是一款具有256M bit存储容量的同步动态随机存取存储器(SDRAM)。其组织结构为4M字×4位×16组,总共16M字(每字为4位)。
在嵌入式系统中,SDRAM的存储容量直接影响到系统可运行的最大程序大小和可处理的数据量。较大的存储容量意味着可以运行更复杂的程序,处理更多的数据。而其组织结构则决定了数据的读写方式和地址映射方法。
接下来,我们将详细介绍SDRAM W9825G6KH的时序参数和电气特性。
2.1.2 时序参数和电气特性
时序参数是SDRAM性能的一个重要指标,其中包括:
- CAS Latency(CL):列地址选通脉冲延迟时间,表示从读取命令发出到数据输出所需的时钟周期数。CL越小,读取速度越快。
- tRCD(RAS to CAS Delay):行地址到列地址的延迟时间,表示从行激活命令到列读写命令发出所需的时钟周期数。tRCD越小,列操作的响应时间越快。
- tRP(Row Precharge Delay):行预充电时间,表示从行关闭命令到下一个行激活命令所需的时钟周期数。tRP越小,行切换速度越快。
- tRAS(Active to Precharge Delay):行激活时间,表示从行激活命令到行预充电命令所需的最短时钟周期数。tRAS越小,行操作的总时间越短。
电气特性则包括:
- VDD和VDDQ:分别为SDRAM内核和IO的供电电压,通常为1.8V。
- I/O接口:CMOS兼容的TTL电平。
- 工作温度:工业级标准为-40℃到85℃。
接下来,我们将探讨SDRAM在嵌入式系统中的作用。
2.2 SDRAM在嵌入式系统中的作用
2.2.1 内存扩展与数据缓存
SDRAM在嵌入式系统中主要扮演内存扩展和数据缓存的角色。由于嵌入式系统通常需要处理大量实时数据,而其内置的内存往往有限,因此外接SDRAM成为了扩展内存容量的首选。
数据缓存功能则来自于SDRAM的高速读写特性,能够有效提高数据的存取速度,减少CPU的等待时间。
在接下来的章节中,我们将详细讨论SDRAM如何提升嵌入式系统的性能。
2.2.2 提升系统性能的关键因素
SDRAM对提升嵌入式系统性能的作用主要体现在以下几个方面:
- 增加可用内存空间:SDRAM能够提供远高于内置存储器的内存空间,从而允许系统加载更大的程序和处理更多数据。
- 提高数据读写速率:SDRAM的高访问速度可以显著减少数据传输时间,进而缩短程序运行时间。
- 强化多任务处理能力:更大容量的内存空间使得系统能够同时运行多个程序或任务,提高系统的多任务处理能力。
接下来,我们将具体探讨SDRAM的读写操作,以及如何通过软件和硬件配置优化其性能。
3. STM32H750初始化SDRAM控制器的步骤与技巧
3.1 STM32H750 SDRAM控制器配置基础
3.1.1 SDRAM控制器的硬件连接
STM32H750与SDRAM芯片的连接是通过一系列的控制线、地址线、数据线以及电源线完成的。理解这些连接的细节是配置SDRAM控制器的基础。在硬件层面,确保SDRAM的数据线、地址线、控制线以及电源线与STM32H750的对应引脚正确连接是至关重要的。
- 数据线(DQ0-DQ15)连接到STM32H750的数据总线。
- 地址线(A0-A12)连接到STM32H750的地址总线。
- 控制信号线,包括RAS(Row Address Strobe)、CAS(Column Address Strobe)、WE(Write Enable)和CS(Chip Select)需要与STM32H750的相应控制线相连。
表3.1展示了STM32H750和SDRAM W9825G6KH之间的连接关系。
| STM32H750引脚 | SDRAM引脚 | 描述 | |---------------|-----------|--------------------| | D0-D15 | DQ0-DQ15 | 数据线 | | A0-A12 | A0-A12 | 地址线 | | BALE | A13 | 地址锁存使能 | | RAS | RAS | 行地址选通信号 | | CAS | CAS | 列地址选通信号 | | WE | WE | 写使能 | | CS | CS | 片选 | | ... | ... | ... |
3.1.2 配置步骤与寄存器设置
在硬件连接正确后,接下来是软件层面上的配置。STM32H750微控制器的SDRAM控制器配置包括一系列的寄存器设置。在进行配置前,通常需要通过STM32CubeMX工具生成初始化代码,然后在此基础上做进一步的定制。
在软件配置过程中,以下是一些关键的寄存器和配置步骤:
- 时钟使能 :首先需要使能SDRAM控制器时钟(HSE oscillator clock)。
- 配置SDRAM控制器时钟 :设置SDRAM控制器的时钟预分频器和时钟延迟。
- 初始化SDRAM控制器 :配置SDRAM控制器的工作模式,包括行周期、列周期、模式寄存器设置等。
- 内存测试 :在初始化后,执行内存测试以确保SDRAM正常工作。
示例代码如下:
// SDRAM 初始化
void SDRAM_Init(void) {
// 时钟使能
__HAL_RCC_FMC_CLK_ENABLE();
// 内存测试
static uint32_t buffer[SDRAM_SIZE / sizeof(uint32_t)];
for (int i = 0; i < SDRAM_SIZE / sizeof(uint32_t); i++) {
buffer[i] = i;
}
for (int i = 0; i < SDRAM_SIZE / sizeof(uint32_t); i++) {
if (buffer[i] != i) {
// 错误处理
}
}
// 其他SDRAM控制器配置...
}
3.2 从理论到实践:初始化代码解析
3.2.1 初始化代码示例
在理论指导下,代码实践是检验理论是否正确的关键步骤。下面的代码示例展示了如何通过软件配置STM32H750的SDRAM控制器。代码中将逐步初始化SDRAM,包括时钟、内存映射以及性能优化参数设置。
// 配置FMC时钟使能
__HAL_RCC_FMC_CLK_ENABLE();
// 配置GPIO
// ...
// SDRAM初始化
void SDRAM_Init(void) {
FMC_SDRAM_TimingTypeDef SDRAM_Timing = {0};
FMC_SDRAM_TimingTypeDef SDRAM_Timing2 = {0};
FMC_SDRAM_HandleTypeDef SDRAM_HandleTypeDef = {0};
// SDRAM设备初始化
hsdram1.Instance = FMC_SDRAM_DEVICE;
hsdram1.Extended = FMC_SDRAM_DEVICE.Extended;
// SDRAM控制器配置
SDRAM_Timing.LoadToActiveDelay = 2;
SDRAM_Timing.ExitSelfRefreshDelay = 6;
SDRAM_Timing.SelfRefreshTime = 4;
SDRAM_Timing.RowCycle Delay = 6;
SDRAM_Timing.WriteRecovery Time = 2;
SDRAM_Timing.RPDelay = 2;
SDRAM_Timing.RCDDelay = 2;
// SDRAM初始化结构体配置
SDRAM_HandleTypeDef.Init.SDBank = FMC_SDRAM_BANK1;
SDRAM_HandleTypeDef.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
SDRAM_HandleTypeDef.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
SDRAM_HandleTypeDef.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
SDRAM_HandleTypeDef.Init.InternalBankNumber = FMC_SDRAM_INTERN_BNK数目;
SDRAM_HandleTypeDef.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
SDRAM_HandleTypeDef.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
SDRAM_HandleTypeDef.Init.SDClockPeriod = SDRAM_Timing.LoadToActiveDelay;
SDRAM_HandleTypeDef.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE;
SDRAM_HandleTypeDef.Init.ReadPipeDelay = FMC_SDRAM_RPIPEDELAY_0;
// SDRAM初始化序列
if (HAL_SDRAM_Init(&hsdram1, &SDRAM_Timing) != HAL_OK) {
// 初始化错误处理
}
// 其他初始化代码...
}
3.2.2 错误处理与调试技巧
在SDRAM初始化过程中,错误处理是必不可少的。一旦初始化失败,需要有合适的机制来调试和解决问题。
- 错误代码检查 :在初始化失败时,HAL库通常会返回一个错误代码,通过查阅文档可以得知具体错误原因。
- 内存测试 :初始化后,进行内存测试是验证SDRAM是否正确初始化的一种手段。可以通过写入特定的测试模式,然后读取来检查数据是否正确。
此外,使用调试器单步执行代码可以帮助理解初始化过程中每一步的执行情况,确保每一步都按预期工作。
if (HAL_SDRAM_Init(&hsdram1, &SDRAM_Timing) != HAL_OK) {
// 检查HAL库返回的错误代码
switch (HAL_GetError()) {
case HAL_ERROR_TIMEOUT:
// 超时错误处理
break;
case HAL_ERROR:
// 一般错误处理
break;
default:
// 其他错误处理
break;
}
}
以上代码展示了初始化过程中如何捕获错误,并根据不同的错误代码进行处理。
4. SDRAM模式寄存器配置及优化方法
SDRAM模式寄存器是存储器运行的核心,负责控制SDRAM的各种操作模式。正确配置模式寄存器对于保证SDRAM稳定运行及性能优化至关重要。
4.1 模式寄存器的作用与配置细节
模式寄存器是SDRAM中非常关键的一个寄存器,它配置了SDRAM的基本操作模式和参数,如CAS延迟(CAS Latency)、突发长度(Burst Length)和突发类型(Burst Type)等。
4.1.1 模式寄存器参数详解
- CAS延迟(CAS Latency) :CAS延迟定义了在发起读操作后,数据变得可用之前需要等待的时钟周期数。这是一个关键参数,它直接影响SDRAM的读取速度。
- 突发长度(Burst Length) :突发长度定义了一次操作可以访问的数据的数量。SDRAM支持单个突发长度或者连续突发长度,这取决于设置的值。
- 突发类型(Burst Type) :突发类型定义了数据访问的顺序模式。通常有两种模式:顺序(Sequential)和交错(Interleaved)。选择何种模式会影响数据访问的连续性和效率。
4.1.2 优化模式寄存器提升性能
- CAS延迟调整 :根据SDRAM的时序参数和系统时钟频率,选择合适的CAS延迟值可以提高读取性能。延迟值太小可能导致读取错误,而延迟值太大则会降低性能。
- 突发长度设置 :对于随机访问频繁的应用,较短的突发长度更合适。而如果数据访问具有良好的连续性,长突发长度可提高效率。
- 突发顺序选择 :通常顺序模式的延迟比交错模式小,因此在需要高性能时应该考虑使用顺序模式。
flowchart TD
A[开始配置模式寄存器] --> B{选择CAS延迟}
B -->|过低| C[增加延迟提高稳定性]
B -->|过高| D[减少延迟提高性能]
A --> E[设置突发长度]
E -->|短突发| F[适用于随机访问]
E -->|长突发| G[适用于连续访问]
A --> H[选择突发类型]
H -->|顺序模式| I[减少延迟]
H -->|交错模式| J[提升随机访问性能]
4.2 实际操作中的调试与问题解决
在实际操作中,模式寄存器配置错误可能会导致SDRAM不正常工作或性能不达标。调试和问题解决策略是重要的实践环节。
4.2.1 调试工具与调试步骤
使用逻辑分析仪或示波器可以观察SDRAM的时序并确保信号正确。调试步骤通常包括以下步骤:
- 验证硬件连接 :确保SDRAM与控制器的物理连接正确无误。
- 检查时钟信号 :确保SDRAM的时钟信号是稳定的。
- 模式寄存器写入验证 :使用示波器检查模式寄存器写入操作的信号是否正确。
- 读写测试 :运行一系列的读写测试来确保SDRAM的读写操作是正确的。
4.2.2 常见问题及解决策略
- 数据不一致 :可能是因为CAS延迟设置不当或者读写时序不匹配导致的,需要重新校准时钟和延迟。
- 访问失败 :如果SDRAM访问失败,可能是突发长度设置与实际的访问模式不匹配,需要检查并重新配置。
- 性能低下 :性能低下的一个常见原因是突发类型设置错误。如果程序访问模式与突发类型不匹配,应重新考虑是否需要更改设置。
| 问题类型 | 原因分析 | 解决策略 |
| -------------- | ------------------- | --------------------------- |
| 数据不一致 | CAS延迟设置不当 | 重新校准时钟和延迟 |
| 访问失败 | 突发长度设置错误 | 检查访问模式并重新配置 |
| 性能低下 | 突发类型设置错误 | 评估程序访问模式和重新配置 |
在配置模式寄存器时,必须结合实际应用场景和硬件特性来综合考虑,因为不同的应用场景对SDRAM的操作要求是不一样的。通过精确的配置和调试,可以使SDRAM在满足性能要求的同时,达到最高的稳定性和可靠性。
5. SDRAM自刷新与预充电操作详解
自刷新模式和预充电操作是SDRAM运行中的重要方面,它们对于保持数据的完整性和优化内存性能至关重要。本章节将深入探讨自刷新模式的原理、设置方法,以及预充电操作的流程和应用,从而为开发者提供有关如何管理SDRAM电源消耗和数据保存的技术洞察。
5.1 自刷新模式的原理与设置
5.1.1 自刷新模式的必要性
在现代电子系统中,节能和数据完整性是设计的关键考虑因素。在SDRAM中,自刷新模式是一种特别的低功耗模式,它允许在没有CPU干预的情况下保存数据,同时降低能耗。自刷新模式的主要目的是在不活动期间保持存储器内容,这在移动设备或需要长时间待机的应用中尤为关键。
自刷新模式通过周期性地激活存储器内部的定时器和逻辑电路来工作,该定时器确保定时自动刷新存储器阵列中的所有行,以此来维持数据不丢失。这种模式对于那些需要低功耗操作,但又不能完全关闭内存的系统来说非常有用。
5.1.2 设置自刷新的参数与影响
自刷新模式的参数设置对于系统性能和功耗平衡至关重要。SDRAM自刷新参数通常包括自刷新时钟周期(tRFC)和自刷新温度补偿(tRFC(Tc))。开发者需要根据存储器规格和系统需求进行相应的配置。
-
tRFC(自刷新周期) :确定了存储器内部自刷新定时器的时间间隔。一个较低的tRFC值意味着存储器会以较高的频率进行刷新,这可能导致更高的能耗。开发者需要在保持数据完整性和限制功耗之间找到平衡点。
-
tRFC(Tc)(温度补偿自刷新周期) :在较高温度下,存储器的自刷新间隔需要更短。tRFC(Tc)参数允许存储器根据温度条件自动调整自刷新周期,以确保在不同的温度下数据的持久性和完整性。
配置这些参数通常需要在初始化阶段通过编程模式寄存器来完成。下面的代码块演示了如何在STM32H750上设置SDRAM进入自刷新模式。
// 假设SDRAM已经被正确初始化并准备进入自刷新模式
// 设置自刷新模式的代码示例
#define SDRAM.refresh_rate 7 // 定义自刷新时钟周期,示例值为7个时钟周期
// 寄存器设置
void SDRAM.enterSelfRefreshMode(uint32_t refresh_rate) {
// 这里应包含使能SDRAM自刷新模式的代码
// 例如,通过写入特定的值到SDRAM控制器的模式寄存器中
SDRAM->SDRSCFG |= (SDRAM.refresh_rate << 13); // 设置自刷新周期
SDRAM->SDRSCONTR = 0x2; // 激活自刷新模式
}
// 实际应用时,调用上述函数进入自刷新模式
SDRAM.enterSelfRefreshMode(SDRAM.refresh_rate);
通过设置合适的自刷新周期参数,开发者可以在保持数据完整性和减少能耗之间取得平衡。
5.2 预充电操作的流程与应用
5.2.1 预充电操作的时机选择
在SDRAM的读写操作中,预充电操作是另一个重要的方面。预充电操作的目的是为下一次读写操作准备内存的行。在SDRAM操作中,每次读写都会打开(激活)一个内存行,而预充电操作将关闭这些行,为之后的操作做准备。
预充电操作通常在读写操作之后执行,特别是在连续行访问时,为了防止数据干扰,需要对前一行进行预充电。如果预充电操作的时机选择不当,可能会导致不必要的延迟和性能下降。
5.2.2 提高预充电效率的策略
为了提高预充电效率,可以采取以下策略:
- 合并读写请求 :将多个读写操作合并在一起执行,减少中间的预充电次数。
- 使用突发传输 :对于连续的内存访问,启用突发传输模式可以减少预充电的频率,因为突发传输可以在单个行激活状态下完成多个数据传输。
- 优化算法逻辑 :通过算法逻辑优化,减少不必要的内存访问和预充电操作。
在STM32H750的SDRAM控制器中,预充电操作可以通过特定的控制信号来实现。以下是一个预充电操作的示例代码。
// 假设SDRAM已经被正确初始化并准备进行预充电操作
// 执行预充电操作的代码示例
void SDRAM.prechargeAllBank(void) {
// 执行所有存储库的预充电
*(__IO uint32_t *)(SDRAM_ADDRESS | SDRAM.RefreshPrechargeReg) = 0x00000001;
// 添加必要的延时
DWT_Delay_us(2); // 延时函数,等待预充电操作完成
// 确认是否预充电成功
if ((*(__IO uint32_t *)(SDRAM_ADDRESS | SDRAM.RefreshPrechargeReg) & 0x1) != 0x1) {
// 处理预充电失败的情况
}
}
// 实际应用时,根据访问模式选择预充电操作
SDRAM.prechargeAllBank();
通过上述策略和代码示例,我们可以看到预充电操作在优化内存性能方面的重要性和实用性。
以上是第五章的内容,涵盖了SDRAM自刷新与预充电操作的原理、设置和应用。通过深入理解这些概念和实践方法,开发者能够更好地管理SDRAM的功耗和性能,以满足复杂应用的需求。接下来的章节将探讨SDRAM的读写操作及其优化方法,为最终实现高效的数据处理提供技术路径。
6. SDRAM读写操作的实现与优化
6.1 SDRAM读写操作的基本流程
在嵌入式系统中,读写SDRAM是一个复杂的过程,它涉及到多个层面的协作,包括硬件和软件两个方面。在进行SDRAM读写操作时,理解其基本流程是至关重要的。
6.1.1 读写时序的要求
SDRAM的读写操作必须遵守一定的时序要求。在设计读写操作时,需要考虑到SDRAM的数据存储机制和访问延迟。一个典型的SDRAM读操作包括以下步骤:
- 行地址被送到SDRAM并被激活。
- 等待行地址激活的延时。
- 列地址被送到SDRAM,以选择所需数据。
- 等待列地址访问的延时。
- 数据被从SDRAM读出。
写操作与读操作类似,但增加了写入数据的步骤。这些步骤需要通过编程来精确控制,以确保数据的正确读取或写入。
6.1.2 实现高效读写的关键技术
为了实现高效读写,必须使用一些关键的技术。例如,可以使用突发传输模式(burst mode),该模式允许在初始化一个读或写请求后,连续传输数据而无需重新指定地址。这样可以大幅度提高数据传输速率。
此外,还可以通过优化存储器访问模式来减少延迟。例如,交替访问不同的存储块可以减少等待时间,因为SDRAM可以同时对多个存储块进行预充电或激活操作。
6.2 SDRAM读写性能的优化方法
SDRAM的读写性能受到诸多因素的影响,包括数据访问模式、内存布局等。对SDRAM进行性能优化,可以从软件层面和硬件配置调整两个维度进行。
6.2.1 软件层面的优化
在软件层面上,开发者可以采取以下优化措施:
- 使用DMA(直接内存访问) :减少CPU干预,通过DMA直接在内存和外设之间传输数据,可以显著提高数据吞吐量。
- 缓存优化 :使用局部性原理来优化数据缓存的使用。如果数据访问有局部性,那么缓存能够大大减少访问内存的次数。
- 代码与数据分离 :将代码和数据放置在不同的SDRAM区域以避免相互干扰,从而提高执行效率。
6.2.2 硬件配置的调整
硬件层面的调整也很重要,以下是一些主要的考虑点:
- 内存布局优化 :合理分配内存地址,将常用的数据或代码段放在容易访问的区域。
- 时钟频率调节 :提高SDRAM的时钟频率可以增加数据吞吐量,但需确保信号完整性并满足时序要求。
- 电源管理 :在不牺牲性能的前提下,合理管理SDRAM的电源使用,可以减少功耗。
实现案例
举个例子,以下是一个针对STM32H750的SDRAM读写操作的代码片段,展示了如何配置SDRAM控制器和执行基本的读写操作:
/* 定义SDRAM的起始地址 */
#define SDRAM_START_ADDRESS (uint32_t)0xD0000000
#define SDRAM_SIZE (16*1024*1024) // 16MB
/* 假设SDRAM已经通过HAL库被初始化 */
/* 写入SDRAM */
void WriteToSDRAM(uint32_t address, uint32_t data)
{
*(volatile uint32_t *)(SDRAM_START_ADDRESS + address) = data;
}
/* 从SDRAM读取 */
uint32_t ReadFromSDRAM(uint32_t address)
{
return *(volatile uint32_t *)(SDRAM_START_ADDRESS + address);
}
/* 在主程序中调用读写函数 */
int main()
{
/* 写入数据到SDRAM */
WriteToSDRAM(0x00, 0x12345678);
/* 从SDRAM读取数据 */
uint32_t readData = ReadFromSDRAM(0x00);
while(1)
{
// 应用逻辑
}
}
以上代码展示了最简单的SDRAM读写操作。在实际应用中,你可能需要结合DMA、中断和其他高级特性来进一步优化你的操作。务必注意在进行操作之前,SDRAM已经被正确初始化,并且所有配置都符合其技术规格。
简介:本项目旨在介绍如何在STM32H750微控制器上实现与W9825G6KH SDRAM的交互。通过详细步骤解释初始化、模式寄存器加载、自刷新、预充电和读写操作,展示了使用STM32 HAL库驱动简化STM32H7系列单片机开发的过程。提供了针对STM32H750的代码实例,强调了兼容性考虑,如外设引脚、时钟配置和外设功能映射,以确保在其他STM32H7型号上的可移植性。该项目对于深入理解STM32H7系列高级用法以及在嵌入式系统中处理外部存储扩展非常有帮助。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)