门禁控制器中的Flash的存储问题

名人堂再聚首 2014-08-29 06:40:36
大家好!

前两天我发了一个关于门禁控制器中Flash存储的问题(我使用STM32作为主控制MCU),现在还有以下疑惑:

1、关于门禁控制器中保存权限信息和刷卡记录信息的问题,比如我在Flash中存储了1000条权限信息,一条权限信息有10个字节长度(保存这么多的信息,肯定占用Flash的多个扇区,我用的是MX25L1065D),如果我现在要删除一个序号为600的权限,一般你们是怎样操作的?因为既然要删除数据,再写回去肯定要对Flash进行擦除操作,那除了那个序号为600的权限外,其他的数据都是需要的,那这些需要的数据是怎样临时保存起来的,万一操作过程中断电数据丢失怎么办呢?

2、向大家请教下在设计门禁控制器的存储系统时相关思路和需要考虑到的问题。

在此先谢谢大家了!
...全文
481 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
名人堂再聚首 2014-09-03
  • 打赏
  • 举报
回复
引用 11 楼 of123 的回复:
可以用 2 个扇区来保存记录数。 假定你用 4 字节来表示记录数。你在第一个扇区的 0 地址处记录第一笔记录数,在 4 地址记录第二笔,以此类推。 你查询的时候,从高地址倒查,找到的第一个非 0xFFFFFFFF 的字,就是最新的记录数。 当第一个扇区写满时,下一笔记录数写到第二个扇区的 0 地址。写入后,删除第一个扇区。当第二扇区写满时,类同。 因此,你查表的方式是: 先查第一扇区首字是否 0xFFFFFFFF。如果是从扇区二倒查最新纪录;否则在本扇区倒查。 查到的最新记录数读入一个内存变量进行维护,可以同时保存最新纪录地址。 其实,并非每新增一条记录就需要改写 Flash 扇区记录。你可以多条再写,比如接收到关机信号时,将内存变量写入 Flash;或者利用其他事件定期检查是否需要写入。 非每记录改写带来的“不可靠”因素,就是丢失当前实际记录数。不过,这个问题很容易解决。在写入新纪录时,首先检查通过记录数变量计算得到的地址处是否 6 个连续的 0xFF。如果是,则没有问题。如果不是,顺序搜索,直至找到真实的空地址,据此更新内存变量中的记录数,并写入 Flash。 另外,即使不在 Flash 中保存记录数,也可以找到优化的开机搜索方法。比如,折半查找。因为 10 万不超过 2 的17 次方,你可以在很少的次数内就找到最后记录了。当然,你也不必折半到底,当区间很小时,就可以顺序查找了。 总之,可以设计很多算法来处理你的问题。关键是开放性的思维。
太谢谢你了,你说得太详细了,真是对我帮助很大的……
of123 2014-09-03
  • 打赏
  • 举报
回复
如果你的权限表存入时,索引号并非是顺序记录进来的,也有办法加快搜索。 (注意到一点,你的索引号 2 字节,它如何对应 1000 条记录?) 假定你所用的卡片索引号实际上是连续的。你可以将权限记录扇区人为分配一下。比如,你想让搜索速度提高 16 倍,就让权限记录按照索引号分区入座。让索引最低半字节为 0 - F 的记录分别写入 16 个不同扇区。这样,当你要查询某一个索引号的权限时,只需到相应的扇区搜索。
of123 2014-09-03
  • 打赏
  • 举报
回复
可以用 2 个扇区来保存记录数。 假定你用 4 字节来表示记录数。你在第一个扇区的 0 地址处记录第一笔记录数,在 4 地址记录第二笔,以此类推。 你查询的时候,从高地址倒查,找到的第一个非 0xFFFFFFFF 的字,就是最新的记录数。 当第一个扇区写满时,下一笔记录数写到第二个扇区的 0 地址。写入后,删除第一个扇区。当第二扇区写满时,类同。 因此,你查表的方式是: 先查第一扇区首字是否 0xFFFFFFFF。如果是从扇区二倒查最新纪录;否则在本扇区倒查。 查到的最新记录数读入一个内存变量进行维护,可以同时保存最新纪录地址。 其实,并非每新增一条记录就需要改写 Flash 扇区记录。你可以多条再写,比如接收到关机信号时,将内存变量写入 Flash;或者利用其他事件定期检查是否需要写入。 非每记录改写带来的“不可靠”因素,就是丢失当前实际记录数。不过,这个问题很容易解决。在写入新纪录时,首先检查通过记录数变量计算得到的地址处是否 6 个连续的 0xFF。如果是,则没有问题。如果不是,顺序搜索,直至找到真实的空地址,据此更新内存变量中的记录数,并写入 Flash。 另外,即使不在 Flash 中保存记录数,也可以找到优化的开机搜索方法。比如,折半查找。因为 10 万不超过 2 的17 次方,你可以在很少的次数内就找到最后记录了。当然,你也不必折半到底,当区间很小时,就可以顺序查找了。 总之,可以设计很多算法来处理你的问题。关键是开放性的思维。
名人堂再聚首 2014-09-03
  • 打赏
  • 举报
