Funpack5-1 - 使用NXP FRDM-MCXA346开发板进行串口输出
该项目使用了NXP FRDM-MCXA346 开发板,实现了串口输出的设计,它的主要功能为:通过串口输出Hello, DigiKey Funpack 5-1“”。
标签
Funpack活动
NXP FRDM-MCXA346 开发板
qqlovolpp
更新2026-03-04
20

一、项目介绍

在本任务中,我使用开发板上集成的 UART(通用异步收发传输器)外设,通过配置对应的引脚复用、波特率、数据格式等参数,成功实现了从 MCU 向 PC 端串口调试工具输出指定字符串的功能。最终,开发板通过 USB 转串口接口,在串口终端上打印出信息:“Hello, DigiKey Funpack 5-1”

二、硬件介绍

项目中使用到的硬件是NXP FRDM-MCXA346 开发板。

FRDM-MCXA346是一款紧凑且可扩展的开发板,可以快速基于MCX A346 MCU开展原型设计。它们提供行业标准的接口,可轻松访问MCU的I/O,配备集成的开放标准串行接口、外部闪存和板载MCU-Link调试器。

关键参数

  • MCX A346 Arm® Cortex®-M33内核,运行频率高达180MHz,1MB闪存,256KB RAM,带8KB的纠错码(ECC)
  • 拥有双FlexPWM、4组16位ADC、专用MAU数学加速器以及SmartDMA
  • 高速通用串行总线(HS USB)Type-C连接器(板载MCU-Link调试器),支持CAN/I3C/SPI/I²C/UART连接器(Arduino、PMOD/mikroBUS、DNP)
  • 带有CMSIS-DAP的板载MCU-Link调试器 ,JTAG/SWD连接器
  • 兼容Arduino、mikroBUS、
  • 适合:工业自动化、电机控制、IoT边缘计算

三、软件介绍

任务的软件部分基于 NXP 官方提供的 MCUXpresso SDK 开发环境实现,主要完成 UART 串口的初始化与字符串输出功能。程序流程如下:

GPIO初始化:首先初始化UART用到的GPIO。

void BOARD_InitDEBUG_UARTPins(void)
{
    CLOCK_EnableClock(kCLOCK_GatePORT2);
    RESET_ReleasePeripheralReset(kLPUART2_RST_SHIFT_RSTn);
    RESET_ReleasePeripheralReset(kPORT2_RST_SHIFT_RSTn);
    const port_pin_config_t port2_2_pin35_config = { .pullSelect = kPORT_PullUp,
                                                    .pullValueSelect = kPORT_LowPullResistor,
                                                    .slewRate = kPORT_FastSlewRate,
                                                    .passiveFilterEnable = kPORT_PassiveFilterDisable,
                                                    .openDrainEnable = kPORT_OpenDrainDisable,
                                                    .driveStrength = kPORT_LowDriveStrength,
                                                    .driveStrength1 = kPORT_NormalDriveStrength,
                                                    .mux = kPORT_MuxAlt3,
                                                    .inputBuffer = kPORT_InputBufferEnable,
                                                    .invertInput = kPORT_InputNormal,
                                                    .lockRegister = kPORT_UnlockRegister};
    PORT_SetPinConfig(PORT2, 2U, &port2_2_pin35_config);
    const port_pin_config_t port2_3_pin36_config = { .pullSelect = kPORT_PullUp,
                                                    .pullValueSelect = kPORT_LowPullResistor,
                                                    .slewRate = kPORT_FastSlewRate,
                                                    .passiveFilterEnable = kPORT_PassiveFilterDisable,
                                                    .openDrainEnable = kPORT_OpenDrainDisable,
                                                    .driveStrength = kPORT_LowDriveStrength,
                                                    .driveStrength1 = kPORT_NormalDriveStrength,
                                                    .mux = kPORT_MuxAlt3,
                                                    .inputBuffer = kPORT_InputBufferEnable,
                                                    .invertInput = kPORT_InputNormal,
                                                    .lockRegister = kPORT_UnlockRegister};
    PORT_SetPinConfig(PORT2, 3U, &port2_3_pin36_config);
}

系统时钟初始化:配置 MCU 主频及外设时钟源,确保 UART 模块获得正确的时钟输入;

UART 外设配置:使用 SDK 中的 UART_Init() 函数,设置波特率为 115200,数据位为 8 位,无校验位,1 位停止位(8N1 格式);

