【随笔】记第一次项目总结

第一个本来以为会在两个月前结束的项目今天终于算是搞的差不多了,今天得要写一篇文章纪念一下做个总结,不能让这四个月的苦白吃。
【随笔】记第一次项目总结_第1张图片

(一)背景介绍

故事大概是从四个月之前开始的,那时我还一个刚刚考完大一期末考试的还正坐在寝室等分数的一个学生,在那之前我已经学完STM32所有的模块知识,掌握了一定自己书写C代码的能力同时开始入门嵌入式LINUX,在这个时候老师给我发了一个消息,让我去他的实验室干活,我当时一想好事啊,有板子玩,有工资拿,还能学到不少东西干嘛不去,所以直接就去了他的实验室。
去到实验室的第一天,我就开始接到了人生中第一个项目。
起初我对于这个项目是没有什么清楚的概念的,老师一开始也没有跟我说清楚这到底是干啥的,只说这是一个示波器,好吧,那就按示波器去做呗,后来才知道不是示波器,本质上也是个示波器。
首先看一下需求和硬件背景:
大概是这样的,这好像是几年前老师就做过的一个项目,当时是用STM32F1做的MCU,功能模块做的很松散,因为F1的性能有限,很多模块像字库,LCD等都要依靠外部芯片,同时不支持触摸通过一个旋钮控制,UI做的也很抱歉,给我用过一次后感觉相当不友好。大概看了一下源码应该是基于安富来当时提供的BSP库书写的代码。以我当时的水平看了半天也没看懂。
所以现在这个要做的升级主要应该包括以下模块:

  1. 使用更高性能的MCU
  2. 内置字库,当时,还没有想清楚具体怎么做,反正无非两种方案,要么在C代码中打字模,要么做一个SPI字库,干掉外置字库芯片。
  3. 添加触摸屏功能
  4. 升级UI,通过最近非常火的STEMWIN来获得更好的用户体验
  5. 放弃外部LCD芯片,使用STM32内部集成的RGB控制器。

然后就到了选型阶段了,应该选用什么样的MCU的,如果不想从零干起当然得要选一种大家都在用的芯片,至少驱动方面不用全部自己实现。最后选择了F4的HAL库方案,当然在此之前我还尚未接触过HAL库和STMWIN,所以还得好好看一些资料,然后就是长达两个月的板砖之旅。与此同时老师请来了一个硬件工程师,终于开始搞起来了。

(二)那两个月里走过的弯路

起初是没有硬件环境供我调试代码的,因为我自己还没决定选择哪一种方案。当时也是纠结了相当长的一段时间,一方面因为以前那个项目使用了安富来的标准库BSP,同时安富来有DSO示波器开发的经历和教程,但是不好的地方在于,一些关键的功能部件,安富来没有提供,同时网上关于F4的驱动代码以HAL库为主。所以最后选择了正点原子的阿波罗开发板作为DEMO,统一软硬件问题。

驱动问题:

刚开始其实一切还挺顺利的,在正点原子的平台上不太需要考虑驱动的问题,无非就是搬砖吗。
把他的文件系统啊,SDIO啊,内存管理啊,LTDC啊,那是一通复制粘贴,虽然生搬也遇到一些小麻烦,但貌似都不难解决,正点原子也做过EMWIN的移植这个也不难。这个时候对于很多高级一点的驱动自己还半知半解,也给以后买下了很大的隐患。然后就是ADC采集了,这个比较麻烦,正点原子的开发板没有高精度ADC芯片,所以当时就直接拉了个32的内部ADC,自以为驱动就没问题了

UI问题

结合ST公司提供的EMWIN工具箱和WINDOWS下神器一般的开发工具KEIL,本来画起UI来简直爽的不要不要的,可是不幸的是好像老师自己也没有决定要画成什么样,反正我记得自己反反复复好像画了有二十几张,最后都被否掉了,最后终于算是过了UI这一关。