回复
引用 9 楼 zhxianbin 的回复:
1. Flash 是按扇区擦除的,所以要按“读 - 改 - 擦除 - 写” 的过程修改数据
谢谢你,Flash的读写我基本了解了,现在主要是像我前面说的如何能快速在Flash中找到自己需要的数据问题,首先要解决在设计时如何存储数据。比如:我的Flash如何存储用户的权限信息(IC卡号+门号),在用户刷卡时能以最快的速度判断当前用户的信息是否在Flash中存在,若存在则开门,否则不开。
名人堂再聚首 2014-09-02
  • 打赏
  • 举报
回复
引用 3 楼 of123 的回复:
他们说的是 Nand Flash。你现在用的是 SPI 接口的 Nor Flash,是支持多次写的。当然,只能将比特 1 写为 0。
嗯,我明白了,太谢谢你了,真是帮了我大忙呢。 我还有些问题想请教你: 1、比如我在Flash中保存了1000条权限信息,当有用户刷卡时如何能快速判断该卡号是否在Flash中有对应的权限信息?因为我发现如果是从头开始一个一个循环读Flash中的权限记录来匹配,数据少还没问题,数据多了话反复读Flash就会变得很慢,不知有没有什么高效的办法或者有什么好的建议?
zhxianbin 2014-09-02
  • 打赏
  • 举报
回复
1. Flash 是按扇区擦除的,所以要按“读 - 改 - 擦除 - 写” 的过程修改数据
of123 2014-09-02
  • 打赏
  • 举报
回复
他们说的是 Nand Flash。你现在用的是 SPI 接口的 Nor Flash,是支持多次写的。当然,只能将比特 1 写为 0。
名人堂再聚首 2014-09-02
  • 打赏
  • 举报
回复
相关的代码如下:

do{
		SPI_FLASH_BufferRead(&temp_swp[0], FLASH_SwipeRecordAddress+i, 3);//从Flash读取刷卡序号
		cnt=((temp_swp[1]&0x0000FF)<<16)|((temp_swp[1]&0x0000FF)<<8)|(temp_swp[0]&0x0000FF);
		if (cnt==0xffffff) {		//如果读取的序号全为0xffffffff则表示刷卡记录已结束
			break;	
		}else if(cnt==0x000000) {	//如果记录序号是0表示是无效的记录(删除标记)
			continue;
		}			
		Swipe_CNT++;	//每读取到一个有效的权限则将全局变量加1		
		i+=16;			//刷卡记录长度为16字节		
	}while(i<=0xD0000-16);
名人堂再聚首 2014-09-02
  • 打赏
  • 举报
回复
当我用循环从Flash地址0开始读取,每次只读取记录的索引号(3个字节),然后下一个循环增加一个记录的长度,也就是16个字节,读取下一个索引号,当读到0xD0000左右时,单片机就死机了。
名人堂再聚首 2014-09-02
  • 打赏
  • 举报
