你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32将 framebuffer 保存为图片来检查内容

[复制链接]
STMCU小助手 发布时间:2023-6-18 10:26
1. 前言3 a7 i, P. Q2 _+ ?0 n
客户在做 GUI 项目开发时,会碰到许多显示相关的问题。而屏幕花屏是比较严重的问题,如果产品出现花屏,会严重影响使用体验。正常的 UI 显示,包括画图和将帧缓冲传输到屏幕两个过程。如果画图过程出错,那帧缓冲的内容就不对了,传输到屏幕后显示也不对。而如果画图过程正确,而传输过程出错,虽然帧缓冲的内容是对的,而屏幕接收到的数据出错了,那屏幕显示的内容自然也是错误的。因此在定位显示错乱、花屏等问题时,需要先判断是画图出错还是传输过程出错。本文会介绍一种方法,将帧缓冲内容导出并保存为图片,来判断帧缓冲内容是否正确。
4 I9 M& j0 L# ^% P由于帧缓冲的内容为全部像素的 RGB 数据,在导出后需要借助其它工具将 RGB 数据转换为图片,方便在 PC 上直接查看。这里可以使用 python 的 pillow 包,将 RGB 转换为JPG 图片。而读取帧缓冲的过程可以借助 python 的 pyswd 包来实现。 本机环境:Windows10 64bit, ~& H! r/ b& x9 }4 x1 j
安装 python 3.9.0 (测试过 3.9.6 正常),检查系统环境变量,将 python 添加到 Path中。
1 ]) m5 p: Z6 V; M7 b
# w  U; O  L2 j7 r  O+ Z- [0 s图1.设置环境变量3 `3 D$ I( w4 ~; U5 c6 V7 x( P4 O) |: a
Z3PW0JX6T}0GU_842(IJC52.png 0 N* c- U* I; n9 z
# f3 k) x1 p6 ?
1 X; o( l7 h$ A' _
3. 将帧缓冲保存为图片# Q) U4 N+ r$ t/ ]% A1 d( W2 P
3.1. 读取帧缓冲7 m, I6 m, k0 @) Q+ o
通过 pyswd,可以创建 stlink 对象连接到目标板,用 read_mem 函数来读取目标板内存。6 v: G4 G. {6 R+ \, P; C
3.2. 保存图片' h+ r% B1 I0 {' S6 i; G4 z, ?0 t
从 Pillow 包导入 Image 类,创建图片对象,将 pyswd 读取的 framebuffer 数据填充到 image 对象中并保存实现代码如下,保存为 pyswd_rgb2jpg.py 文件。
. D% }# _" S# Z1 t
" G4 m2 {/ [5 N. b  ?% U8 f

! p7 E1 N1 o7 H5 j
  1. #!/usr/bin/env python( G' ]2 L9 d* [
  2. # pyswd_rgb2jpg.py fb_addr width hight bpp output_name
    + l, G# c0 @! q  z8 q; ]
  3. # pyswd_rgb2jpg.py 0x20000090 390 390 3 abc.jpg; P# y) [6 v- v- f7 d4 p) x. N! D; j
  4. import swd* i4 v; j# {0 q6 Z+ X7 V4 ?
  5. from PIL import Image* r; ^6 c& ^1 c" p9 y0 j9 V
  6. #from io import BytesIO( t; p" p1 O7 G
  7. import sys
    6 p- c& l  c- V1 t* Z
  8. w = int(sys.argv[2]) #390
    : ~* \7 B% {4 {% }, C7 W
  9. h = int(sys.argv[3]) #390: P( N: R. f) X/ {* |
  10. bpp = int(sys.argv[4])3 _+ C6 g3 h* B  m
  11. size = w * h * bpp #RGB565/RGB888
    - K# m) A( c, d0 r/ [/ V
  12. fb_addr = int(sys.argv[1], 16) #hex
    & l3 Z& H) U- |8 e3 }! P
  13. dev = swd.Stlink(swd_frequency=1800000, logger=None)
      L3 L# S7 I& u0 H! g+ E
  14. im_data = dev.read_mem(fb_addr, size)* N7 }! X$ j7 W, X: c+ |
  15. im_list = list(im_data)3 C# u3 H4 ]6 c, Y# Y4 v
  16. ## test rgb565.dta file, RGB offset = 16* t- @. h3 E$ w
  17. ## pyswd_rgb2jpg.py rgb565.dta 100 100 2 rgb565.jpg7 y: U6 z) K5 W
  18. #with open(sys.argv[1], 'rb') as f:
    7 g" k1 @0 X8 X* Z. O6 z
  19. # f.seek(16), h8 h$ G+ @3 v0 m
  20. # data = f.read()- m  B+ J; ^/ \* z
  21. # #print(data)
    " F1 t& h/ e% M7 W  s
  22. #im_list = list(data)
    & r' Q+ u  i0 H6 z% K2 [0 p9 I
  23. im = Image.new("RGB", (w, h))' i- Y1 ~* B2 ~' a1 [/ i! \
  24. if bpp == 3:
    8 Y' h0 o4 e5 u2 K4 V3 h5 w$ z
  25. for j in range(0, h):
    7 g6 c  T3 A# x7 c. b& {
  26. for i in range(0, w):  l* v% R. a, w
  27. im.putpixel((i, j), (im_list[(w*j + i)*bpp + 2], im_list[(w*j + i)*bpp + 1], im_list[(w*j + i)*bpp]))1 u- s6 |( J5 k
  28. elif bpp == 2:
    4 d8 ?8 r' k. N3 P
  29. for j in range(0, h):0 `# U3 p4 `) a3 L! `9 J2 w( x
  30. for i in range(0, w):4 S% I8 p! P- Z1 t( R$ _
  31. r = im_list[(w*j + i)*bpp + 1] >> 3
    2 W, r2 T$ [! d4 L
  32. g = ((im_list[(w*j + i)*bpp + 1] & 0x07) << 3) | (im_list[(w*j + i)*bpp] >> 5)
    # }5 C: `' F  _7 C6 N9 ^7 C  A3 Y8 g
  33. b = im_list[(w*j + i)*bpp] & 0x1f
    2 t8 U' X0 C2 e
  34. r = round((r * 255) / 31.0)
    ' _: Q: I7 j- p3 _
  35. g = round((g * 255) / 63.0); t1 Q2 K  d. `/ N: J( k
  36. b = round((b * 255) / 31.0)
    2 {. E, M. o2 K; Z
  37. im.putpixel((i, j), (r, g, b))
    6 D: \7 B4 U. h7 b1 c
  38. #print("%02x %02x %02x" %(r, g, b))' I2 [4 j/ B# R+ s+ {; g; f" C+ z2 y
  39. else:" J( ~) @8 O6 K1 b+ G" ^% D
  40. print("bpp error")( X, k2 m& O5 |! L% p. Y6 a
  41. im.save(sys.argv[5])
复制代码

* l8 y4 {" G: H# S* }: @1 m完整版请查看:附件
7 w+ t, t. K& Q6 z+ e0 z: P* m% j7 B
将framebuffer保存成图片来检查其内容是否正常_v1.0.pdf (450.27 KB, 下载次数: 2)
赞 收藏 评论1 发布时间:2023-6-18 10:26

举报

1个回答
STMWoodData 回答时间:2023-6-19 17:16:52

学习学习

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版