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

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

[复制链接]
patch1582 发布时间:2026-8-21 13:54
STM32H735G-DK 自带 MB1315 子板,上面是 4.3 寸 TFT,分辨率 480×272,RGB565 并行接口,经 CN19 直连 H735IGK6 的 LTDC 外设;背光由 PG15 控制,触摸是 FT5336。
" K& q+ d' K# [' a  o% S( m/ J6 F% c
H735 的 LTDC 自带两层图层,可从内部 SRAM/AXI SRAM/SDRAM/OSPI RAM 取显存,显存绝对不能放 DTCM(0x2000_0000 起),LTDC 总线读不到,这是 H735 黑屏第一大坑。
. X, u% N; O; X6 g8 ]5 S8 Z4 |: C  N: n0 b2 O# o0 q
480×272×2Byte ≈ 261KB,H735 内部 AXI SRAM 有 512KB 够用,不必外挂 SDRAM。官方提供两个显示图片的例程,不能显示字符串。
) @* d# H9 p. U& |3 a9 R# s9 j
# C+ S' d/ Q+ Y. n我要显示字符串,自己配 LTDC是最土的法子,我就是用的这个土法子。调用font12、font16、font24的字模文件,字模数组按 RGB565 写进 framebuf 对应像素偏移,LTDC 自动刷出来。! n- ^1 a7 Y( ]* H+ k
再main.h文件中要调用不少头文件/ y: t* m; M- T  r9 t
#include "stm32h7xx_hal_conf.h"$ A! u* }( k. X$ b
#include "stm32h735g_discovery.h"8 J: e8 C; X) i; ?7 F# [
#include "stm32h7xx_hal_ospi.h"     // ??? include ????2 P/ C* `( f( V, S7 v' l
#include "stm32h735g_discovery_lcd.h"+ t1 Z, B. U+ I7 d9 U
#include "stm32_lcd.h"   /* UTIL_LCD_* */# g9 X) q* B% y- Q1 e
#include "fonts.h"9 A8 D8 q2 k0 D+ m0 o$ }/ {
& @/ U+ y6 I( y; e& D) W) G
定义如下显示字符函数
  M  \2 ~; p8 n8 \$ c+ y* W/ T( @# Y; O% q+ r5 L
#define HW_WIDTH    480   // ??????
6 j: H# i7 ?5 p. T9 t2 i#define HW_HEIGHT   272   // ??????
: Y: U1 b8 O( ^) [# t- n#define FB_ADDR     ((uint16_t*)0x24000000)
3 I# x. o* B3 S8 ]6 E: `' J% }- R! n% I
static void draw_pixel_v(uint32_t x, uint32_t y, uint16_t color)* x( ^6 F" q; H7 [- Y; C& C% ?
{
  Z" x5 \7 i& m( vint hx = y;                    // ??y ? ??x(0479)
+ F' @+ M0 H+ H% z2 uint hy = (HW_HEIGHT - 1) - x;  // ??x ? ??y(??,0271)1 t: s$ z+ U& q2 j3 i
if (hx >= 0 && hx < HW_WIDTH && hy >= 0 && hy < HW_HEIGHT)
" L* D8 |/ `' wFB_ADDR[hy * HW_WIDTH + hx] = color;
: N+ Z8 M1 G3 P- M' g3 y$ C}
. O) V5 U1 |' H% _* I4 ~+ ?) d/* ---------- ? Font12 ???(????????)---------- */# D! v1 q: G$ y. h( Z) g
static void draw_char12_v(uint32_t x, uint32_t y, char c, uint16_t color)2 l# P0 p4 W% u! U) y$ n# u/ S6 O
{" W9 y0 m- D; ~* U, j
if (c < 0x20 || c > 0x7E) return;
, w$ `& t) I4 t$ |( ^( k" |, i# m% K8 H* C8 Q& }* ^; X
uint32_t char_index = c - 0x20;9 d+ o6 }/ n) F8 t5 t  A
const uint8_t *glyph = &Font12_Table[char_index * 12];/ l$ p( b4 W9 x$ ?7 U

9 c6 f! w& u7 E" v7 h* P) r" Gfor (int row = 0; row < 12; row++) {& f, k4 z% o/ K+ r1 N0 \
    uint8_t bits = glyph[row];
4 C4 Z" R' e5 n    for (int col = 0; col < 7; col++) {
$ O9 \% s7 n* K: e        if (bits & (0x80 >> col)) {) j( G9 y$ D: c# |
            draw_pixel_v(x + col, y + row, color);
' \3 M6 x: o* j; C        }
: A: k4 _- E3 z* u( e- J    }# {: a  z: L$ Y2 m8 R+ M3 g
}4 F8 v5 c3 l4 W( u3 n3 W
}% a( W8 H* c  i5 \, K

$ t/ }' J( W4 f4 B/* ---------- ????(??????)---------- */1 W4 P7 Y8 d, N1 e2 M
static void draw_string12_v(uint32_t x, uint32_t y, const char *str, uint16_t color)
! R2 w5 a+ @; {5 R" t{
- v. s) z% l' ^. Qint cx = x;
5 I2 ^9 `, e- ~8 Y# Nwhile (*str) {# V6 S' u6 X# H2 B) D: D3 Y# C: V
draw_char12_v(cx, y, *str, color);
) @) n% W( d' h2 `cx += 8;  // 7??? + 1??1 K9 n! ~; m) J
str++;& Y# A& t/ f) t( J4 g
}9 W! H% c; j9 S4 n
}, g. z& a* ?$ C5 h9 y: T) n. |

  H; W* Y  m+ E) I  j开始用的font24字符很霸气。每个字符 24 像素高,在 480×272 的屏上几乎占满半行。一行最多塞 20 个字符,但那个视觉冲击力是真的猛:黑底白字,每个笔画粗壮饱满,老远就能看清,三行字占掉 120 像素高度。