回复
引用 5 楼 of123 的回复:
如果用户索引是连续的,最好不要采用索引和权限两个字段查无序表的方法。因为那样的话你必须遍历所有的记录。 你将索引与相对地址关联。例如,索引号 0 的权限记录在 0 地址,索引号 n 的权限记录在 n 地址。这样的话,你可以直接访问对应的地址。如果索引号或权限字段是全 ff,就表示空记录。如果你的记录不是非常多的话,也开让一个索引号对应一个地址空间内的多个地址,例如地址 4n 的记录都用于索引 n,它就有 4 个备用记录入口了。 总之,有很多以空间换时间的方案。
您好,谢谢你! 我现在的情况是这样的: 1、Flash中需要保存约1000条权限信息,每个权限信息有6个字节(包括索引号,占两个字节); 2、Flash中需要保存约10万条刷卡记录,每条记录信息有16个字节(包括索引号,占3个字节); 我在程序初始化时读取了存储在Flash中的权限总数量和刷卡记录总数量(依次循环读取索引号),然后放在程序的两个全局变量中,我这样做的目的是:当新增权限或新增用户刷卡记录时,可以知道应该将记录保存在Flash的什么位置,例如目前有10个权限,每个权限6字节,再新增一个权限时,就可以计算偏移量:6*10,新的权限记录就可以放在以这个地址作为起始地址的相应的Flash地址中。 但是我发现这样做效率不高,尤其是要获得刷卡记录总数量时,因为最大10万条记录,这样循环根据索引号来读取肯定是不可取的,那可否将总的记录数保存在某个地方,然后每次自动读取就行了,当新增一个刷卡记录时,这个值就加1,删除记录时就减1?我越来越觉得这个过程似乎很复杂。
of123 2014-09-02
  • 打赏
  • 举报
回复
如果用户索引是连续的,最好不要采用索引和权限两个字段查无序表的方法。因为那样的话你必须遍历所有的记录。 你将索引与相对地址关联。例如,索引号 0 的权限记录在 0 地址,索引号 n 的权限记录在 n 地址。这样的话,你可以直接访问对应的地址。如果索引号或权限字段是全 ff,就表示空记录。如果你的记录不是非常多的话,也开让一个索引号对应一个地址空间内的多个地址,例如地址 4n 的记录都用于索引 n,它就有 4 个备用记录入口了。 总之,有很多以空间换时间的方案。
of123 2014-09-01
  • 打赏
  • 举报
回复
不要采用频繁擦除的方式,不仅慢,而且不可靠。因为在你回写中掉电的话,你会丢失信息。另外,频繁地擦,会损失 Flash 的寿命。 可以采取直接写的方式。例如,你设计全 0 的序号为非法序号。当要删除一条记录时,只需将其序号改写为全 0。或者,将全 0 的权限,定义为无任何权限。同样地,在删除权限时,仅仅是将其权限写为全 0。 Flash 是擦除后所有比特变为全 1,写入时可将某些比特写为 0。 只有当你在一个扇区中大多数记录已经无效,且你的记录空间不足时,你才需要进行空间的 merge,即擦除和重用此空间。比较好的做法是,将所有有效记录写到空的记录区,然后擦除“垃圾”扇区。
名人堂再聚首 2014-09-01
  • 打赏
  • 举报
