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

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

[复制链接]
patch1582 发布时间:2026-8-21 13:54
STM32H735G-DK 自带 MB1315 子板,上面是 4.3 寸 TFT,分辨率 480×272,RGB565 并行接口,经 CN19 直连 H735IGK6 的 LTDC 外设;背光由 PG15 控制,触摸是 FT5336。
) A& s- q) M' L3 Y4 a+ @" k: Y
9 \% w+ \+ d: @3 EH735 的 LTDC 自带两层图层,可从内部 SRAM/AXI SRAM/SDRAM/OSPI RAM 取显存,显存绝对不能放 DTCM(0x2000_0000 起),LTDC 总线读不到,这是 H735 黑屏第一大坑。/ V7 n2 r% M; D7 a. U% U- W

5 k+ N+ y: R- _+ S  n0 G: W480×272×2Byte ≈ 261KB,H735 内部 AXI SRAM 有 512KB 够用,不必外挂 SDRAM。官方提供两个显示图片的例程,不能显示字符串。
& [9 q; k! E- b# |* ~, z8 q1 J* y' B% O1 i; x( t5 T3 r
我要显示字符串,自己配 LTDC是最土的法子,我就是用的这个土法子。调用font12、font16、font24的字模文件,字模数组按 RGB565 写进 framebuf 对应像素偏移,LTDC 自动刷出来。: k6 x: N+ H5 v/ {
再main.h文件中要调用不少头文件
' C; `9 W# ]9 _! Q4 ~' S+ r* z#include "stm32h7xx_hal_conf.h"
9 H# p( E' G# b( @#include "stm32h735g_discovery.h"4 ]1 E; {2 {5 V( b+ }5 L& q
#include "stm32h7xx_hal_ospi.h"     // ??? include ????
! f+ }6 `( g" o#include "stm32h735g_discovery_lcd.h"( y8 Z) U& u. Q* H7 [
#include "stm32_lcd.h"   /* UTIL_LCD_* */; I# m9 x# N4 ^+ |" B- g
#include "fonts.h"! E7 B1 F. ?" m! m) `, Y# k
6 D5 ?" E0 l. Z0 I5 `
定义如下显示字符函数
6 ~6 P/ _* s; E' R0 H3 y1 D3 y5 x. s+ R* p7 H+ t
#define HW_WIDTH    480   // ??????6 f9 {( ^$ Q8 O# v- D3 }( D8 V
#define HW_HEIGHT   272   // ??????- |6 J( Y1 C+ y6 Q5 S
#define FB_ADDR     ((uint16_t*)0x24000000)6 S( y# Z+ F6 L# q$ N: L+ s

8 C  ~$ G3 T. e" |% T" lstatic void draw_pixel_v(uint32_t x, uint32_t y, uint16_t color)
8 c- U/ A, W/ [. [+ R9 l{
5 f3 F) }  l2 R+ Oint hx = y;                    // ??y ? ??x(0479)  R3 c7 ]1 W! ^5 H. w. X' z/ M" Y
int hy = (HW_HEIGHT - 1) - x;  // ??x ? ??y(??,0271)* e9 ~. O7 G# \, V' v! S/ Y2 j
if (hx >= 0 && hx < HW_WIDTH && hy >= 0 && hy < HW_HEIGHT)" @$ ^% ^. N+ _; Z6 I) E
FB_ADDR[hy * HW_WIDTH + hx] = color;
9 O* z$ c0 y% E- j+ O* N}) p+ Q  w* f' B  f
/* ---------- ? Font12 ???(????????)---------- */) O$ \2 c, m% L4 a8 Y4 D- i
static void draw_char12_v(uint32_t x, uint32_t y, char c, uint16_t color)
# f! B/ s9 {4 p* y7 }{
4 z+ I2 ^6 B3 L7 Qif (c < 0x20 || c > 0x7E) return;" X1 O: B- x% x$ P
- g9 I3 ^2 s* G: H/ R0 v% o
uint32_t char_index = c - 0x20;
5 C9 w* C$ R$ b) q/ r! ^% Q5 Kconst uint8_t *glyph = &Font12_Table[char_index * 12];
/ Y* G6 w( @  l4 {0 q/ C: G& V3 P* ?
* f5 \4 l5 M" K" b3 nfor (int row = 0; row < 12; row++) {: ^) c3 [$ u, ~8 V2 b/ J
    uint8_t bits = glyph[row];; P5 ?# B' d2 A, C6 E9 a- D
    for (int col = 0; col < 7; col++) {
5 l( f) o' E# f" x1 `3 }' h        if (bits & (0x80 >> col)) {
0 r' `- e8 H' M* ^& a2 m: j            draw_pixel_v(x + col, y + row, color);: {8 N/ v4 s3 l) w2 [$ E" U
        }
/ H5 Q. ~. v& h. ]0 j2 D    }' p& Y! c. K! h4 a: p; v8 W
}$ K6 ~& w0 c( R
}2 z0 }1 f* f( t

  n& ?" }, _6 q4 _/* ---------- ????(??????)---------- */# p0 I' Q; d; C1 C( ~. {
static void draw_string12_v(uint32_t x, uint32_t y, const char *str, uint16_t color)3 a* x/ h( Q3 L
{
& d' E0 K- z7 A: i3 |int cx = x;6 S, g' _! }7 o
while (*str) {  I8 J# m3 w5 F
draw_char12_v(cx, y, *str, color);
. S, H: F" `- A, q# tcx += 8;  // 7??? + 1??
( j5 D* `: y) }7 }! u1 Fstr++;* F" h4 i$ W5 H! r
}% C  h- ]* B4 D7 E1 O1 `5 {
}
: {/ K' p5 o# h% l- p, |0 A/ s' L/ P; K6 Y5 e
开始用的font24字符很霸气。每个字符 24 像素高,在 480×272 的屏上几乎占满半行。一行最多塞 20 个字符,但那个视觉冲击力是真的猛:黑底白字,每个笔画粗壮饱满,老远就能看清,三行字占掉 120 像素高度。1 i+ c6 j* i! W
但信息密度太低。想多打两行,没地方了。24px 的字在 272 像素高的横屏上,顶多塞 十来行 行就到底,而且每行也就几个字。
: q/ |' \6 Z4 m5 g7 V* n 81.jpg , y# O/ F3 O0 A1 f* @# q
' E- {( q8 ^& u
把 Font24 换成 Font12 的那一刻,屏幕上突然瘦了下来,信息量直接翻倍。12px 的字符在 RGB565 屏上刚好是最漂亮的尺度,后期要把 CoreMark 分数、编译器版本、缓存状态全堆上去,屏面终于有了正经仪表盘的味道。
: v- w. c& }1 F& \& Z' ?横屏 480 宽塞 Font12 可以放 40 个字符,但 272 高也只能放 22 行左右,参数再多就挤不下。横屏时那些短字符串,比如 "Hello World!"也占一行,空置率太高。
0 m3 L' z$ m& u+ e$ V% \4 N 82.jpg
) L3 C; M6 ^1 o$ f1 n8 X6 }还是得竖屏,屏幕逻辑分辨率变成 272×480。这一转,整个布局逻辑全变了:宽度从 480 缩到 272 → Font12 每行只能放 22 个字符,长字符串必须拆行: M3 N. I+ h: F; T7 j- R
高度从 272 拉到 480 → 能放 40 行 Font12 文字,信息纵向展开后节奏感出来了,参数一行一个,像手机上的系统信息页,从上往下扫读,层次分明。
1 a6 z- C$ [$ s 83.jpg 7 p  w3 D& i- R( e8 R. F! b& G
竖屏妙啊,嵌入式系统信息天然适合纵向列表。- `6 v0 t4 p1 {' n' m
而且竖屏 272×480 的显存还是 261KB,CPU 不用多干任何活。
% U3 a' _$ B% B. Y! S7 ~: D, Q! e, `% T  ^
小结避坑:
: M' q2 P; `: H8 l" H2 ]黑屏只背光亮:九成显存地址在 DTCM,或 PLL3_R 没给 LTDC 时钟,或 PH6 复位脚没拉。
, c6 l7 J9 H" k4 z7 ^) G% c, U0 a颜色红蓝反:RGB565 字节序或 R/B 线交换,DMA2D 做 Red/Blue Swap 最快。) r- z/ @$ ~! z  N3 n9 ?
字糊成竖条:Layer 窗口大小和显存 stride 不一致(480×2 必须对齐 64 字节 AXI 突发)。
# O1 m0 w+ t5 e# i  @( d" q( k& B( l7 g) B$ U
赞 收藏 评论0 发布时间:2026-8-21 13:54

举报

0个回答

所属标签

ST中文论坛活动

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


最新内容

相似技术帖

官网相关资源

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