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

【STM32H735G-DK 评测】二、利用LTDC在 LCD 上打印字符串

[复制链接]
patch1582 发布时间:2026-8-21 13:54
STM32H735G-DK 自带 MB1315 子板,上面是 4.3 寸 TFT,分辨率 480×272,RGB565 并行接口,经 CN19 直连 H735IGK6 的 LTDC 外设;背光由 PG15 控制,触摸是 FT5336。
8 `! P: [5 C  G  Z4 R5 x
$ `5 `) J' k$ K+ G/ ]# ~0 @H735 的 LTDC 自带两层图层,可从内部 SRAM/AXI SRAM/SDRAM/OSPI RAM 取显存,显存绝对不能放 DTCM(0x2000_0000 起),LTDC 总线读不到,这是 H735 黑屏第一大坑。8 z& _2 f& ]! @7 j

- y- S" }, Q$ `/ R* n0 g480×272×2Byte ≈ 261KB,H735 内部 AXI SRAM 有 512KB 够用,不必外挂 SDRAM。官方提供两个显示图片的例程,不能显示字符串。
% \' `, G2 B. R
9 D6 H# d4 n3 {+ n: z我要显示字符串,自己配 LTDC是最土的法子,我就是用的这个土法子。调用font12、font16、font24的字模文件,字模数组按 RGB565 写进 framebuf 对应像素偏移,LTDC 自动刷出来。) `1 ?7 y( h( U: a+ @% _( r- I: Z
再main.h文件中要调用不少头文件" H9 O4 T& B3 R1 q" A3 F4 n+ }
#include "stm32h7xx_hal_conf.h"
) |' _3 ^" O: m& F#include "stm32h735g_discovery.h"5 _! g" T1 p: x( r8 h! B3 Z
#include "stm32h7xx_hal_ospi.h"     // ??? include ????! P- ^6 T1 Z( \0 N7 d
#include "stm32h735g_discovery_lcd.h"  z% E" j) T6 E
#include "stm32_lcd.h"   /* UTIL_LCD_* */
- P7 K( Q- M+ S1 n6 {+ e$ v#include "fonts.h"
1 }1 L5 E+ |9 {3 x8 R8 p1 ~; M4 X! ^3 q( b& `! \
定义如下显示字符函数
( H3 p7 I' T* c, F7 \* @; d( `- U7 Y7 [) g* N% Q5 K: F6 E
#define HW_WIDTH    480   // ??????5 O& X8 G; @8 s( g7 J
#define HW_HEIGHT   272   // ??????
; z: n( B+ e( H8 W) Q% x' E#define FB_ADDR     ((uint16_t*)0x24000000)" X7 j5 a5 H) v# G; f5 [2 Z
. ^% f% w9 z, o8 ]
static void draw_pixel_v(uint32_t x, uint32_t y, uint16_t color)7 b' _$ w7 y( G" X' E
{
/ b" G+ c/ T" W2 r' ?/ |int hx = y;                    // ??y ? ??x(0479)
: {2 [$ ?) A* D" ]& d, Jint hy = (HW_HEIGHT - 1) - x;  // ??x ? ??y(??,0271)
+ |, ?+ Y2 l3 Z; Q. gif (hx >= 0 && hx < HW_WIDTH && hy >= 0 && hy < HW_HEIGHT)- q' f; H. @7 K' i# M: _1 r
FB_ADDR[hy * HW_WIDTH + hx] = color;5 D$ G1 }5 ~" e+ C
}4 m5 [. ~& n$ a1 J3 Q) U3 |
/* ---------- ? Font12 ???(????????)---------- */
* ~( Z% }3 j$ m  ^# m5 gstatic void draw_char12_v(uint32_t x, uint32_t y, char c, uint16_t color)  q: _9 Q! V& P% |9 X; B
{
0 j6 a( H, m5 S- I  M) yif (c < 0x20 || c > 0x7E) return;
# L6 W+ ?, u6 _/ @8 \- X' T( }4 r4 q8 \
uint32_t char_index = c - 0x20;0 F6 \& e" i7 G4 a. q4 F
const uint8_t *glyph = &Font12_Table[char_index * 12];
) l: E5 ~2 j: k: F
" `7 O- e0 t0 c3 A4 X2 @9 R# dfor (int row = 0; row < 12; row++) {
! S  l# B/ x- `& }3 h! k    uint8_t bits = glyph[row];+ C! Q4 B* E3 e/ y1 }
    for (int col = 0; col < 7; col++) {" ]  Y1 o& m% @' m# }
        if (bits & (0x80 >> col)) {
2 l7 ~* K. Q+ w* e            draw_pixel_v(x + col, y + row, color);( q# h8 _$ G: ]; I- T
        }
  z- z/ U0 V; Q/ D2 P- d- `2 v4 ~    }3 P+ f( N' h9 G9 n6 z) l
}
/ |! Q0 D. I9 h0 r! Y% t% p}: m$ l' O/ D. r+ ^9 y

8 }# g  ]. u4 X! ^) `! L2 q- }% L/* ---------- ????(??????)---------- */* {; @' C) A" m" N/ O  V
static void draw_string12_v(uint32_t x, uint32_t y, const char *str, uint16_t color)
2 K% K/ P* Q% B$ e+ B& ^$ M) F{/ l* S2 ], u8 M1 G; D: F
int cx = x;% |. L. F2 g- K  g  J
while (*str) {
% e3 R1 e9 Y# K. ?5 ?6 H! F3 cdraw_char12_v(cx, y, *str, color);- s% E9 U# @1 r
cx += 8;  // 7??? + 1??
" B* }9 w$ s, z, S' G3 h% jstr++;9 k. S# L% A- W) h: p  v( C
}  |+ a0 S6 |% v
}( Z5 H/ l' P( H; m8 Z8 d2 x9 M

9 C6 y" H; |  R开始用的font24字符很霸气。每个字符 24 像素高,在 480×272 的屏上几乎占满半行。一行最多塞 20 个字符,但那个视觉冲击力是真的猛:黑底白字,每个笔画粗壮饱满,老远就能看清,三行字占掉 120 像素高度。
: D4 s3 E8 q1 I9 {但信息密度太低。想多打两行,没地方了。24px 的字在 272 像素高的横屏上,顶多塞 十来行 行就到底,而且每行也就几个字。
& r6 ^: P. A! n 81.jpg
  N: o$ ~0 Q. l0 R: p
0 p0 v% Q' c4 _  g5 k1 S! i把 Font24 换成 Font12 的那一刻,屏幕上突然瘦了下来,信息量直接翻倍。12px 的字符在 RGB565 屏上刚好是最漂亮的尺度,后期要把 CoreMark 分数、编译器版本、缓存状态全堆上去,屏面终于有了正经仪表盘的味道。
1 q) f. j- ]9 s/ S横屏 480 宽塞 Font12 可以放 40 个字符,但 272 高也只能放 22 行左右,参数再多就挤不下。横屏时那些短字符串,比如 "Hello World!"也占一行,空置率太高。9 ]/ h  b5 @1 O6 m  N
82.jpg 6 d/ W: z1 T/ A6 |6 n% f
还是得竖屏,屏幕逻辑分辨率变成 272×480。这一转,整个布局逻辑全变了:宽度从 480 缩到 272 → Font12 每行只能放 22 个字符,长字符串必须拆行
) \+ G2 ]9 Z, y3 d+ E/ X/ U高度从 272 拉到 480 → 能放 40 行 Font12 文字,信息纵向展开后节奏感出来了,参数一行一个,像手机上的系统信息页,从上往下扫读,层次分明。
: e/ q- e8 P5 k9 m# @ 83.jpg
) h$ L/ |; ]" |( D竖屏妙啊,嵌入式系统信息天然适合纵向列表。
% J, {/ F1 R- z3 B  ?$ d5 w而且竖屏 272×480 的显存还是 261KB,CPU 不用多干任何活。
  x" |) y- X: H, g+ H% @- a9 [. C( q; ?2 Y  Q2 X- }
小结避坑:) i& \5 U" D& X: i3 M5 P5 n2 d3 L
黑屏只背光亮:九成显存地址在 DTCM,或 PLL3_R 没给 LTDC 时钟,或 PH6 复位脚没拉。1 I: H. u1 b; Y2 G5 N5 o
颜色红蓝反:RGB565 字节序或 R/B 线交换,DMA2D 做 Red/Blue Swap 最快。
0 E, G1 h$ C& Z3 C" b3 \6 h0 I" a字糊成竖条:Layer 窗口大小和显存 stride 不一致(480×2 必须对齐 64 字节 AXI 突发)。
! @) E4 C: J% V2 \- a" e* A
- v: J6 c' c8 J5 y8 i# r
赞 收藏 评论0 发布时间:2026-8-21 13:54

举报

0个回答

所属标签

ST中文论坛活动

即日起开启活动话题入口,之后的活动统一都放在此处,欢迎大家的加入!


最新内容

相似技术帖

官网相关资源

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