回复
引用 1 楼 of123 的回复:
不要采用频繁擦除的方式,不仅慢,而且不可靠。因为在你回写中掉电的话,你会丢失信息。另外,频繁地擦,会损失 Flash 的寿命。 可以采取直接写的方式。例如,你设计全 0 的序号为非法序号。当要删除一条记录时,只需将其序号改写为全 0。或者,将全 0 的权限,定义为无任何权限。同样地,在删除权限时,仅仅是将其权限写为全 0。 Flash 是擦除后所有比特变为全 1,写入时可将某些比特写为 0。 只有当你在一个扇区中大多数记录已经无效,且你的记录空间不足时,你才需要进行空间的 merge,即擦除和重用此空间。比较好的做法是,将所有有效记录写到空的记录区,然后擦除“垃圾”扇区。
谢谢你的回复!我还是有一个疑问,Flash中的扇区如果写入了数据,比如已经写了很多条权限,现在我要删除其中的一条权限,按你说的方法,就是把这条权限信息写0,可是听论坛上的其他人说Flash如果要执行写操作的话,只是在没有被写过数据的区域写数据时就不用擦除Flash的扇区,如果已经被写过数据的区域再来改写的话是要重新擦除某个扇区的,是不是这样的呢?或者意思是:如果将某个区域全部写0的话就不用擦除Flash的扇区呢?谢谢你!
STM32是由意法半导体(STMicroelectronics)公司推出的基于ARM Cortex-M内核的高性能、低功耗、高性价比32位微控制器系列。自其面世以来,STM32凭借其广泛的适用性和卓越的特性,已成为嵌入式系统设计领域的主流选择之一,广泛应用于工业控制、消费电子、物联网、汽车电子、医疗设备、智能家居等多个领域。 内核与架构 STM32产品线采用了不同版本的ARM Cortex-M内核,包括M0、M0+、M3、M4、M7等,分别对应不同级别的性能需求。这些内核提供单周期乘法、硬件除法、DSP指令集、浮点单元(FPU)等功能,以满足不同应用场景的计算密集型任务需求。处理器架构遵循哈佛结构,具有独立的指令总线和数据总线,确保高效的代码执行和数据访问。 丰富的外设与接口 STM32微控制器集成了丰富的外设资源,以适应各种复杂系统设计。这些外设包括但不限于: 通信接口:如USART、UART、SPI、I2C、CAN、USB(全速/高速)、Ethernet、无线连接模块(如BLE、Wi-Fi)等,用于实现设备间的串行通信和网络连接。 定时器:多种通用定时器、高级定时器、基本定时器以及PWM输出,支持定时、计数、脉冲捕获、电机控制等多种功能。 模拟外设:高精度ADC(模数转换器)、DAC(数模转换器)、比较器、温度传感器等,用于采集和处理模拟信号。 存储器:内置Flash和SRAM,容量从几KB到几MB不等,满足不同应用的数据存储和运行空间需求。部分型号还支持外部存储器接口(如FSMC、Octo-SPI)以扩展存储能力。 安全与保护机制:如加密加速器、安全单元、内存保护单元(MPU)、看狗定时器、时钟安全系统(CSS)等,保障系统安全稳定运行。 开发环境与生态系统 STM32拥有强大的软件支持和生态系统,简化开发流程并加速产品上市时间: 开发工具:官方提供STM32CubeMX初始化配置工具,帮助开发者快速进行项目设置、外设配置及代码生成。此外,还有STM32CubeIDE集成开发环境,集成了编译器、调试器和仿真器支持。 软件库:STM32Cube软件包包含HAL(硬件抽象层)库和LL(低层)库,前者提供跨平台、跨系列的统一API接口,后者直接面向寄存器提供高效访问。同时,还提供各类外设驱动、间件组件(如FreeRTOS、FatFS、LwIP等)以及特定应用框架(如STM32Cube.AI for AI推理)。 社区与资源:ST官方社区、论坛、博客、技术文档、培训材料、应用笔记、用户案例等资源丰富,为开发者提供全方位的技术支持和交流平台。 产品线与封装 STM32产品线按性能、功耗、外设组合等特性划分为多个子系列,如STM32F、STM32L、STM32G、STM32H等,每个子系列下又包含多种型号,以适应不同成本、性能、尺寸和功耗要求。封装形式多样,从小型QFN、LQFP到大型BGA,满足不同应用场景的封装密度和散热需求。 综上所述,STM32微控制器以其强大的内核性能、丰富的外设集成、完善的开发支持和广泛的市场应用,为嵌入式系统设计提供了高度灵活且极具竞争力的解决方案。
STM32是由意法半导体(STMicroelectronics)公司推出的基于ARM Cortex-M内核的高性能、低功耗、高性价比32位微控制器系列。自其面世以来,STM32凭借其广泛的适用性和卓越的特性,已成为嵌入式系统设计领域的主流选择之一,广泛应用于工业控制、消费电子、物联网、汽车电子、医疗设备、智能家居等多个领域。 内核与架构 STM32产品线采用了不同版本的ARM Cortex-M内核,包括M0、M0+、M3、M4、M7等,分别对应不同级别的性能需求。这些内核提供单周期乘法、硬件除法、DSP指令集、浮点单元(FPU)等功能,以满足不同应用场景的计算密集型任务需求。处理器架构遵循哈佛结构,具有独立的指令总线和数据总线,确保高效的代码执行和数据访问。 丰富的外设与接口 STM32微控制器集成了丰富的外设资源,以适应各种复杂系统设计。这些外设包括但不限于: 通信接口:如USART、UART、SPI、I2C、CAN、USB(全速/高速)、Ethernet、无线连接模块(如BLE、Wi-Fi)等,用于实现设备间的串行通信和网络连接。 定时器:多种通用定时器、高级定时器、基本定时器以及PWM输出,支持定时、计数、脉冲捕获、电机控制等多种功能。 模拟外设:高精度ADC(模数转换器)、DAC(数模转换器)、比较器、温度传感器等,用于采集和处理模拟信号。 存储器:内置Flash和SRAM,容量从几KB到几MB不等,满足不同应用的数据存储和运行空间需求。部分型号还支持外部存储器接口(如FSMC、Octo-SPI)以扩展存储能力。 安全与保护机制:如加密加速器、安全单元、内存保护单元(MPU)、看狗定时器、时钟安全系统(CSS)等,保障系统安全稳定运行。 开发环境与生态系统 STM32拥有强大的软件支持和生态系统,简化开发流程并加速产品上市时间: 开发工具:官方提供STM32CubeMX初始化配置工具,帮助开发者快速进行项目设置、外设配置及代码生成。此外,还有STM32CubeIDE集成开发环境,集成了编译器、调试器和仿真器支持。 软件库:STM32Cube软件包包含HAL(硬件抽象层)库和LL(低层)库,前者提供跨平台、跨系列的统一API接口,后者直接面向寄存器提供高效访问。同时,还提供各类外设驱动、间件组件(如FreeRTOS、FatFS、LwIP等)以及特定应用框架(如STM32Cube.AI for AI推理)。 社区与资源:ST官方社区、论坛、博客、技术文档、培训材料、应用笔记、用户案例等资源丰富,为开发者提供全方位的技术支持和交流平台。 产品线与封装 STM32产品线按性能、功耗、外设组合等特性划分为多个子系列,如STM32F、STM32L、STM32G、STM32H等,每个子系列下又包含多种型号,以适应不同成本、性能、尺寸和功耗要求。封装形式多样,从小型QFN、LQFP到大型BGA,满足不同应用场景的封装密度和散热需求。 综上所述,STM32微控制器以其强大的内核性能、丰富的外设集成、完善的开发支持和广泛的市场应用,为嵌入式系统设计提供了高度灵活且极具竞争力的解决方案。
STM32是由意法半导体(STMicroelectronics)公司推出的基于ARM Cortex-M内核的高性能、低功耗、高性价比32位微控制器系列。自其面世以来,STM32凭借其广泛的适用性和卓越的特性,已成为嵌入式系统设计领域的主流选择之一,广泛应用于工业控制、消费电子、物联网、汽车电子、医疗设备、智能家居等多个领域。 内核与架构 STM32产品线采用了不同版本的ARM Cortex-M内核,包括M0、M0+、M3、M4、M7等,分别对应不同级别的性能需求。这些内核提供单周期乘法、硬件除法、DSP指令集、浮点单元(FPU)等功能,以满足不同应用场景的计算密集型任务需求。处理器架构遵循哈佛结构,具有独立的指令总线和数据总线,确保高效的代码执行和数据访问。 丰富的外设与接口 STM32微控制器集成了丰富的外设资源,以适应各种复杂系统设计。这些外设包括但不限于: 通信接口:如USART、UART、SPI、I2C、CAN、USB(全速/高速)、Ethernet、无线连接模块(如BLE、Wi-Fi)等,用于实现设备间的串行通信和网络连接。 定时器:多种通用定时器、高级定时器、基本定时器以及PWM输出,支持定时、计数、脉冲捕获、电机控制等多种功能。 模拟外设:高精度ADC(模数转换器)、DAC(数模转换器)、比较器、温度传感器等,用于采集和处理模拟信号。 存储器:内置Flash和SRAM,容量从几KB到几MB不等,满足不同应用的数据存储和运行空间需求。部分型号还支持外部存储器接口(如FSMC、Octo-SPI)以扩展存储能力。 安全与保护机制:如加密加速器、安全单元、内存保护单元(MPU)、看狗定时器、时钟安全系统(CSS)等,保障系统安全稳定运行。 开发环境与生态系统 STM32拥有强大的软件支持和生态系统,简化开发流程并加速产品上市时间: 开发工具:官方提供STM32CubeMX初始化配置工具,帮助开发者快速进行项目设置、外设配置及代码生成。此外,还有STM32CubeIDE集成开发环境,集成了编译器、调试器和仿真器支持。 软件库:STM32Cube软件包包含HAL(硬件抽象层)库和LL(低层)库,前者提供跨平台、跨系列的统一API接口,后者直接面向寄存器提供高效访问。同时,还提供各类外设驱动、间件组件(如FreeRTOS、FatFS、LwIP等)以及特定应用框架(如STM32Cube.AI for AI推理)。 社区与资源:ST官方社区、论坛、博客、技术文档、培训材料、应用笔记、用户案例等资源丰富,为开发者提供全方位的技术支持和交流平台。 产品线与封装 STM32产品线按性能、功耗、外设组合等特性划分为多个子系列,如STM32F、STM32L、STM32G、STM32H等,每个子系列下又包含多种型号,以适应不同成本、性能、尺寸和功耗要求。封装形式多样,从小型QFN、LQFP到大型BGA,满足不同应用场景的封装密度和散热需求。 综上所述,STM32微控制器以其强大的内核性能、丰富的外设集成、完善的开发支持和广泛的市场应用,为嵌入式系统设计提供了高度灵活且极具竞争力的解决方案。
STM32是由意法半导体(STMicroelectronics)公司推出的基于ARM Cortex-M内核的高性能、低功耗、高性价比32位微控制器系列。自其面世以来,STM32凭借其广泛的适用性和卓越的特性,已成为嵌入式系统设计领域的主流选择之一,广泛应用于工业控制、消费电子、物联网、汽车电子、医疗设备、智能家居等多个领域。 内核与架构 STM32产品线采用了不同版本的ARM Cortex-M内核,包括M0、M0+、M3、M4、M7等,分别对应不同级别的性能需求。这些内核提供单周期乘法、硬件除法、DSP指令集、浮点单元(FPU)等功能,以满足不同应用场景的计算密集型任务需求。处理器架构遵循哈佛结构,具有独立的指令总线和数据总线,确保高效的代码执行和数据访问。 丰富的外设与接口 STM32微控制器集成了丰富的外设资源,以适应各种复杂系统设计。这些外设包括但不限于: 通信接口:如USART、UART、SPI、I2C、CAN、USB(全速/高速)、Ethernet、无线连接模块(如BLE、Wi-Fi)等,用于实现设备间的串行通信和网络连接。 定时器:多种通用定时器、高级定时器、基本定时器以及PWM输出,支持定时、计数、脉冲捕获、电机控制等多种功能。 模拟外设:高精度ADC(模数转换器)、DAC(数模转换器)、比较器、温度传感器等,用于采集和处理模拟信号。 存储器:内置Flash和SRAM,容量从几KB到几MB不等,满足不同应用的数据存储和运行空间需求。部分型号还支持外部存储器接口(如FSMC、Octo-SPI)以扩展存储能力。 安全与保护机制:如加密加速器、安全单元、内存保护单元(MPU)、看狗定时器、时钟安全系统(CSS)等,保障系统安全稳定运行。 开发环境与生态系统 STM32拥有强大的软件支持和生态系统,简化开发流程并加速产品上市时间: 开发工具:官方提供STM32CubeMX初始化配置工具,帮助开发者快速进行项目设置、外设配置及代码生成。此外,还有STM32CubeIDE集成开发环境,集成了编译器、调试器和仿真器支持。 软件库:STM32Cube软件包包含HAL(硬件抽象层)库和LL(低层)库,前者提供跨平台、跨系列的统一API接口,后者直接面向寄存器提供高效访问。同时,还提供各类外设驱动、间件组件(如FreeRTOS、FatFS、LwIP等)以及特定应用框架(如STM32Cube.AI for AI推理)。 社区与资源:ST官方社区、论坛、博客、技术文档、培训材料、应用笔记、用户案例等资源丰富,为开发者提供全方位的技术支持和交流平台。 产品线与封装 STM32产品线按性能、功耗、外设组合等特性划分为多个子系列,如STM32F、STM32L、STM32G、STM32H等,每个子系列下又包含多种型号,以适应不同成本、性能、尺寸和功耗要求。封装形式多样,从小型QFN、LQFP到大型BGA,满足不同应用场景的封装密度和散热需求。 综上所述,STM32微控制器以其强大的内核性能、丰富的外设集成、完善的开发支持和广泛的市场应用,为嵌入式系统设计提供了高度灵活且极具竞争力的解决方案。

27,383

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