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

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

[复制链接]
patch1582 发布时间:2026-8-21 13:54
STM32H735G-DK 自带 MB1315 子板,上面是 4.3 寸 TFT,分辨率 480×272,RGB565 并行接口,经 CN19 直连 H735IGK6 的 LTDC 外设;背光由 PG15 控制,触摸是 FT5336。
1 i- m6 F& S* A+ o- i; S( [3 k; J2 I* E) Z3 H8 O
H735 的 LTDC 自带两层图层,可从内部 SRAM/AXI SRAM/SDRAM/OSPI RAM 取显存,显存绝对不能放 DTCM(0x2000_0000 起),LTDC 总线读不到,这是 H735 黑屏第一大坑。
2 B' D; D3 P5 h' T
3 g# }- ^3 x# o9 ?* v" |6 E1 ^480×272×2Byte ≈ 261KB,H735 内部 AXI SRAM 有 512KB 够用,不必外挂 SDRAM。官方提供两个显示图片的例程,不能显示字符串。
0 C4 r' q9 v  ^8 ?4 H7 t  r- j
4 V9 V# w; z$ a; L我要显示字符串,自己配 LTDC是最土的法子,我就是用的这个土法子。调用font12、font16、font24的字模文件,字模数组按 RGB565 写进 framebuf 对应像素偏移,LTDC 自动刷出来。8 {4 E3 b2 Z; K% w& L
再main.h文件中要调用不少头文件* C" n7 |9 J8 C/ X4 V; f' g
#include "stm32h7xx_hal_conf.h"
( n' X  N5 A- h, {# W6 g#include "stm32h735g_discovery.h"
$ T- A& O% K- B* ~/ Q7 g#include "stm32h7xx_hal_ospi.h"     // ??? include ????  d" ]- U0 A  U" G
#include "stm32h735g_discovery_lcd.h"' G4 y" H9 l* P% a# l
#include "stm32_lcd.h"   /* UTIL_LCD_* */
* o, r9 @6 h, o# b# W0 m#include "fonts.h"( @8 J: H7 n) j

* @8 A7 V# K5 d; I! Q+ Q定义如下显示字符函数
3 a: v' h, W- `) ~. `# q9 j0 N" f2 W5 y! J. w
#define HW_WIDTH    480   // ??????
3 x, {- L1 S9 I2 I3 P#define HW_HEIGHT   272   // ??????
! Y0 K. X: d7 _#define FB_ADDR     ((uint16_t*)0x24000000)# C0 m  v. l% v% {. F3 i9 r
" m; }# M" o0 f8 h: e9 ^
static void draw_pixel_v(uint32_t x, uint32_t y, uint16_t color)
4 @% z/ F: H# _3 H" k& w# v0 v{6 D4 A2 b- |$ X, d) K
int hx = y;                    // ??y ? ??x(0479)
; ~9 [/ u" j; r1 r/ @6 wint hy = (HW_HEIGHT - 1) - x;  // ??x ? ??y(??,0271)
3 g+ u% J! o0 h2 s. i: |, n2 H7 Uif (hx >= 0 && hx < HW_WIDTH && hy >= 0 && hy < HW_HEIGHT)4 b2 R- ~. V4 \- b
FB_ADDR[hy * HW_WIDTH + hx] = color;
5 i& Z8 `, M# D. B2 M" F) E}
* Y( w: T, P3 E2 F+ ^* ?. n/* ---------- ? Font12 ???(????????)---------- */
7 a* H) [8 \1 q; B3 ~/ Hstatic void draw_char12_v(uint32_t x, uint32_t y, char c, uint16_t color)
& m6 Y$ {. N/ b' o" Z{& T- }, Y! D2 I& R/ z
if (c < 0x20 || c > 0x7E) return;
! ?" x/ l4 O" l# F, f& x( a/ U, w' G2 ^* G
uint32_t char_index = c - 0x20;2 L) ]0 X$ M* f# t8 e' J% }
const uint8_t *glyph = &Font12_Table[char_index * 12];
+ W7 y( K. X9 H5 q* k  W! k9 Y8 n3 W( x! f
for (int row = 0; row < 12; row++) {
! Q  Q, L' ]  F- s* H* q- b& v    uint8_t bits = glyph[row];. o8 S, M$ d% {) w
    for (int col = 0; col < 7; col++) {
7 i6 T2 ]1 B" \2 c3 K        if (bits & (0x80 >> col)) {8 O" X$ x& [, T/ _8 e- k" B
            draw_pixel_v(x + col, y + row, color);8 U6 n) S3 L0 n! O
        }
. C5 c9 A) {+ @% @    }
. ]( C# m" P, w3 L$ w}, P; m* T" F9 ?# h1 T% [. a$ E8 N
}
6 W" @& Z% u9 M+ w; n2 y% f
( _: ^( b; b. b6 b. T2 B# z/* ---------- ????(??????)---------- */
3 @+ f0 B3 F9 {: t3 ^" Dstatic void draw_string12_v(uint32_t x, uint32_t y, const char *str, uint16_t color)% C7 k" n9 K' g1 J% \
{
' Y, w2 `3 O% n& I2 w; ^) M( J& Iint cx = x;4 ^, Y+ Y9 E) a
while (*str) {
: ~9 U9 V/ y+ Vdraw_char12_v(cx, y, *str, color);
7 \, _" q. y- [% w& C/ Scx += 8;  // 7??? + 1??
/ Q8 v1 K0 D, f& Q! z; _str++;
3 d$ P1 c, @% ~) S4 p}. f. N& I- p) |/ M9 f
}0 a! }9 f3 _& Y. Q+ s9 k

