用 STM32F429 的 LTDC 在屏上放一张中秋图板子是 STM32F429I-DISCOVERY(MB1075-C01),屏是板上自带的 ILI9341,240×320。 要做的事很简单:让一张图出现在屏上,再让几个字动起来。下面按实际动手的顺序写。 一、先把屏点亮F429 的 LTDC 是直接驱屏的外设,不走 SPI。它需要四样东西: 时钟。 LTDC 的像素时钟来自 PLLSAI,不是主 PLL。这跟 SYSCLK 是两套独立的时钟,改 HCLK 不影响屏的刷新率。算的时候注意是三级分频: 时序。 横向 240 有效 + 前后沿和同步脉冲,纵向 320 一样。这些参数照屏的手册抄,凑错一个就会出现画面偏移或者边缘滚动。 引脚。 18 根数据线(R2-R7、G2-G7、B2-B7)加 4 根控制线(HSYNC、VSYNC、CLK、DE)。RGB565 只用到 16 位,低位那两根可以不接。 帧缓冲。 一块存像素的内存,LTDC 每帧从这儿读。这块必须放 SDRAM——240×320×2 是 150KB,片内 SRAM 放不下。 **SDRAM 要先初始化好。F429 片上只有 256KB,这个屏一张全屏图就 150KB,所以外挂的 IS42S16400J(8MB,映射到 ** 到这一步屏上应该是一片纯色。如果连纯色都刷不出来,后面的不用看。 二、图怎么变成数据屏要的是 RGB565:每个像素 16 位。计算机里的图片是 24 位(RGB888),要压。 压的时候丢了什么R 5 位、G 6 位、B 5 位。绿色多给一位,因为人眼对绿色最敏感。
有个坑叫字节序我一开始刷上去,整屏颜色像反相了——深的变浅,红的变青。 **原因是 CubeMX 生成的 **
注意不是
所以生成数组时****不要做字节交换。 不确定的话做个测试图:画红、绿、蓝三条竖杠刷上去。红变蓝就是反了。 抖动直接砍位会产生色带——大片渐变的地方出现一条条断层。中秋图的夜空正好是大片深蓝,问题特别明显。 解决办法是抖动:在量化前给每个像素加一点随机偏移,让误差被打散成"噪声",眼睛就看不出来了。 常用的 Floyd-Steinberg 在这里不好使。它要把误差传给右、左下、下、右下四个像素,在大片纯色区域会织出规则的螺旋纹(业内叫虫子纹)。夜空就是大片纯色,正好中招。 改用 8×8 Bayer:位置固定,同一个坐标永远得到同一个值,没有状态。
三条通道共用一个抖动值。如果各抖各的,抖动就变成彩色噪点了。 三、中文怎么画为什么不用现成的字库LVGL 自带字库,但中文要么没有,要么得自己裁。而且我只用十几个字,不想为了它把整套字库塞进 FLASH。 所以自己取模。用 Windows 带的楷体 STKAITI.TTF,只取需要的那几个字。 A8 而不是 1bpp1bpp 每像素只有黑白两档,28px 的楷体撇捺全是锯齿。A8 用一字节存"覆盖度"(0~255),笔画边缘就平滑了。 代价是体积涨 8 倍:一个字 1024 字节,12 个字 12KB。2MB FLASH 里占 0.6%,无所谓。 抗锯齿有个反直觉的地方用 Python 的 PIL 画字, 因为 FreeType 算的是"这个像素被字形覆盖了多少"。笔画宽度不是整数像素,中心那个像素可能只被覆盖了 70%。 实测 28px 的「中」字,1024 个像素里:
后果是:上屏的字色永远是"掺了背景色的暗金",到不了想要的正金色。 解决办法是加同色描边。这不是加粗,是把丢掉的满格像素补回来。 四、透明怎么处理RGB565 没有 alpha 通道。要把字叠到图上,只能约定"某个颜色代表透明"。 **行业惯例是用品红 ** 生成的时候把要透明的部分涂成品红,刷上屏时让硬件跳过这些像素。F429 的 DMA2D 外设正好能干这事,叫 Color Mode 抠色。 **顺序是:**先把背景图铺满全屏,再用抠色模式把带品红底的字叠上去。 有个细节容易忽略:抠色的时候 DMA2D 要读"屏幕上已有的内容"当背景再次计算,所以背景地址就填目标地址本身。填错的话会出现随机位置的鬼影。 五、让字动起来需求是"一直显示中秋画面",所以是死循环,不是播完就退。 每帧做什么
为什么要整屏重铺,而不是只擦掉字?因为字在淡入时位置每帧都在变(往上浮 10 像素),擦除要记住上一帧每块矩形,漏一块就留残影。0.9ms 换"绝不会有残影",这笔不亏。 一个常见的错误写法
正确做法是对齐到绝对时刻:
超时的那帧不再额外等,后面自动追上,平均帧率就锁死了。 **那句 ** 逐字淡入「中秋快乐」四个字,第 0/1/2/3 个字分别在 0/120/240/360 毫秒开始淡入,每个用 600 毫秒,到 960 毫秒全部完成。 亮度和位移用同一个时间参数控制,视觉上就是"一边往上浮一边变亮",比分成两段动画自然。--- 六、最后占了多大
RAM 一个字节没涨。因为图和字库都声明成 F429 有 2MB FLASH、256KB SRAM,常量放 FLASH 不占 RAM,所以 150KB 的图直接塞进去完全没问题。 编完可以看一眼符号表确认:
数字对得上就说明没搞错。 **还有一处:图的数组要加 ** 七、换一张图
**字库同理,改 ** 八、几件记一下
|
双节狂欢/STM32F429 上移植 FreeRTOS
【有奖活动】2026 GaN 技术日 · 深圳
CEIC 2026|意法半导体与您相约深圳消费电子创新大会
#双节活动#STM32CubeMX2的开发经验
深圳见!走进GEIA创新周,现场体验ST人形机器人全套参考设计
意法半导体精彩亮相IOTE 2026深圳物联网展
探索连接与安全的未来|ST安全与连接事业部线下研讨会即将登陆深圳南山区
倒计时!ST邀您齐聚2026 SSA亚洲智能传感器与应用技术博览会,共探人形机器人感知新生态
下周启幕|ST邀您参加2026 ATC上海国际动力展,多款汽车创新方案等你来探
今日盛会开场|奔赴低空之约,相聚2026世界无人机大会ST展位
微信公众号
手机版