使用 FSMC 构建了一个裸机 STM32 接口,将实时的操纵杆输入映射到独立的 LED 和一个 16 位液晶显示屏上,以实现动态的用户界面反馈
扫描二维码
随时随地手机看文章
该项目是一个基于 RT-Spark STM32 开发板的实时、裸机硬件接口。它充当了一个交互式的控制面板,将物理世界与数字世界连接起来。通过读取来自一个 5 个方向操纵杆的输入,该系统会立即触发数字逻辑来控制外部独立的 LED,并在高速 16 位 TFT 液晶显示屏上呈现动态文本。
你为什么决定去做这件事呢?
我想要摒弃现代操作系统所提供的保护机制,深入探究硬件在硅层层面的真实运作方式。我决定不依赖像 Linux 或实时操作系统(RTOS)这样的东西,而是使用 STM32 的硬件抽象层(HAL)编写“裸机”C 代码。
我想要迎接这样的挑战:
•研究如何通过物理引脚映射来传输电信号。
•对第三方驱动软件(RT-Thread)进行解码和修改,使其能够在裸机环境中运行。
•理解像灵活静态内存控制器(FSMC)这样的复杂内存总线,以便将图形数据传输至屏幕。
这是一次纯粹的嵌入式系统工程实践——修复浮动复位引脚、调整内存地址,并让硬件严格按照我编写的程序指令运行。
它是如何运作的?
该系统以持续的高速循环模式运行,由 168/180 MHz 的系统时钟驱动,执行三个主要阶段:
硬件初始化:在启动时,C 代码会手动切换特定的 GPIO 引脚。它将液晶显示屏背光引脚(PF9)拉高以提供电源,并向硬件复位引脚(PD3)发送精确的电气时序信号,以使屏幕从默认的睡眠状态中唤醒。
输入监听:微控制器会快速读取与五向操纵杆相连的 GPIO 引脚的电压状态。它会主动检测低电平信号(这意味着按钮已被按下且电路已接地)。该软件甚至还会考虑到物理硬件的特殊性,通过电子方式将左右输入引脚(GPIO_PIN_5 和 GPIO_PIN_2)进行交换,以匹配用户的实际操作方向。
动态输出:一旦检测到输入信号,逻辑就会将该信号导向两个方向。首先,它会将指定的 LED 引脚拉低,从而点亮彩色灯光。其次,它会利用映射到内存地址 0x68000000 的 FSMC 来快速覆盖液晶显示屏上的像素,从而在漆黑的背景上显示清晰的白色确认信息(例如,“左侧按钮已被按下”)。
实际的最终结果:
摄像机从一片空白的黑色屏幕开始,屏幕上显示着“Hello World”的启动文字。一只手进入画面并按下操纵杆的向上按钮,点亮了红色指示灯。接着操纵杆被向左和向右按压;每次按压后,屏幕上会立即以白色字体显示特定的文字“左侧按钮已被按下”和“右侧按钮已被按下”,按压结束后这些文字会立即消失。
本文编译自hackster.io