6 d* Z9 L( O( {: p) T7 v开始用的font24字符很霸气。每个字符 24 像素高,在 480×272 的屏上几乎占满半行。一行最多塞 20 个字符,但那个视觉冲击力是真的猛:黑底白字,每个笔画粗壮饱满,老远就能看清,三行字占掉 120 像素高度。# U' U, E! k6 ~, n5 h
但信息密度太低。想多打两行,没地方了。24px 的字在 272 像素高的横屏上,顶多塞 十来行 行就到底,而且每行也就几个字。
7 Q; [4 D2 y4 p( y+ _2 A 81.jpg
  k* @6 L# q/ P& k. S# E# Q% c
0 h2 E; X% U9 j; b6 q& y把 Font24 换成 Font12 的那一刻,屏幕上突然瘦了下来,信息量直接翻倍。12px 的字符在 RGB565 屏上刚好是最漂亮的尺度,后期要把 CoreMark 分数、编译器版本、缓存状态全堆上去,屏面终于有了正经仪表盘的味道。
( \) i4 ?5 H3 m. Y+ u& }. _: u5 u横屏 480 宽塞 Font12 可以放 40 个字符,但 272 高也只能放 22 行左右,参数再多就挤不下。横屏时那些短字符串,比如 "Hello World!"也占一行,空置率太高。
* k; T8 T' X+ l' k 82.jpg
4 t  C4 h* x6 B8 ]9 A5 f4 b还是得竖屏,屏幕逻辑分辨率变成 272×480。这一转,整个布局逻辑全变了:宽度从 480 缩到 272 → Font12 每行只能放 22 个字符,长字符串必须拆行
9 O+ Q# }. S0 j0 ^1 f高度从 272 拉到 480 → 能放 40 行 Font12 文字,信息纵向展开后节奏感出来了,参数一行一个,像手机上的系统信息页,从上往下扫读,层次分明。
* M2 b& O2 Q, U9 S+ a8 q' S; J 83.jpg
9 G; I2 H- N* s" ~* i) l1 e竖屏妙啊,嵌入式系统信息天然适合纵向列表。* A/ l: Y% r& g+ n8 P. h
而且竖屏 272×480 的显存还是 261KB,CPU 不用多干任何活。
% L& d  X! |, a' g# c
9 M6 c* q& \( ?9 {小结避坑:
3 I2 J) E; H. X: z' D. n黑屏只背光亮:九成显存地址在 DTCM,或 PLL3_R 没给 LTDC 时钟,或 PH6 复位脚没拉。
+ ]2 G& H! b7 k" p0 T1 i- [颜色红蓝反:RGB565 字节序或 R/B 线交换,DMA2D 做 Red/Blue Swap 最快。
0 e/ i" a& z* X: S; Y字糊成竖条:Layer 窗口大小和显存 stride 不一致(480×2 必须对齐 64 字节 AXI 突发)。
- y9 i& [( s% \! m8 h" I" I* ^2 l& s/ d' y
赞 收藏 评论0 发布时间:2026-8-21 13:54

举报

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