Funpack5-1 - 用NXP FRDM-MCXA346 开发板实现串口打印实验
该项目使用了NXP的 FRDM-MCXA346 开发板,实现了串口打印实验的设计,它的主要功能为:FRDM-MCXA346 单片机实现串口循环打印“Hello, DigiKey Funpack 5-1”功能。
标签
FRDM-MCXA346
Funpack5-1
Dino
更新2026-03-19
16

这里是Funpack5-1,本期使用的是NXP的FRDM-MCXA346 开发板,MCXA346 是一款由恩智浦半导体推出的紧凑型、可扩展的开发板,旨在帮助工程师和开发者基于 MCX A346 微控制器 (MCU) 进行快速原型设计和评估。其核心目标应用领域涵盖工业及消费物联网,特别适用于电机控制(如无刷直流电机BLDC)和工业通信等场景

核心特性概览

  • 主控MCU:恩智浦 MCX A346,搭载 Arm Cortex-M33 内核,最高主频可达 180 MHz
  • 存储:板载高达 1MB 的闪存和 256KB 的 RAM(带8KB ECC)
  • 特色外设:集成了乘法累加单元 (MAU) 和 SmartDMA,为数据处理和外围设备控制提供了灵活性
  • 板载调试器:配备基于 LPC55S16 芯片的 MCU-Link 调试器 (Lite版本),支持CMSIS-DAP,只需一根USB-C线缆即可进行调试和烧录
  • 扩展接口:兼容多种行业标准接口,包括 Arduino UNO R3Mikroe click boardsPmod 以及专用的 FRDM 电机控制接口,方便连接各种功能扩展板
  • 板载资源:板载 RGB LED、复位按钮、ISP按钮和唤醒按钮,方便用户交互与程序控制
  • 开发软件:支持 MCUXpresso IDE、IAR Embedded Workbench、Keil MDK 等主流开发工具,并可利用MCUXpresso SDK快速上手


【项目介绍】

本次完成任务是利用官方的IDE开发软件,使用官方的”hello world“串口打印例程,在此基础上,将打印内容替换为本次活动要求的“Hello, DigiKey Funpack 5-1”打印,在此过程中体验NXP的官方的IDE开发软件以及FRDM-MCXA346 开发板的开发过程。


【方案框图和项目设计思路介绍】


图1 软件实现思路流程图

如图1所示,首先对系统时钟进行初始化,然后对UART2引脚进行初始化并使能串口,以上步骤完成后在main主函数中调用打印函数,然后实现代码设计。


以下介绍开发板串口打印功能的代码设计详细过程:

1. 时钟和复位控制

初始化MCU上的LPUART2外设引脚,用于调试通信


CLOCK_EnableClock(kCLOCK_GatePORT2);            // 使能PORT2模块的时钟
RESET_ReleasePeripheralReset(kLPUART2_RST_SHIFT_RSTn); // 释放LPUART2模块复位
RESET_ReleasePeripheralReset(kPORT2_RST_SHIFT_RSTn); // 释放PORT2模块复位

2. 引脚配置结构体

配置了两个引脚:

  • PORT2_2 (pin 35): LPUART2_TXD(发送引脚)
  • PORT2_3 (pin 36): LPUART2_RXD(接收引脚)
  • 复用功能:通过mux = kPORT_MuxAlt3将GPIO配置为LPUART2功能


void BOARD_InitDEBUG_UARTPins(void)
{
/* PORT2: Peripheral clock is enabled */
CLOCK_EnableClock(kCLOCK_GatePORT2);
/* LPUART2 peripheral is released from reset */
RESET_ReleasePeripheralReset(kLPUART2_RST_SHIFT_RSTn);
/* PORT2 peripheral is released from reset */
RESET_ReleasePeripheralReset(kPORT2_RST_SHIFT_RSTn);

const port_pin_config_t port2_2_pin35_config = {/* Internal pull-up resistor is enabled */
.pullSelect = kPORT_PullUp,
/* Low internal pull resistor value is selected. */
.pullValueSelect = kPORT_LowPullResistor,
/* Fast slew rate is configured */
.slewRate = kPORT_FastSlewRate,
/* Passive input filter is disabled */
.passiveFilterEnable = kPORT_PassiveFilterDisable,
/* Open drain output is disabled */
.openDrainEnable = kPORT_OpenDrainDisable,
/* Low drive strength is configured */
.driveStrength = kPORT_LowDriveStrength,
/* Normal drive strength is configured */
.driveStrength1 = kPORT_NormalDriveStrength,
/* Pin is configured as LPUART2_TXD */
.mux = kPORT_MuxAlt3,
/* Digital input enabled */
.inputBuffer = kPORT_InputBufferEnable,
/* Digital input is not inverted */
.invertInput = kPORT_InputNormal,
/* Pin Control Register fields [15:0] are not locked */
.lockRegister = kPORT_UnlockRegister};
/* PORT2_2 (pin 35) is configured as LPUART2_TXD */
PORT_SetPinConfig(PORT2, 2U, &port2_2_pin35_config);

const port_pin_config_t port2_3_pin36_config = {/* Internal pull-up resistor is enabled */
.pullSelect = kPORT_PullUp,
/* Low internal pull resistor value is selected. */
.pullValueSelect = kPORT_LowPullResistor,
/* Fast slew rate is configured */
.slewRate = kPORT_FastSlewRate,
/* Passive input filter is disabled */
.passiveFilterEnable = kPORT_PassiveFilterDisable,
/* Open drain output is disabled */
.openDrainEnable = kPORT_OpenDrainDisable,
/* Low drive strength is configured */
.driveStrength = kPORT_LowDriveStrength,
/* Normal drive strength is configured */
.driveStrength1 = kPORT_NormalDriveStrength,
/* Pin is configured as LPUART2_RXD */
.mux = kPORT_MuxAlt3,
/* Digital input enabled */
.inputBuffer = kPORT_InputBufferEnable,
/* Digital input is not inverted */
.invertInput = kPORT_InputNormal,
/* Pin Control Register fields [15:0] are not locked */
.lockRegister = kPORT_UnlockRegister};
/* PORT2_3 (pin 36) is configured as LPUART2_RXD */
PORT_SetPinConfig(PORT2, 3U, &port2_3_pin36_config);
}