EMWIN死机问题

这个问题是当时遇到的最麻烦最棘手的问题,因为这个问题自己失眠了好几天,当时甚至想到了要放弃STEMWIN这个方案,重新画UI。
这个问题其实一直持续到最近,才算真正得到解决。

  1. 第一次死机
    第一次遇到死机是我在做界面切换的时候,试了几次,稳定的是在做完第四次界面
    连续三天,我在逛各种论坛,发现很多人遇到了同样问题,解决方案各种各样,我就一个一个试呗。
    自己在浏览CSDN的博客上找到了一个解决方案,增大程序堆栈,的确有用,来回三五次至少不会死机了。然后我就没管,就去写界面逻辑去了。

    2.第二次死机
    后来又一次做测试忽然发现还是会死机,这个时候现象表现为复杂界面会在第8到第9次切换死机,简单界面也就十几次,这下自己又抑郁了。
    于是又开始 了自己的论坛之旅,然后好像是在ST公司官网的一个论坛上找到了问题。是我自己对于窗口切换的处理问题。之前没有UI开发的经验根本没有父子窗口,信号这些概念,所以将所有窗口设置为阻塞窗口,同时在每个阻塞窗口的回调函数中去做界面切换。然后就凉了。那现在还是得要重新理一下窗口之间的关系,不在回调函数中做界面切换,通过标志位的方式,然后在主循环中做切换处理。这下情况果然好了许多。几乎就不会出现必然性死机。(当然会有小概率的偶然死机)
    3.第三次死机
    这个问题其实到现在我还没有从根本上解决问题,但是我通过自己的实验,发现有些界面切换容易死机,有些从来不会。于是就想到了曲线救国的方法。不是所有问题非要搞明白,有时候还是佛系一点吧。

    界面中的逻辑问题

    这个问题就太多了,不提了。

然后在此之后我就天真的以为问题结束了,硬件的第一版也做了个差不多了,然后我就赶紧趁板子没到家,赶紧请假回家休息了两周。

硬件上掉的坑

似乎板子上每一个可能遇到的坑都遇到了
【随笔】记第一次项目总结_第2张图片

1.晶振不振

好像这个问题跟我关系不大哦,但是最后好像最惨的还是我,搞了一天最后说是BOOT0 BOOT1没焊,没办法从FLASH启动

2.SDRAM数据出错

写一堆数据进去,读出来就稳定的每个多了一个偏移值,懵逼了半天,然后老师拿出笔算了算,说是高位的地址线虚焊了,好吧A10确实焊虚了。

3.触摸屏无响应

这一次是我的问题,没有好好看芯片手册,上电时序不一样而引起i2c的逻辑地址不一样没有注意,还自己把触摸屏的出厂固件刷没了,之后从网上试了十几张配置表,这个屏幕总是在边角有部分无法检测,最后只能再买一块触摸屏了。

4.ADS芯片驱动

这个好像就没有现成的驱动了,只能自己写了。然而之前因为FSMC没学劳,而这个ADS芯片是FSMC接口的。后来好不容易能采了,可是采集频率高的时候有的点采集不到,波形非常难看。原因有点复杂,因为芯片读信号开的窗口太小,而做轮询非常容易错过窗口,这就凉了,后来采取外部中断法读取才算解决。

感悟

似乎感觉这四个月好像并没有特别去学什么东西,但是 我却感觉这是我入坑以来进步最大的一段时间,从每一IO口,每一次高低电平的变换,系统从零开始被我一点一点的架构,到现在这个项目已经累计写了4万行代码。虽然我知道这4万行代码质量很差,但是经过了这次感觉今后不管遇到什么问题,我都有信心有能力找到解决方案。
不经历苦难永远都无法得到真正的成长,有了第一次,当然会有第二次,一名嵌入式系统架构师的成长之路当然不会一番风顺。
静下心来求知。
归来仍是少年。

你可能感兴趣的:(随笔)