主要连接框架

基于 FRDM-MCXA153 的超声波测距与 LCD 显示系统
平台:NXP FRDM-MCXA153(MCXA153,Cortex-M33 cm33_core0,96 MHz,裸机)
传感器:HC-SR04 超声波测距模块(5V)
显示:Newhaven NHD-0116AZ-FL-YBW(16×1 字符 LCD,HD44780/ST7066 兼容,4-bit 并口)
日期:2026/10/08
1. 概述
实现"测距 → 开发板→ 显示 "的完整闭环:
引脚与接线(摘要)
LCD RS / EN P3_1 / P3_30 J6-2 / J6-1 LCD D4–D7 P1_0 / P1_1 / P1_2 / P1_3 J6-6 / J6-4 / J6-5 / J6-3 LCD RW / VDD / VSS GND / 5V / GND V0 经对比度网络(不可直接接 GND) HC-SR04 TRIG P3_7 触发输出 HC-SR04 ECHO P1_8(CT_INP8) 经 10kΩ/20kΩ 分压到 ~3.3V
1. 编译:工程基于 CMake + MCUXpresso SDK。引脚与 CTIMER 由 Config Tools(`hello_world.mex`)生成,编译入口 `CMakeLists.txt`,产物为 `.bin`。2. 烧录:通过板载 MCU-Link,USB 连接 J15,下载固件。
3. 运行:上电后 `BOARD_InitHardware()` 完成引脚/时钟/外设初始化,`HCSR04_Init()` 启动定时器,`LCD_Init()` 初始化屏并显示 `HC-SR04 ready`,随后进入测距主循环。
实现步骤与关键代码
软件分层:芯片层(mex 生成的 `pin_mux.c`/`peripherals.c`)负责"脚是什么功能",驱动层(`hcsr04.c`/`lcd_st7066u.c`)负责"按协议说话"。
① 超声状态机(`Idle→WaitRise→WaitFall→Done`),CTIMER 回调里只记时间、置标志:
void SR04_CtimerCallback(uint32_t flags)
{
if (((flags & (uint32_t)kCTIMER_Capture0Flag) != 0U) &&
((s_state == kHcsr04_WaitRise) || (s_state == kHcsr04_WaitFall)))
{
uint32_t cap = CTIMER_GetCaptureValue(SR04_CTIMER, SR04_CAPTURE);
if (s_state == kHcsr04_WaitRise) {
s_riseTicks = cap;
s_state = kHcsr04_WaitFall;
} else {
s_echoUs = cap - s_riseTicks;
s_valid = (s_echoUs >= 116U) && (s_echoUs <= 20000U);
s_state = kHcsr04_Done;
}
}
if (((flags & (uint32_t)kCTIMER_Match0Flag) != 0U) &&
((s_state == csr04_WaitRise) || (s_state == csr04_WaitFall))) {
s_echoUs = 0U; s_valid = false; s_state = csr04_Done;
}
}
发射信号→ 等待返回→ 换算距离 → 中值滤波 → 刷屏
while (1) {
HCSR04_Start();
while (!HCSR04_IsDone()) { }
mm = HCSR04_GetDistanceMm(); /* 无效返回 -1 */
shown = DistanceFilter(mm); /* 3 点中值,飞点剔除 */
LCD_ShowDistance(shown);
PRINTF("dist=%d.%d cm (raw %d.%d) echo=%u us\r\n", ...);
SDK_DelayAtLeastUs(100000U, CLOCK_GetCoreSysClkFreq());
};

我要赚赏金