3. 系统时钟配置,采用IDE的例程,将时钟初始化为180MHz(最高支持180MHz)



/*******************************************************************************
* Code for BOARD_BootClockFROHF180M configuration
******************************************************************************/
void BOARD_BootClockFROHF180M(void)
{
uint32_t coreFreq;
spc_active_mode_core_ldo_option_t ldoOption;
spc_sram_voltage_config_t sramOption;

/* Get the CPU Core frequency */
coreFreq = CLOCK_GetCoreSysClkFreq();

/* The flow of increasing voltage and frequency */
if (coreFreq <= BOARD_BOOTCLOCKFROHF180M_CORE_CLOCK) {
/* Set the LDO_CORE VDD regulator level */
ldoOption.CoreLDOVoltage = kSPC_CoreLDO_OverDriveVoltage;
ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;
(void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);
/* Configure Flash to support different voltage level and frequency */
FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x4U));
/* Specifies the operating voltage for the SRAM's read/write timing margin */
sramOption.operateVoltage = kSPC_sramOperateAt1P2V;
sramOption.requestVoltageUpdate = true;
(void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);
}


/*!< Set up system dividers */
CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 1U); /* !< Set SYSCON.AHBCLKDIV divider to value 1 */
CLOCK_SetClockDiv(kCLOCK_DivFRO_HF, 1U); /* !< Set SYSCON.FROHFDIV divider to value 1 */
CLOCK_SetupFROHFClocking(180000000U); /*!< Enable FRO HF(180MHz) output */
CLOCK_SetupFRO12MClocking(); /*!< Setup FRO12M clock */

CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /* !< Switch MAIN_CLK to kFRO_HF */

/* The flow of decreasing voltage and frequency */
if (coreFreq > BOARD_BOOTCLOCKFROHF180M_CORE_CLOCK) {
/* Configure Flash to support different voltage level and frequency */
FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x4U));
/* Specifies the operating voltage for the SRAM's read/write timing margin */
sramOption.operateVoltage = kSPC_sramOperateAt1P2V;
sramOption.requestVoltageUpdate = true;
(void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);
/* Set the LDO_CORE VDD regulator level */
ldoOption.CoreLDOVoltage = kSPC_CoreLDO_OverDriveVoltage;
ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;
(void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);
}

/*!< Set up clock selectors - Attach clocks to the peripheries */
CLOCK_AttachClk(kCPU_CLK_to_TRACE); /* !< Switch TRACE to CPU_CLK */

/*!< Set up dividers */
CLOCK_SetClockDiv(kCLOCK_DivFRO_LF, 1U); /* !< Set SYSCON.FROLFDIV divider to value 1 */
CLOCK_SetClockDiv(kCLOCK_DivWWDT0, 1U); /* !< Set MRCC.WWDT0_CLKDIV divider to value 1 */
CLOCK_SetClockDiv(kCLOCK_DivTRACE, 2U); /* !< Set MRCC.TRACE_CLKDIV divider to value 2 */

/* Set SystemCoreClock variable */
SystemCoreClock = BOARD_BOOTCLOCKFROHF180M_CORE_CLOCK;
}


4. main主函数

在main主函数中,使用PRINTF函数可以输出Hello, DigiKey Funpack 5-1



int main(void)
{
char ch;
/* Init board hardware. */
BOARD_InitHardware();
PRINTF("Hello, DigiKey Funpack 5-1\r\n");
while (1)
{
PRINTF("Hello, DigiKey Funpack 5-1\r\n");
}
}


编写完成主函数后,即可对代码工程进行编译,下载,在电脑端使用串口助手即可看到开发板的输出打印。

【功能展示图及说明】

图2 板卡上电打印示意图

如图2所示,板卡烧录代码后,使用串口工具查看打印,可以看到板卡打印的内容


【心得体会】

本次的活动的任务难度上有了不同难度的划分,真正做到了“白菜”和“大佬”共同参与,就这一点对举办方表示赞扬。

本次活动软件开发环境是使用的MCUXpresso IDE ,这是NXP的适配开发软件,在新建代码工程的过程中,发现这个IDE支持很多种型号类型的芯片和开发板, 这点让人感到惊讶(之前为什么没有早点发现)整个IDE软件使用起来也很顺畅,留下了不错的印象,如果以后工作中遇到了NXP相关的芯片开发,相信第一时间会考虑这个IDE

说到NXP FRDM-MCXA346这款开发板,板卡主控是A346,主频最高到180MHz,虽然不是很高,但是作为一款单片机来说绝对够用了,具有丰富的外设例如,IIC,SPI,QSPI,UART,还有专用的FRDM电机控制接口(我想这才是这款芯片的强项)特别是板载的MCU-Link,在开发调试阶段非常方便,整个开发板是黑色沉金,颜值也是非常高,爱不释手。

总体来说,个人非常喜欢这期活动的开发板,友善的开发环境,高颜值的开发板,和不同难度的任务。。。。期待下一期的参与,祝好! --20260316 BY beijing


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