前段时间自己做了一套M910X的亚克力外壳,设计之初考虑到侧面能够添加自己的副屏,再加上曾做过点阵RGB,于是也设置了防止RGB点阵的位置。最初的想法是在这个设备上显示视频,但是刷新率太低了,没有做到 24fps ,放弃了显示视频,转而用了一个简单的PC机副屏,显示一些电脑性能信息,比如CPU频率,内存使用情况,硬盘使用情况,网络情况等等。另外这个副屏外面还做了一圈 RGB。
这个副屏由这几个部分组成,四块 SPI ST7735 屏幕(160*128*4)和一圈ws2812b 灯珠组成,主控是 STM32F103C8T6 和 ESP8266组成。stm32 主要作用是控制屏幕刷新和点亮 RGB ,esp8266 主要作用是通过串口发送 json 数据,让 STM32 解析显示。
这个副屏由这几个部分组成,四块 SPI ST7735 屏幕(160*128*4)和一圈ws2812b 灯珠组成,主控是 STM32F103C8T6 和 ESP8266组成。stm32 主要作用是控制屏幕刷新和点亮 RGB ,esp8266 主要作用是通过串口发送 json 数据,让 STM32 解析显示。
下面是副屏
硬件部分
SPI ST7735这部分硬件设计,四块屏幕共用一组SPI,通过不同的CS来控制不同的屏幕显示。原本有做背光控制,但是买回来的屏幕上电后背光默认开启,有面有空再研究研究啥情况。
layout
3D 图
关于背光控制电路
背光控制需要使用pwm调光,买回来的屏幕问了客服说不支持调光,我看了下lcd的板子,上面的背光电路被强行打开了,所以调不了。重新返工屏上线路后如下图,左侧是修改前,右侧是修改后 + 板上电路。将R148
与3V3
断开,BLK
引脚连接主板控制引脚。当BL_CTRL_PWM
为低电平时 ,有压差导通,BLK
信号高电平。裸屏背光信号BL
与GND
导通,有电流流过,背光亮,反之背光暗。
软件部分
时序设计
第一次做时序打算使用GPIO外部中断,但实际测试,想用GPIO外部中断,发现中断触发时序概率性错乱导致卡死,所以换成了串口中断。
这是条失败的路
下面讲成功的时序
时序总图
时序大概是这样:
- 8266:上电初始化->连接WiFi->主循环侦测UDP连接
- STM32: 上电初始化->打开串口中断->进入主循环显示
调试过程
上电瞬间及初始化
此处解决8266上电过程中串口有段杂波干扰STM32串口接收
上电瞬间ESP8266串口会有一小段杂波,最初做GPIO外部中断就是为了避免这部分,但是最终想了很多办法没有解决。如下图D1通道,前面一小段就是杂波。右边的两小段下拉是连接Wi-Fi时发送的数据.
。
这里是初始化HAL库函数和四块屏幕后,进入while循环前的代码,可以看到右侧2处D1和D0通道就是串口中断产生的结果,由于一次直接收一个字符,所以把异常数据都挤掉了。猜测1处可能是拉高后打开了 串口中断,进入中断后又被拉低了。
下面是中断放大后的时序图以及对应的代码,高电平一直触发单个字节接收中断。
1 | /* 高电平 接收数据 */ |
串口中断部分
这是串口中断部分时序
串口中断代码片段
1 | /**************************************************************************** |
下面是三个串口数据发送过程
第一步
获取
预发送长度为1045长度的字符串,1045的长度为4,这里指的就是4
ESP8266 拉低 GPIO6 做准备,接着ESP8266发送串口数据触发STM32串口中断。
第二步:
获取
上一步完成接收进入中断,STM32拉高GPIO7,进入阻塞串口接收,此时ESP8266(串口中断放大图2)ESP8266等待100ms后发送数据长度,STM32接收完成拉高GPIO7,ESP8266退出死循环进入下一步发送数据内容。STM32退出中断前打开串口中断,准备接收数据。
对ESP8266应代码如下,等待GPIO7被拉高。
1 | // 打印长度 尾部带有\r |
第三步:
获取
上一步GPIO7被拉高后,ESP8266发送数据内容,STM32进入串口中断,识别到GPIO7为高,拉低GPIO7,打开串口中断,STM32准备接收下一次数据长度的长度。
时序设计部分到这里就结束了。
UI
UI部分是直接使用st7735驱动中自带的,简单做了下,自己做的部分主要是换字体,换成了霞鹜文楷等宽。这部分我没有去看具体显示文本的流程,暂时阶段是能用就行。
关于图像显示,我在Image转RGB565工具放了两个摁钮,可以将RGB图像转成RGB565的字符串,目前颜色部分好像还是有点问题(原本蓝色在屏上会显示出绿色),但是基本形状是正确的。
久违的代码激情占用了几乎所有的时间,后面的慢慢更新固件吧,第一次做了一个完整的双主控项目。其实一个PC机也是如此,CPU是主控,微控制器也是主控,较老的机型还分南北桥,相互访问的桥梁就是PCB上的电路。说起来PC很复杂,但也很简单。
公元2024年了,科技越来越进步,我想,CPU的终极形态是将一切的一切集成起来吧,ssd,内存,显卡,wifi等等外设,也不知道那是硬件工程师会不会失业哈哈哈哈哈哈哈。也许想得太多太远,当下还应好好进步,在深度学习和智能AI的时代,layout可能会被替代,那时会不会机器人能自建工厂自行组装呢。。。就好像生物的繁衍一样。。。