引脚复用设置:通过 Pin Mux 工具或代码手动配置 UART_TX 引脚(如 PTA1)为 UART 功能模式;

#define BOARD_DEBUG_UART_BAUDRATE 115200U
#define BOARD_DEBUG_UART_BASEADDR   (uint32_t) LPUART2
#define BOARD_DEBUG_UART_INSTANCE   2U
#define BOARD_DEBUG_UART_CLK_ATTACH kFRO_LF_DIV_to_LPUART2
#define BOARD_DEBUG_UART_RST        kLPUART2_RST_SHIFT_RSTn
#define BOARD_DEBUG_UART_CLKSRC     kCLOCK_LPUART2
#define BOARD_UART_IRQ_HANDLER      LPUART2_IRQHandler
#define BOARD_UART_IRQ              LPUART2_IRQn
BOARD_BootClockFROHF180M();
void BOARD_InitDebugConsole(void)
{
    CLOCK_SetClockDiv(kCLOCK_DivLPUART2, 1u);
    CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
    RESET_PeripheralReset(BOARD_DEBUG_UART_RST);
    DbgConsole_Init(BOARD_DEBUG_UART_INSTANCE, BOARD_DEBUG_UART_BAUDRATE, BOARD_DEBUG_UART_TYPE,
                    BOARD_DEBUG_UART_CLK_FREQ);
}

字符串发送:调用 UART_WriteBlocking() 函数,将预定义字符串 "Hello, DigiKey Funpack 5-1\r\n" 通过串口阻塞式发送至 PC 端;

#define PRINTF  DbgConsole_Printf
PRINTF("Hello, DigiKey Funpack 5-1.\r\n");

主循环:发送完成后,程序进入死循环,当接收到用户输入时,返回用户输入并再次发送“Hello, DigiKey Funpack 5-1”。

    while (1)
    {
        PRINTF("Hello, DigiKey Funpack 5-1.\r\n");
        ch = GETCHAR();
        PUTCHAR(ch);
    }

整个代码结构简洁,未使用 RTOS 或中断机制,仅依赖 SDK 提供的底层驱动,便于快速验证硬件连接与开发环境搭建是否正确。该实现方式也为后续扩展(如添加接收功能、非阻塞传输或多外设协同)提供了清晰的起点。

四、结果展示

通过usb线连接NXP FRDM-MCXA346 开发板与电脑,下载二进制文件,打开串行监视器,运行结果如下图。在串行监视器中可看到,成功显示“Hello, DigiKey Funpack 5-1.”

image.png

五、遇到的困难及解决办法

在项目中,主要遇到了两个方面的困难:一是 MCUXpresso IDE 开发环境的搭建与调试配置不顺利,二是 对 NXP MCXA 系列 SDK 的结构和外设驱动使用不熟悉

针对开发环境问题,最初在安装 MCUXpresso IDE 后,未能正确识别 FRDM-MCXA346 开发板,导致无法下载程序或串口无输出。通过查阅 NXP 官方文档,确认需安装对应 MCU 型号的 SDK 包调试探针驱动,并确保开发板固件为最新版本。最终在 MCUXpresso 的 “Installed SDKs” 中成功导入 MCXA346 的 SDK,并通过 “Quickstart Panel” 创建基于该 SDK 的新工程,解决了环境兼容性问题。

对于 SDK 使用不熟悉的问题,一开始不清楚如何正确初始化 UART 外设,也不了解引脚复用(Pin Mux)的配置方式。为此,我参考了 SDK 自带的 UART 例程(如 uart_polling 示例),结合 MCUXpresso IDE 内置的 Peripherals 工具和 Pins 工具,自动生成了正确的时钟、引脚和外设初始化代码。同时,阅读了《MCXA 系列参考手册》中关于 UART 模块和系统时钟的部分,逐步理解了数据流和配置逻辑。

六、心得与体会

通过这次基础串口任务的实践,我不仅熟悉了 NXP MCXA346 开发板的基本使用流程,也对嵌入式开发中“环境搭建—外设配置—调试验证”这一典型工作链条有了更清晰的认识。虽然任务简单,但每一步都让我意识到:细节决定成败——一个引脚没配对、一个时钟没开,程序就跑不起来。
更重要的是,我学会了在遇到问题时不慌,而是去查文档、看例程、一步步验证。这让我对后续更复杂的项目多了一点信心。


附件下载
frdmmcxa346_hello_world.zip
团队介绍
.
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号