+ i; s4 ?' c( c3 ~: b' r3 X但信息密度太低。想多打两行,没地方了。24px 的字在 272 像素高的横屏上,顶多塞 十来行 行就到底,而且每行也就几个字。
8 T6 `" ~0 `2 q' l# d, p; F' M1 o 81.jpg . D4 u* W/ J4 T, A$ U. k5 k
7 }2 ?7 ]3 h0 L+ g
把 Font24 换成 Font12 的那一刻,屏幕上突然瘦了下来,信息量直接翻倍。12px 的字符在 RGB565 屏上刚好是最漂亮的尺度,后期要把 CoreMark 分数、编译器版本、缓存状态全堆上去,屏面终于有了正经仪表盘的味道。
4 Z. q) K) I5 y& L& L( j横屏 480 宽塞 Font12 可以放 40 个字符,但 272 高也只能放 22 行左右,参数再多就挤不下。横屏时那些短字符串,比如 "Hello World!"也占一行,空置率太高。7 X' g: M  }0 c9 S" V5 c* D+ j
82.jpg
3 G4 s0 F% P& q  T$ J2 V* s8 u( i还是得竖屏,屏幕逻辑分辨率变成 272×480。这一转,整个布局逻辑全变了:宽度从 480 缩到 272 → Font12 每行只能放 22 个字符,长字符串必须拆行
) s) A1 B& b- [) K高度从 272 拉到 480 → 能放 40 行 Font12 文字,信息纵向展开后节奏感出来了,参数一行一个,像手机上的系统信息页,从上往下扫读,层次分明。
! a6 H9 w( E5 K2 R$ r 83.jpg ( \3 V2 |3 P  G* z/ e" R/ q7 G
竖屏妙啊,嵌入式系统信息天然适合纵向列表。, M  P4 \0 r3 R
而且竖屏 272×480 的显存还是 261KB,CPU 不用多干任何活。
: {( {. J; o+ N- W5 l* E2 k4 B7 `9 Q5 `7 d. s9 Q6 ]- j- A
小结避坑:8 o! e- \$ Y8 Q2 d- T
黑屏只背光亮:九成显存地址在 DTCM,或 PLL3_R 没给 LTDC 时钟,或 PH6 复位脚没拉。% X3 N9 y3 b% E$ I- r
颜色红蓝反:RGB565 字节序或 R/B 线交换,DMA2D 做 Red/Blue Swap 最快。* x  C  e0 W7 A
字糊成竖条:Layer 窗口大小和显存 stride 不一致(480×2 必须对齐 64 字节 AXI 突发)。
  N5 ]  ^% O. E8 U4 R/ Y
( {) p# b) @# O: k& U
赞 收藏 评论0 发布时间:2026-8-21 13:54

举报

0个回答

所属标签

ST中文论坛活动

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


最新内容

相似技术帖

官网相关资源

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