• [问题求助] 小熊派开发板串口显示未知USB设备
    USB接口链接到电脑后,在设备管理器中串口驱动显示未知USB设备,这里安装ST-LINK驱动后没有变化将这个进程重启后,仍然无法识别板子连接后图片如上,STLINK处亮黄灯,在其他电脑上均显示未知设备(驱动安装显示成功)
  • [问题求助] 小熊派开发板串口显示未知USB设备
    USB接口链接到电脑后,在设备管理器中串口驱动显示未知USB设备,这里安装ST-LINK驱动后没有变化将这个进程重启后,仍然无法识别板子连接后图片如上,STLINK处亮黄灯,在其他电脑上均显示未知设备(驱动安装显示成功)
  • [问题求助] 【鸿蒙-季产品】如何实现智能牙刷与鸿蒙系统结合
    如何才能实现传统智能牙刷与鸿蒙开发板相连,让云平台能够读取传统智能牙刷上的传感器数据
  • [问题求助] 小熊派开发板小程序选择产品里面设置设备参数设备名称,ID号,设备密钥哪里获取
    【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术探讨] 小熊派 开发板入手展示
    ### 包装盒 ![aiot-bpi-first-1.jpg](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/23/1826373b7omx57leqqmuma.jpg)   ### 主板 ![aiot-bpi-first-2.jpg](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/23/182643jdmlaqc0gjwetx7w.jpg)   ### 扩展版和线缆 ![aiot-bpi-first-3.jpg](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/23/182650salu8jls7kwjrxgk.jpg)   ### AIoT & Bear Pi 收到了活动礼物:小熊派开发板。谢谢社区的加持O(∩_∩)O 未来会探索并分享 bear pi、LiteOS 、HarmonyOS 和 华为云 IoT 的相关知识。   ### 相关链接 [【HDC2021】0基础玩转华为云IoT,更有开发者大礼包等你来拿!](https://bbs.huaweicloud.com/forum/thread-117766-1-1.html) [学习笔记 参加0基础玩转华为云IoT活动](https://bbs.huaweicloud.com/blogs/261492)   --- 欢迎各位同学一起来交流学习心得^_^
  • 小熊派开发板到了,手机支架还没信息
    IoT活动的冲关成功的小熊派开发板到了,一个主板,芯片为STM32L434RCT,一个8266,一个路灯模块。可惜我不会搞硬件。。。。。可我中奖的还有一个手机支架没有信息,不知道其他中奖的小伙伴是不是也一样。
  • [问题求助] 把传感器数据传给LCD屏并显示用什么指令
    把传感器数据传给LCD屏并显示用什么指令
  • [问题求助] 智慧井盖的案例--温度传感器
    烧录成功以后发现这个智慧井盖案例可以检测到温度,不知道这个温度传感器的型号是什么?在小熊派官方给的资料没找到温度传感器的信息。
  • [问题求助] 【BearPi-iot开发板】【SDIO-SDMMC教程】是不是必须要插SD卡才能做这个教程?
    ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/12/1912214e2e95kbu3tbgk5r.png) 这个教程
  • 奖励开发板是什么?
    奖励开发板是什么?
  • [问题求助] bearpi -hm-nano开发板,点亮led代码,编译不通过
    ERROR Unresolved dependencies.//applications/BearPi/BearPi-HM_Nano/sample:app(//build/lite/toolchain:linux_x86_64_riscv32_gcc)  needs //applications/BearPi/BearPi-HM_Nano/sample/my_app:myled(//build/lite/toolchain:linux_x86_64_riscv32_gcc)git下载的源代码,做到b站第二个点亮led实验室编译报错!
  • 流水线的基本原理
    流水线的基本原理流水线作为一种生产管理的模式,对于提高生产效率有着非常大的帮助,最早是兴起于汽车制造厂,现在已在很多的行业得到了广泛的应用。 那在处理器设计当中也借鉴了流水线的概念,以提升性能。今天我们就来看一看流水线处理器是如何设计的。这位老朋友大家还记得吧?他曾经为我们展示过精湛的厨艺。那今天我们就再来欣赏一下他做菜的过程。他做菜分为这么几步,首先是洗菜,然后是切菜,第三步是炒菜,最后是装盘。我们假设这每一步都要花费1分钟,那这位厨师做一道菜就需要4分钟,那如果他总共做四道菜,就需要16分钟。现在呢,他掌勺的这个小餐馆生意非常好,客人很多,但是大家抱怨上菜太慢了,这怎么办呢?而我正好是这个餐馆的老板,我就得思考如何解决这个问题。首先我发现,在我能请得起的厨师当中,这位大厨已经是动作很快的了。所以,我就想从生产管理模式方面做一些改变。 那现在当然是非流水线的操作方式,那如何来改造成流水线的操作。我们先来看一看这个厨房里有哪些用具。我们有洗菜用的水池,切菜用的刀和板,炒菜用的厨具,还有最后装盘的容器。那在刚才那位大厨的工作过程中,在每一个时刻他都只能使用其中的一样,另外三样都是空闲的。那看来从硬性条件来说,是适合改造成流水线的操作了。那我刚才说了,我这是一个小本经营,我没办法供四个厨师分别来做这四件事情,可以从另一个角度来说,如果我雇得起四个这样的大厨,我还不如让他们同时做四道菜呢,没必要这么麻烦,引入什么流水线的操作。那怎么办呢?那我就把这个大厨给解雇了,然后用同样的钱雇来四个人。现在大厨很全能,什么都会干,而新雇的这四位每一位只会干一种工作,那好,现在人员设备配置到位,那我就希望这四个步骤能够流水化地操作起来。 他们每一个人在做完自己手头的工作之后,将完成的成果交给下一个阶段继续进行下一步的操作,当然这样的交接需要一个统一的指挥,所以还得有一个发号施令的人,这个人是不用新雇的。刚才那位大厨每四分钟做完一道菜,所以 这位司号员每四分钟吹一次号,以指挥那位大厨去做下一道菜。而现在我们假设每个步骤和刚才那个大厨工作的方式一样,同样也要花费一分钟的时间,所以这司号员要改成每一分钟吹一次号,流水线上的工作人员每听到号响,就将自己的工作成果转交给下一阶段的人,当然,他必须保证在号响之前,已经顺利地完成了自己的工作。 这个司号员就好比CPU当中的时钟,如果这么来看,那我们现在的时钟频率已经提升为原来的4倍了。那我们就来看一看我们新改造的这个厨房是如何工作的。现在要做的菜单已经送过来了,工作开始。首先第一道菜的原料送到洗菜的环节,这时候后面的各个环节都处于空闲状态,一分钟之后,洗菜完成。第一道菜的原料进入切菜环节,与此同时,第二道菜的原料进入洗菜环节。然后再过了一分钟,第一道菜已经切完了,与此同时,第二道菜也洗完了。当迎来下一次号响的时候,第一道菜就会进入炒菜环节,第二道菜进入切菜环节,同时第三道菜进入洗菜环节,然后再过一分钟。四道菜都进入了流水线当中,这个时候整条流水线的各个环节都开始工作了,那我们就可以说,这个流水线已经被填满了。而之前的这个过程就是填充流水线的过程,那再过一分钟。第一道菜就完成了所有的工序,可以上菜了。而且之后每过一分钟,我们都可以上一道菜。第2道第3道然后是第4道,7分钟后,这四道菜都完成了。那因为我们目前的任务只有四道菜,所以在刚才流水线被填满之后,又经历了一个流水线被排空的过程。当然如果这餐馆的客人很多,源源不断的有要做的菜单送来,那这个流水线就可以一直保持着充满的状态,每分钟都能送出一盘菜来。那我们就来分析一下这个流水线的性能。现在我们采用这样的流水线的方式,做四道菜用了7分钟,平均每道菜用时不到2分钟,而且在流水线填满之后,可以做到每一分钟上一道菜。而之前采用非流水线的方式,是每四分钟才能上一道菜,那如果我们能保证流水线长期处于填满的状况,那现在的性能就可以达到原先的4倍,而我们的硬件资源的投入并没有明显的变化。当然我们要注意的是,采用流水线的方式,虽然可以做到每分钟上一道菜,但是单独针对某一道菜,其实还是需要4分钟,这个时间并没有缩短。那看完了这个厨房的例子,我们再来看一看流水线的原理是如何运用到真实的处理器结构上的。这是我们之前已经构建的单周期的处理器,我们是可以正确地运行一些MIPS的指令的。而MIPS指令的执行,可以分为这样5个步骤。第一步是取指;第二步是译码;第三步是执行;第四步是访存;第五步是回写。相比刚才的结构图,我们做了一点小小的变化,也就把IFU内部的结构进行适度的展开。对照这个图,取指的阶段,就是用PC的值去访问指令存储器,从而得到指令的编码,同时还需要生成PC的更新值。在译码阶段,不仅需要把指令编码进行分解,而且还需要从寄存器堆当中读出所需的寄存器的值。第三步执行,主要在 ALU 当中完成。对于算术逻辑运算指令,就是完成对应的运算;而对于访存指令,则是计算出访存的地址。第四步是访存,对于load指令,是从数据存储器当中读出对应的数据;而对于store指令,则是将数据送到数据存储器当中去;而其他指令在这一步没有实质的操作。最后一步是写回,对于要改写寄存器的指令,在这一步会将数据写入到寄存器堆当中指定的位置。我们要注意的是,虽然分成了这五步,但只是为了便于描述而已。所有的信号都必须要在这条指令执行的过程中保持稳定,例如从PC寄存器送到指令存储器的 这个地址信号,如果在指令执行完成前,它就发生了改变,那指令存储器送出的指令编码(Instruction Word)也就会发生改变,从而造成寄存器堆选取了不同编号的寄存器,送出了不同的值,ALU也可能执行了不同的操作,那这条指令就可能执行错误了。所以,对于单周期处理器来说,这一条指令执行的过程中,所有的信号都是必须要保持稳定的。而我们要进行流水线的改造的话,我们同样也会发现,这不同阶段所用到的硬件资源基本上是相互独立的。如果我们能把指令存储器输出的指令编码事先保存下来,那我们就可以提前更新PC寄存器的值,并用这新的值去指令存储器当中取出一个新的指令,而在取新指令的同时,刚才取出的那条指令的编码就会被分解成不同位域,而寄存器堆也会根据输入送出对应寄存器的内容。所以,跟刚才的流水线原理的分析类似,如果我们想把这些硬件资源充分地利用起来,我们就需要把它拆分成若干个阶段。那在这个电路的结构上要进行拆分,我们就在每一个阶段之间添加上寄存器,这就被称为流水线寄存器,这些寄存器用于保存前一个阶段要向后一个阶段传送的所有的信息。我们还是以取指到译码的这个阶段为例,我们将指令存储器的输出接到一个寄存器上(图中标号2处),那当一个时钟上升沿来临的时候,指令存储器输出的指令编码就会被保存到这个寄存器当中。那么在这个上升沿之后,指令存储器的地址输入(1处)如果发生改变,随之影响的指令存储器的输出,也不会被存到这个寄存器当中去(2处)。所以,在这个时候,我们可以用新的PC来访问这个指令存储器,从而得到下一条指令的二进制编码。而在这个同时,前一条指令的编码已经在这个(2处)流水线寄存器的输出上,并且经过相应的电路,切分成不同的位域。那其中有一个位域就会通过rs连到了寄存器堆,并且选中对应的寄存器,把其中的内容放到busA这根信号上,而这根信号也会被接到一个流水线的寄存器上(3处)。那么当下一个时钟上升沿来临的时候, 当前这条指令所需要的rs寄存器的值,就会被保存到这个(3处)流水线寄存器当中。与此同时,下一条指令的二进制编码也会保存到这个(2处)流水线寄存器中。那么在很短的Clock-to-Q 时间之后,译码阶段所看到的指令的编码(Instruction Word)就已经变成第二条指令了。所以很快,寄存器堆得到的rs的寄存器编号也发生了改变,但是这没有关系,第一条指令所需的寄存器的值已经保存到了这个(3处)流水线寄存器当中,而且在这个时候,也应该会被送到了ALU的输入端(4处)。所以,这样通过添加流水线寄存器,我们就先从大体上把这个单周期处理器改造成了一个流水线的处理器。那我们对这个流水线的处理器进行一些简单的性能分析。比如说我们要执行这么三条指令,我们把时间轴画出来,从0时刻开始,每一格是200ps。那如果是在单周期的处理器上,执行一条指令需要这样五步,也就是取指、译码、执行、访存和写回。假设每个阶段都正好需要200ps,那执行完这条指令,就总共过去了1000ps,然后我们才可以执行第二条指令,又用去1000ps,然后是执行第三条指令,那这样每条指令都需要花1000ps的时间,这个单周期处理器,它的时钟周期就需要被设置为1000ps。从外界看来,这个处理器每1000ps可以完成一条指令。而对于流水线处理器,我们同样来执行这三条指令。先看第一条指令,那要完成这条指令所需要的步骤是一样的,同样也需要这五步,也同样需要花1000ps的时间。但是不同在于,在过去200ps之后,当第一条指令完成了取指阶段,而进入到译码阶段的时候,实际上取指部件已经空闲下来,我们就可以开始第二条指令的取指工作,也就是说第二条指令在此时,已经开始执行了。同样,再过了200ps,第一条指令完成了译码,进入到了执行阶段,这样第二条指令也正好完成了取指,可以进入译码阶段,而此时,第三条指令的取指也可以开始了。这样对一个流水线处理器,虽然一条指令总共也是需要花1000ps,但是每200ps就可以开始执行一条指令,而且当流水线填满之后,每200ps也就可以完成一条指令。所以,对于这样一个流水线处理器,它的时钟周期可以设为200ps。因此,这个处理器的主频就是刚才这个单周期处理器的5倍。当然这只是理想情况,现实中的性能提升幅度并没有这么大, 其中一个原因就是这些新插入的流水线寄存器,它自身也会带来一些新的延迟。我们假设这些寄存器的延迟是50ps,那我们再来看一看这个处理器的性能有什么样的变化。这是刚才没有考虑流水线寄存器延迟的情况下分析的性能表现,那如果我们加上流水线寄存器的延迟,同样还是执行这几条指令,那就需要每隔 250ps 才可以开始一条新的指令。所以,时钟周期应该设为250ps,而且对于每条指令本身来说,需要花1250ps(250*5,5个阶段每阶段时间开销一个时钟周期)才能够完成。在这一点上,是比刚才在单周期处理器还要更慢一些的。因此对于流水线处理器来说,因为各个处理部件可以并行工作,从而可以使得整个程序的执行时间缩短。但是流水线并不会缩短单条指令的执行时间,相反,还会增加这个时间。因此,采用流水线的方式,实际上是提高了指令的吞吐率,从而从整体上缩短了程序的执行时间,提高了系统的性能。
  • [问题求助] 【人体感应产品】为什么连接传感器 下载了网盘的源码 没有反应
    【功能模块】【操作步骤&问题现象】1、连接人体模块后 下载了源码 没有反应2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 用bearpi_HM_nano开发板实现智能井盖入云需要在智慧农业的源码上进行怎样的修改啊
    【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 小熊派+FATFS:存储采集的数据
    >前文: 通过[自制小熊派扩展板——六轴传感器扩展板](https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=121171),我们在小熊派上搭建了六轴传感器模块。 以及获取六轴数据:[小熊派+Mpu6050:获取三轴加速度、三轴陀螺仪数据](https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=121250&page=1&extra=#pid1027241)。 本文,将获取的数据存储于SD卡中,便于后面我们对数据进行分析利用。            # 一、实验准备 ## 1.实验环境 - 小熊派开发板,以及MicroUSB数据线 - 已经完成[小熊派+Mpu6050:获取三轴加速度、三轴陀螺仪数据](https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=121250&page=1&extra=#pid1027241) - 一张SD卡以及读卡器 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202104/15/152352svynhwyvszors1ca.png) ---- ## 2.目标效果 - 初步掌握FATFS文件系统 - 将获取的数据(三轴加速度、三轴陀螺仪)以csv格式存储于SD卡中。 >**Notes**:FatFs是一个通用的文件系统(FAT/exFAT)模块,用于在小型嵌入式系统中实现FAT文件系统。 FatFs 组件的编写遵循ANSI C(C89),完全分离于磁盘 I/O 层,因此不依赖于硬件平台。它可以嵌入到资源有限的微控制器中,如 8051, PIC, AVR, ARM, Z80, RX等等,不需要做任何修改。 # 二、添加SD接口(SD/MMC接口) 在前面获取六轴加速度数据时,我们以及添加了相应的串口调试。因为我们只需要添加对SD卡的相应操作。 MMC的全称是”MultiMediaCard”――所以也通常被叫做”多媒体卡”,是一种小巧大容量的快闪存储卡,特别应用于移动电话和数字影像及其他移动终端中。 **对应的引脚:** ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202104/15/203711myunehgrd6swc2mz.png) **配置SDMMC接口** ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202104/15/203852gob8civqk1jcvx5j.png) **移入FatFs文件系统** 我们使用CubMx工具,会帮我们自动移植相关文件,非常便捷。如果文件只使用英文命名,保持默认即可 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202104/15/2040268fwkm3sysolaragq.png) **最后,生成代码就OK了** ### 工程设置 一些基础的设置,包括工程名、存储位置、工程环境、工程中各个文件的组成 ---- ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202011/23/212548euc6o7cvi4cot4wz.png) ---- ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/31/114727qvkul4oarss1pxdq.png) ---- ### 生成代码 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/31/115001f5olm8dvgsctxvko.png) ---- # 四、FatFs相关操作 对一个文件的操作,不外乎就读、写、改、删除。因为FatFs为我们提供了相应的API. 首先,我们需要定义四个变量: ``` FATFS fs; //FATFS文件系统对象 FRESULT fr; //FATFS API返回值 FIL file; //文件 UINT bw; ``` ### 1.挂载SD卡 ```c fs = f_mount((&fr," ",0); ``` 因为只有一张SD卡或者存储器,因此我们可以不用像电脑一样区分C盘、D盘。同时我们需要判断返回值fs,进而判断是否操作成功。这一点很重要,在此后的操作中为了程序的健壮以及维修,我们都应该判断返回值。 ```c if(fr == FR_OK) { printf("SD card mount ok\r\n"); } else { printf("SD card mount error,please check it\r\n"); } ``` ### 2.打开文件 打开文件时,我们需要注意,是否有此文件。如下其中参数FA_OPEN_ALWAYS的作用为,如果没有此文件,则新建 ```c fr = f_open(&file,"test.txt",FA_OPEN_ALWAYS|FA_WRITE); if(fr == FR_OK) { printf(" ok\r\n"); } else { printf("f_opren error,please check it\r\n"); } ``` ### 3.写入数据 ```c f_write (FIL* fp, const void* buff, UINT btw, UINT* bw) ``` 其中buff就是我们需要写入的数据 ### 4.关闭文件 对文件完成操作后,我们应该养成良好习惯,及时关闭此文件 ```c fr = f_close(&file); if(fr == FR_OK) { printf("f_close ok\r\n"); } else { printf("f_close error,please check it\r\n"); } ``` ### 5.对文件追加内容 如果我们关闭文件后,重新打开并写入,会覆盖原因的数据。 此时有效的方法为,我们将文件指针移到文本最后。FasFs也很贴心的为我们提供了相应函数。 ```c fr = f_open(&file,"StepData.txt",FA_OPEN_ALWAYS|FA_WRITE); //打开文件 FileSize = f_size(&file); //获取文件长度 fr = f_lseek(&file,FileSize);//将指针移到文末 fr=f_write(&file,Mpu6050Data,sizeof(Mpu6050Data),&bw); //写入数据 ``` # 五、保存六轴传感器数据 >为了方便后面数据处理,我们采样CSV格式,即用逗号分隔数据。前面我们以及将六轴传感器数据存储于Mpu6050Data数据中。 ```c MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据 MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪数据 memset(Mpu6050Data,0,sizeof(Mpu6050Data)); sprintf(Mpu6050Data,"%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\n",aacx/8200.0,aacy/8200.0,aacz/8200.0,gyrox/16.4,gyroy/16.4,gyroz/16.4); printf("加速度&陀螺仪:%s\r\n",Mpu6050Data); fr = f_open(&file,"Data.txt",FA_OPEN_ALWAYS|FA_WRITE); FileSize = f_size(&file); fr = f_lseek(&file,FileSize); fr=f_write(&file,Mpu6050Data,sizeof(Mpu6050Data),&bw); fr = f_close(&file); if(fr == FR_OK) { printf("f_close ok\r\n"); HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin); } else { printf("f_close error,please check it\r\n"); } ``` 然后,编译、下载,一气呵成~ # 六、效果展示 首先查看我们的txt文件: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202104/15/21030964k8jgf8zm4nutln.png) 将txt文件更改为csv文件: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202104/15/2102093gvlgcndmf1wzqgt.png) **此时,我们可以将读取的六轴数据连续写入至SD卡。**
总条数:1185 到第
上滑加载中