# multiMeter **Repository Path**: joynchou/multi-meter ## Basic Information - **Project Name**: multiMeter - **Description**: 该项目是一个基于stm32f4的多功能仪表,包括示波器,电压表,电流表,欧姆表 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-06-30 - **Last Updated**: 2023-09-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README /* * @文件描述: * @版本: * @作者:周晨阳 * @Date:2021-08-24 09:02:23 */ 文件夹信息: UCGUI:存放和ucgui驱动相关的文件 USER:存放用户代码 prj:存放keil工程文件 lib:存放官方库文件,基本不会改动 @Date:2021-08-24 09:02:23 分支信息: 这个分支用于移植用于lvgl的中文字库,并创建一些用于灵活更改flash内容的函数 总体规划: 打算移植一个可以使用SD卡的文件系统,将来用于存储一些资源 如图片,字体,等等,还可以用于存储一些记录信息,如波形文件等 文件系统的作用不容小视,有了文件系统才能够装入大量的东西, 否则所有东西都需要写入片内会占用大量的资源 打算从正点原子的例程中移植现有的SD卡文件系统过来 板子的PC2由于输入了负电压导致引脚烧坏,现在这个引脚已经不能用了,后期可能会重新分配引脚 无衰减档的补偿电路好像有问题,仿真发现也会有问题,需要解决 现在已经查到失真的问题了,是示波器的探头没有校准的原因,加上本身电容就有点小,现在加大了一个数量级的电容 并调整了示波器探头,已经不会失真了 现在加了一个限流电阻,也不会突然电流激增了,模拟电路这边就还插一个高速比较器了,其他的基本上都搞好了 现在可能需要改一下采样的方法,现在的方法是没有办法实现预触发的,只有ADC在触发信号来临之前也不断采样, 才能实现真正的预触发 基本上ADC是不能够关掉的,或者说只能在死区关掉 model和view层之间有时候是通过传递结构体指针来实现通信的,也就是说,model和view会同时控制结构体 暂时还不清楚这样做会不会影响耦合性,感觉这样做好像不太好,view层就能直接影响model层,应该是耦合性 增加了,但是如果不这么做的话,我暂时还没有想到其他解决办法,等我想到了怎么解决这个问题后,再看看要不要 改一下程序结构,view还是传递结构体指针过去,但是view层能不能单向控制指针?只读取指针的内容而不可以更改 指针的内容,之前我在java中传递的是对象 展望未来: 未来希望能够将此项目变成一个可以完整使用的仪器,但是现在还有很多问题没有解决 1.F407系列的性能太弱,无法达到目的 2.由于考虑到后期可能需要更换硬件,但此项目有些代码并不是硬件无关的,需要写一个硬件抽象层来完成这个目的 3.需要一个长期的计划表来对此项目进行迭代 4.由于设计上有很多缺陷,缺乏升级的动力 5.很多硬件模块都不是为了便携的目的而制作,且不够美观 整体构思: 现在决定将其变成完全硬件无关的代码 还是继续使用mvp架构,但是由于涉及到不同的硬件,就需要有一层hal来屏蔽不同硬件之间的差异。 其实,在model中大部分代码都是硬件无关的,仅有少数一点代码需要更改, 而driver目录下的文件便是充当HAL的作用,利用这一层来屏蔽不同硬件之间的差别 但是在这之前就需要提前对硬件做出规划,这里打算建立一些虚拟硬件,即HAL, 上层只会调用这些虚拟硬件,而不同的硬件方案只需要适配这层虚拟硬件即可, 这里需要在driver上面再新建一层,HAL层,总体的层级架构从低到高依次为: 硬件->driver->HAL->Model->presenter->view 以上只有硬件和driver会根据不同硬件而改变,其余都是上层建筑,不会因为硬件改变而改变 所以现在就是需要规划出一个hal 然后现在还想弄一个模拟器,但是模拟运行又会遇到很多问题 这里还不知道应该怎么解决 先就到这里吧,不知道该怎么解决了 考虑使用platformIO来模拟不知道能不能行得通。 又或者是用vs2017来编译 但是要考虑是否要在各个驱动中加入宏,来控制是否使用模拟模式 还是使用分支的方式来使用模式模式。 刚才试了一下platformIO,貌似不行,会提示无法上传,也可能是我不知道怎么弄的原因 算了先放放吧 考虑到用宏来控制的话会很复杂,就使用分支来区分 还一个问题是rthread是否还要继续使用 如果要继续使用的话,就需要将rtthread适配到Windows上运行。 如果不用的话,上面的和多线程有关的东西都需要重新适配,也会很麻烦、 综合考虑还是将rtthread移植过来更靠谱一些 功夫不负有心人,还是成功的利用vs2017运行了rtthread,那么这样一来rtthread就可以保留了 就不需要另外使用其他多线程技术了 现在猜测内存开辟失败的原因可能确实是和内存不足有关,当使用到10k左右的时候就会无法继续分配内存, 由于这是动态分配的,所以确实可能是由于内存不足的原因 尝试使用外部ram看看会有什么效果 使用外部ram后,虽然不会出现内存不足的问题,但是会出现内存错误,暂不清楚是什么原因引起,可能是外部sram的读取问题 之前也有过这个问题,读取外部sram出现错误 有可能是在配置外部sram的时候出现了问题 可能和数据建立时间的有关 今天就先到这里 明天试一试修改数据建立时间看看会有什么现象 现在发现有递归调用,如果递归次数过多就会消耗大量的栈空间,就有可能崩溃 找到问题所在了,之前由于使用内置的内存分配函数,导致出现很多问题,现在使用rtthread提供的内存管理函数, 就不会出现死机的情况了,之前错误的原因一直都是内存管理出了问题,现在即使使用外部ram也不会出现错误了 2021/8/22: to free a bad data block: mem: 0x68000938, used flag: 1, magic code: 0x1ea0 to free a bad data block: mem: 0x68000518, used flag: 1, magic code: 0xfff7 lv_mem_alloc: couldn't allocate memory (20 bytes) (in lv_mem.c line #135) msh >to free a bad data block: mem: 0x68000518, used flag: 1, magic code: 0x9ea0 to free a bad data block: mem: 0x68000518, used flag: 1, magic code: 0x1e81 先试试用内部ram会不会出现这个错误 猜测可能是外部ram有坏块之类的 找到错误原因了,是dpi设置成150后就出现这个问题,设置成120后就没有问题了, 猜测可能是代码的作者在写代码的时候没有考虑dpi为其它数值时候的问题, 之前运行mp3demo的时候也有dpi的问题,设置成200就会出错无法分配内存, 暂时不清楚为什么设置过大的dpi会导致内存分配失败,但是现在起码知道了是这个原因引起的 现在发现有时还是会存在内存错误,可能是外置sram存在干扰,比如用手摸着IC就很大可能出问题 @Date:2021-08-25 12:23:23 移植了相关文件,但是由于SD 卡的时钟配置和ADC冲突,现在暂时将就了SD卡的时钟配置, 现在ADC是无法正常使用的 后续将想办法修复这个问题 2022年1月2日 这个项目也快有一年的时间了,现在回看这个项目,发现很多出发点都是有问题的,比如 1.由于性能不够,使用stm32f4系列是肯定无法胜任这个工作的,光是屏幕显示就已经很卡了,加上其他功能就更卡了 2.硬件电路的设计存在缺陷,导致触发电路有问题,无法滤除高频影响,触发器基本上只能提供有限的功能 3.最好不要使用嵌入式GUI,存在诸多不稳定和不确定因素,使用linux+qt的搭配是最好不过的 4.模拟器运行代码和主分支的代码好像有很多不同步的地方,后期考虑将主分支中直接包含模拟器代码,使用宏来区分不同的驱动 5.若要继续开发迭代,就必须重构,不论是硬件还是软件,都需要有很大的升级和改动,否则就无法再做出更好的设计 以下是设想的新的方案: 1.更换嵌入式硬件,使用主流的arm+linux的配置的硬件,能够带有硬件屏幕驱动和opengl的soc最好,或者能够使用android 2.如果使用linux,那么gui就肯定使用qt,如果使用android,就使用android的gui 3.采集电路和触发电路都需要重新设计,不能再使用内置ADC和简易的触发电路,而是要设计新的采集电路和触发电路 4.新设计的电路板和arm的连接也是问题 .... 总的来说,要求总是在不停的上升,不可能真的去实现上述的方案,因为这几乎就是一台完整的示波器的研发过程了 但是可以在理论上进行细节的刻画,至少能够提前预见很多问题,并寻找解决方案 这个项目可以不用再继续研发了,除非哪天有人可以一起制作了,或者真的闲的没事干了,可以在不影响正事的前提下做一做,当作是消遣 另外此项目中的很多代码可以实现复用,可供其他项目使用