上一篇用 GFXTIM 给 OLED 打节拍,点亮了屏幕。这次琢磨着再添加个外设,这款板子还有个网口虽然百兆,对单片机小应用来说还是够够的。目标是保留之前的ADC采集内部温度,串口打印,OLED刷屏,然后使用NetX 网络协议栈做个网页端的监控界面。能够显示OLED上的界面,还能控制LED。
) u' P7 \) ~$ I3 i, j 但是NetX Duo是需要开启ThreadX才能使用的,在NetX的代码里需要调用任务创建功能,而且socket里遇到的阻塞也都要使用RTOS的时间和信号量来同步,所以CubeMX直接打开软件包。; o) H, T- R: l; y
2 J; L8 J6 c; e+ f' c
* U+ |8 i( }; I8 F/ G* a8 `! L- a+ h
9 r- e2 s/ `! \2 S
以上还不够,需要自己补充PHY驱动接口,这个从演示包里取,里面挺多资源的。% j w/ l# `+ \! Z4 b# h( J) s
# }2 b$ W3 {1 D1 [, s, {! `4 S1 q# G2 k# W! S) ?& F; s* Z1 |
8 `7 Z4 K# v# v" r5 ?% t5 W 7C131 是 LAN8742A 的身份证。读到了说明 MDIO 通、PHY 有电、复位正常;读到 FFFF 就是管理引脚或者时钟的问题;读到 ID 但没有 link,那就是网线或者对端的问题: O: P5 ^. b: x4 F( N6 v
- net: phy@0 id=0007C131 bsr=796D link autoneg-done 100M
复制代码 还有自己挖的一个坑就是system tick 没有修改为常用的1000Hz,默认的是100哦,导致协议栈像卡死一样。好在宏定义修改一下就行% W5 O- l# K/ g5 D. U
- #define TX_TIMER_TICKS_PER_SECOND 1006 T2 U; {4 w6 O" V2 x) Q6 r9 W- ~
- #define APP_TICKS(ms) ((ULONG)(((uint32_t)(ms) * TX_TIMER_TICKS_PER_SECOND) / 1000u))
复制代码 还要注意的是创建了多个任务,要特别注意网络相关任务的优先级。准备资源的任务要优先级配置低一点。
. B# o5 }6 |) T9 P M- P 不擅长的地方就是web页面的编写,这个毋庸置疑需要AI复制,交互层面一下几个
3 C4 U4 e% c2 |9 i" C- h. E- GET / 10 KB 单页仪表盘(编译进 Flash 的 C 数组)/ Q8 w. X2 T; ^9 L3 L9 e5 X
- GET /api/status 全部状态 JSON2 v# }3 [ M: ?9 U9 x, \& ?
- GET /api/led?toggle=1 点灯* v3 d; _' t& e; V. H/ g9 R% r/ a" E
- GET /api/fb 1024 字节显存原始数据
复制代码 刷屏的缓冲区传给浏览器,html中按位还原到canvas,实际效果挺好。web画oled的函数
, N6 Q' k5 S3 Z ]. U J* N* b - function drawOled(b){, W: b$ X: f1 a8 ^9 s! d
- for (let p=0;p<8;p++){
: x0 L, M) i' C5 y" c - for (let x=0;x<128;x++){
! `9 m x6 n, e - const v = b[p*128+x];. g9 ]# ]9 z4 K3 Q; _% c% s3 W7 `) k
- for (let bit=0;bit<8;bit++){
, d& V2 s F0 k6 b+ K- U& C# i& w, \ - const on = (v >> bit) & 1;
, T+ P4 r: W: d6 e a' V - const i = ((p*8+bit)*128 + x) * 4;' o/ m h! P5 z3 V* _3 H
- img.data[i] = on ? 150 : 4;
% }/ o2 b M( s% L& @* f - img.data[i+1] = on ? 240 : 10;* E/ m- ^$ z' B# e6 T8 a
- img.data[i+2] = on ? 255 : 18;9 R8 Y) C; h. I
- img.data[i+3] = 255;" n: s. I; S! x
- }
6 ^% H6 G: T& ]) i$ k+ E4 U6 d - }' }* I, A$ j, t$ V/ ~7 E' p
- }
' o! Q+ g/ e6 b! Q1 _, d - ox.putImageData(img, 0, 0);
+ f5 L n' c d1 V6 Y; E - }
9 l; C' n6 q7 B" v3 F# i& {7 \4 O
复制代码
, i# s' `8 N/ T# A* ~' f3 x: _+ s
' A- r5 U) f' z! _ GFXTIM仍然可以保证屏幕的刷新不受影响,跑了一端时间,网卡连接很稳,不光是NetX牛逼,H5这个处理器也牛。8 q* _7 w3 w/ j& y3 Z
/ K, O" K, Z' N% n+ L3 r: T 芯片温度也还是30度的水平,仅比不加屏幕和网络时平均高出3度。最后还得附上实拍
& T% _+ ?( _; z5 a
; h7 c$ C; Q6 Y/ w
$ P( z! O( o7 _& W2 |$ p: c( w8 B" V+ c4 e% ]2 k1 u) E
|