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

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

[复制链接]
patch1582 发布时间:2026-8-21 13:54
STM32H735G-DK 自带 MB1315 子板,上面是 4.3 寸 TFT,分辨率 480×272,RGB565 并行接口,经 CN19 直连 H735IGK6 的 LTDC 外设;背光由 PG15 控制,触摸是 FT5336。: q) t! c5 Y; [  {$ a) e

& V* i# v1 {, M9 x9 B1 eH735 的 LTDC 自带两层图层,可从内部 SRAM/AXI SRAM/SDRAM/OSPI RAM 取显存,显存绝对不能放 DTCM(0x2000_0000 起),LTDC 总线读不到,这是 H735 黑屏第一大坑。5 q$ ^7 T9 d7 G# x/ i% P% n
" n) F+ |+ ~/ J) v1 x
480×272×2Byte ≈ 261KB,H735 内部 AXI SRAM 有 512KB 够用,不必外挂 SDRAM。官方提供两个显示图片的例程,不能显示字符串。' u) @% ^3 C" C2 h. k' m
2 m5 L& y' z3 F7 ~( d- ~' z% P; N/ |
我要显示字符串,自己配 LTDC是最土的法子,我就是用的这个土法子。调用font12、font16、font24的字模文件,字模数组按 RGB565 写进 framebuf 对应像素偏移,LTDC 自动刷出来。: F1 n1 \9 X: ^2 ^
再main.h文件中要调用不少头文件5 r% P) @+ ?& }4 D, x
#include "stm32h7xx_hal_conf.h"$ H% \! I& r0 V* B
#include "stm32h735g_discovery.h"4 n- A# E( A4 _" \
#include "stm32h7xx_hal_ospi.h"     // ??? include ????
) G7 q1 @3 q) N* ?# D8 a& D7 l; A#include "stm32h735g_discovery_lcd.h"
% @, G* T8 U6 Z- w#include "stm32_lcd.h"   /* UTIL_LCD_* */
$ h- z5 r( n6 \8 R+ E$ j#include "fonts.h"5 r; r4 U* e+ f- ]) m" z9 _1 m$ O# h
( r* i! K. E+ i& \
定义如下显示字符函数
" L, D2 ~1 Y7 Z
3 }* |- n2 k% C8 \3 I& I#define HW_WIDTH    480   // ??????
2 e9 i9 M% {, i$ G#define HW_HEIGHT   272   // ??????2 z/ h* k1 r# X
#define FB_ADDR     ((uint16_t*)0x24000000)
1 r# Z4 x: y8 ]$ }9 |4 @7 }$ O' y1 k1 O1 w; U: N8 X; v
static void draw_pixel_v(uint32_t x, uint32_t y, uint16_t color)$ j4 U  E6 @; ?: b: t' i* a
{
- i2 z: C! d1 C; @int hx = y;                    // ??y ? ??x(0479)- k/ P: \+ J& e! V
int hy = (HW_HEIGHT - 1) - x;  // ??x ? ??y(??,0271)/ [/ e8 p% {% N+ T! f7 z) ?$ u
if (hx >= 0 && hx < HW_WIDTH && hy >= 0 && hy < HW_HEIGHT)
* U* [, h5 ]* y4 y2 m% \) \FB_ADDR[hy * HW_WIDTH + hx] = color;
" }3 E0 ]' l1 c}/ n$ y, f, @' L- f) q: j
/* ---------- ? Font12 ???(????????)---------- */
! ~1 N+ V7 J* R7 ^static void draw_char12_v(uint32_t x, uint32_t y, char c, uint16_t color)
% O2 P5 o$ P3 z- E, B; \{! Y4 u1 f+ l/ E0 L8 a
if (c < 0x20 || c > 0x7E) return;
& J/ h# q; N- K& d! b' x# X5 G# k8 F
uint32_t char_index = c - 0x20;
# O% F0 A+ Y: e4 Dconst uint8_t *glyph = &Font12_Table[char_index * 12];- V$ O) C7 D9 Q3 i& ]* h( `1 [
9 j( n" L/ M6 j. c) ?0 A
for (int row = 0; row < 12; row++) {; w+ V( {) M( ?- p- y) v: M
    uint8_t bits = glyph[row];
& V' Y, Q6 b4 ~; m% K- t    for (int col = 0; col < 7; col++) {
& V' ?% {) l* D2 [2 Z0 {  u        if (bits & (0x80 >> col)) {3 _8 Q6 F$ I: h& l6 u) H- |% @
            draw_pixel_v(x + col, y + row, color);2 i' s- Y% O& G- S
        }# ~" j9 V. Q7 z- O
    }9 @, J2 F# \4 e5 \
}: U& V+ ?3 V( a. V: r5 ~: O! j7 x; n
}
: |6 n! |9 E2 ?# W; o2 {5 f( Y/ r# Q0 T8 d' {
/* ---------- ????(??????)---------- */
* y: k' e! t. }) {static void draw_string12_v(uint32_t x, uint32_t y, const char *str, uint16_t color)8 P7 F5 T* `" v* O
{4 J3 z3 e% v: `) g; a
int cx = x;
( D! X, n+ O6 m$ _  _9 ^- Swhile (*str) {+ P: p7 [& q! n$ T; J; d
draw_char12_v(cx, y, *str, color);8 |3 s  o& N- n
cx += 8;  // 7??? + 1??. n, m5 @  M5 `2 s% `
str++;$ S2 ]  c  I) C) v; A; w
}+ d% r4 h* C7 p2 b) }- n
}
( j' X2 d% Q- ^! R5 P" \  T7 H3 K/ w8 a
开始用的font24字符很霸气。每个字符 24 像素高,在 480×272 的屏上几乎占满半行。一行最多塞 20 个字符,但那个视觉冲击力是真的猛:黑底白字,每个笔画粗壮饱满,老远就能看清,三行字占掉 120 像素高度。
7 e$ E6 p; f+ ]但信息密度太低。想多打两行,没地方了。24px 的字在 272 像素高的横屏上,顶多塞 十来行 行就到底,而且每行也就几个字。
0 B3 r# o8 {+ x& f) x5 q 81.jpg
' U! m; y+ ~. Y
2 U) g# G& P9 Z; g把 Font24 换成 Font12 的那一刻,屏幕上突然瘦了下来,信息量直接翻倍。12px 的字符在 RGB565 屏上刚好是最漂亮的尺度,后期要把 CoreMark 分数、编译器版本、缓存状态全堆上去,屏面终于有了正经仪表盘的味道。
- S2 @- p. K7 f横屏 480 宽塞 Font12 可以放 40 个字符,但 272 高也只能放 22 行左右,参数再多就挤不下。横屏时那些短字符串,比如 "Hello World!"也占一行,空置率太高。
* {" s: r- R; W7 q- R 82.jpg
1 {- o) c# @  p& c6 b: r还是得竖屏,屏幕逻辑分辨率变成 272×480。这一转,整个布局逻辑全变了:宽度从 480 缩到 272 → Font12 每行只能放 22 个字符,长字符串必须拆行. m+ P; b0 D  _
高度从 272 拉到 480 → 能放 40 行 Font12 文字,信息纵向展开后节奏感出来了,参数一行一个,像手机上的系统信息页,从上往下扫读,层次分明。
& q6 C9 ?  D, d9 c, W1 r 83.jpg * Z7 U1 Q' ~$ \4 _& e1 T6 ^
竖屏妙啊,嵌入式系统信息天然适合纵向列表。
4 M  W8 @# j! Q) Z7 R. @而且竖屏 272×480 的显存还是 261KB,CPU 不用多干任何活。
  X3 j; k7 I. W9 v* x0 o5 j
: B3 h8 Y4 ^5 }. @% t' ^小结避坑:. Q$ W% R& ?6 K0 R, d' d7 G
黑屏只背光亮:九成显存地址在 DTCM,或 PLL3_R 没给 LTDC 时钟,或 PH6 复位脚没拉。+ K' R8 C. T6 c4 Y/ i
颜色红蓝反:RGB565 字节序或 R/B 线交换,DMA2D 做 Red/Blue Swap 最快。
& g7 |% V, t8 i# L& d字糊成竖条:Layer 窗口大小和显存 stride 不一致(480×2 必须对齐 64 字节 AXI 突发)。) u/ Y$ ~( m) s- a$ e2 A9 [" N# V
9 i9 D* c$ |. p1 @
赞 收藏 评论0 发布时间:2026-8-21 13:54

举报

0个回答

所属标签

ST中文论坛活动

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


最新内容

相似技术帖

官网相关资源

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