用户测评(四):使用NXPMCX-N板卡新增命令控制

安富利 2025-03-11 17:01



前言


恩智浦“FRDM-MCXN947”评测活动由安富利和与非网协同举办。本篇内容由与非网用户发布,已获转载许可。原文可在与非网(eefocus)工程师社区查看。


背景


此次任务通过串口命令行控制RGB LED,相比较与上一次任务通过单个字符控制增加了FreeRTOS-CLI组件,支持更复杂的、带参数的命令。


1. 搭建VSCode开发环境

2. 添加FreeRTOS组件,创建任务

3. 添加FreeRTOS-CLI组件,打通适配层

4. 添加FreeRTOS-CLI自定义命令,控制RGB LED


搭建VS Code开发环境

无论是使用MCUXpresso IDE还是VS Code开发环境,都必须要:


1. 安装MCUXpresso IDE,因为IDE里有NXP支持的GCC工具链

2. 下载mcux_sdk_frdm_mcxn947 SDK

3. VS Code安装插件MCUXPresso for VS Code

4. VS Code配置插件MCUXpresso for VS Code


前几个步骤都好说,这里简短演示下VS Code配置插件MCUXpresso for VS Code。


01
配置MCUXpresso for VS Code



1. 在VS Code侧边栏单击MCUXpresso图标展开右侧视图

2. 单击(2)处展开右侧视图。这里建议单击Import Example from Repository,因为它比上面的Import Repository有更多的配置选型,可以直接从这里创建示例工程

3. 单击(3)处选择本地的SDK路径,例如这里选择已经下载并解压缩的mcux_sdk_frdm_mcxn947

4. 单击(4)处选择MCUXpresso IDE的GCC工具链

5. 单击(5)处选择开发板,一个SDK可以支持同类型的几个开发板,根据需要选择对应的开发板

6. 单击(6)处选择示例工程模版,也可以输入关键词搜索

7. 编辑(7)处输入框输入新建的工程名字

8. 单击(8)处选择工程保存路径

9. 最后点击Create即可以创建工程


02
工程结构

  • .vscode/包含一些配置选项、调试启动文件

  • repo/是一个链接文件,执行SDK所在文件夹

  • app/包含应用代码

  • armgcc包含CMakeLists.txt目录程序以及一些bat、shell编译脚本,如果新增了源文件和头文件,需要修改此处的CMakeLists.txt文件

  • board/包含管脚、时钟、外设初始化代码,是MCUXpresso Config Tools自动生成的文件夹

  • iar/是IAR IDE工程文件和链接脚本

  • mdk/是MDK IDE工程文件和链接脚本

  • 后缀名为*.mexMCUXpresso Config Tools的输入文件

  • readme.md是示例工程的说明文档


03
编译、下载、调试

采用CMake+GCC编译此工程,图简便的话直接点击MCUXpresso for VS Code中的图标,如下图所示。



04
添加FreeRTOS组件

尝试过MCUXpresso IDE添加FreeRTOS组件,虽然把源码拷贝过来添加到工程里,但是port层的源文件和头文件缺失了,需要从例程拷贝复制,太麻烦了。


而VS Code中添加组件的方式特别简单,如下添加FreeRTOS组件,简直不要太爽了。


1. 鼠标右键单击工程名

2. 在弹出的菜单中选择(2)配置工程

3. 然后选择(3)管理组件

4. 在(4)处编辑框输入kernel过滤组件

5. 在(5)处选择合适的FreeRTOS类型

6. 在(6)处点击确认即可



添加FreeRTOS所做的更改体现在armgcc/config.cmake文件,如下图所示文件中增加了几处和freertos相关的配置选项。当然FreeRTOS源码不会拷贝过来,它依然存在于SDK路径中,但是需要拷贝一份FreeRTOSConfig.h过来,自行修改其中的参数。



05
新建FreeRTOS任务

新建一个最简单的FreeRTOS任务,每隔两秒钟打印一次信息。

(滑动查看)

int main(void){  // 管脚复用和配置  BOARD_InitBootClocks();  BOARD_InitBootPeripherals();  BOARD_InitBootPins();  BOARD_InitSWD_DEBUGPins();
// 调试串口打印日志 BOARD_InitDebugConsole();
PRINTF("\r\n"); PRINTF("\r\n Build: %s %s\r\n\r\n", __DATE__, __TIME__);
if (xTaskCreate(zygote_task, "zygote_task", ZYGOTE_TASK_STACK_SIZE, NULL, ZYGOTE_TASK_PRIORITY, NULL) != pdPASS) { PRINTF("Task creation failed!.\r\n"); while (1) ; } vTaskStartScheduler(); for (;;) ;}

static void zygote_task(void *pvParameters){ uint32_t zygote_loop_cnt = 0;
for (;;) { zygote_loop_cnt++; PRINTF("zygote loop cnt: %u \r\n", zygote_loop_cnt);
vTaskDelay(pdMS_TO_TICKS(2000)); }}



FreeRTOS-CLI组件


01
组件介绍

FreeRTOS-CLI是FreeRTOS官方的组件,支持注册多参数命令,命令接口可以是串口、网络套接字等。


当前使用的版本是FreeRTOS+CLI V1.0.4,适配层使用串口,注册两个多参数的命令,控制开发板上的RGB LED亮灭。


02
添加FreeRTOS-CLI组件

在源码顶层目录新建3rdparty目录并拷贝FreeRTOS_Plus_CLI组件到此,目录结构如下:

FreeRTOS_Plus_CLI/    port/        serial.c        serial.h    src/         FreeRTOS_CLI.c         FreeRTOS_CLI.h


我们只需要关心port/目录即可,适配UART层在这里。



03
适配层

重点在以下几个函数的适配:


  • xSerialPortInitMinimal()

  • xSerialPortInit()

  • vSerialPutString()

  • xSerialGetChar()

  • xSerialPutChar()


因为管脚初始化已经由MCUXpresso Config Tools图形化配置完成,通过Debug UART进行输入输出,所以前两个串口初始化函数可以留空,重点在于xSerialGetChar()xSerialPutChar()的实现,这里简单实现一下,通过Debug UART进行输入输出即可。

(滑动查看)

signed portBASE_TYPE xSerialGetChar(xComPortHandle pxPort,                                    signed char *pcRxedChar,                                    TickType_t xBlockTime){#ifndef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING  *pcRxedChar = GETCHAR();  return pdPASS;#else  char data = 0;  while (xBlockTime-- > 0) {    if (kStatus_Success == DbgConsole_TryGetchar(&data)) {      *pcRxedChar = data;      return pdPASS;    } else {      vTaskDelay(pdMS_TO_TICKS(1));    }  }
return pdFAIL;#endif}
signed portBASE_TYPE xSerialPutChar(xComPortHandle pxPort, signed char cOutChar, TickType_t xBlockTime){ signed portBASE_TYPE ch = 0;
ch = PUTCHAR(cOutChar);
return ch;}

04
RGB LED控制命令

为了点亮、熄灭RGB LED,需要实现如下这样的命令:


  • ledset r on点亮红色LED,同理ledset g/b on点亮绿色、蓝色LED

  • ledset r off熄灭红色LED,同理ledset g/b off熄灭绿色、蓝色LED

  • ledget r获取红色LED状态,如LEDR:OFF表示熄灭,LEDR:ON表示点亮


05
点亮、熄灭 LED命令的实现

(滑动查看)

// TODO: ledset r/g/b on/off// 作用:设置灯的状态// 命令: ledset// 参数1:编号,这里以 r/g/b 缩写分别表示 "RED/GREE/BLUE" 三个灯// 参数2:开关,这里以字符串 on/off 分别表示 "开灯/关灯"/** * @brief * * @param pcWriteBuffer * @param xWriteBufferLen * @param pcCommandString * @return BaseType_t */static BaseType_t prvLedSetCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ){  configASSERT(pcWriteBuffer);
/* param1: r/g/b */ const char *paramLedId = NULL; BaseType_t paramLedIdLength = 0; led_id_e mLedId = LED_ID_INVALID;
/* param2: on/off */ const char *paramLedStatus = NULL; BaseType_t paramLedStatusLength = 0; led_status_e mLedStatus;
// 首先清除输出缓冲区旧的内容 memset(pcWriteBuffer, 0, xWriteBufferLen);
// TODO: 根据两个参数打印返回的字符串
paramLedId = FreeRTOS_CLIGetParameter(pcCommandString, 1, ¶mLedIdLength); paramLedStatus = FreeRTOS_CLIGetParameter(pcCommandString, 2, ¶mLedStatusLength);
if (strncmp("r", paramLedId, 1) == 0) { mLedId = LED_ID_RED; } else if (strncmp("g", paramLedId, 1) == 0) { mLedId = LED_ID_GREEN; } else if (strncmp("b", paramLedId, 1) == 0) { mLedId = LED_ID_BLUE; } else { mLedId = LED_ID_INVALID; }
if (strncmp("on", paramLedStatus, 2) == 0) { mLedStatus = LED_ON; } else if (strncmp("off", paramLedStatus, 3) == 0) { mLedStatus = LED_OFF; }
led_set_status(mLedId, mLedStatus);
/* There is no more data to return after this single string, so return pdFALSE. */ return pdFALSE;}


06
获取LED状态命令的实现

(滑动查看)

// TODO: ledget r/g/b// 作用:获取灯的状态// 命令: ledget// 参数1:编号
/** * @brief * * @param pcWriteBuffer * @param xWriteBufferLen * @param pcCommandString * @return BaseType_t */static BaseType_t prvLedGetCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ){ configASSERT(pcWriteBuffer);
/* param1: r/g/b */ const char *paramLedId = NULL; BaseType_t paramLedIdLength = 0; led_id_e mLedId = LED_ID_INVALID;
led_status_e mLedStatus;
// 首先清除输出缓冲区旧的内容 memset(pcWriteBuffer, 0, xWriteBufferLen);
paramLedId = FreeRTOS_CLIGetParameter(pcCommandString, 1, ¶mLedIdLength);
if (strncmp("r", paramLedId, 1) == 0) { mLedId = LED_ID_RED; } else if (strncmp("g", paramLedId, 1) == 0) { mLedId = LED_ID_GREEN; } else if (strncmp("b", paramLedId, 1) == 0) { mLedId = LED_ID_BLUE; } else { mLedId = LED_ID_INVALID; }
/* 获取灯的状态 */ mLedStatus = led_get_status(mLedId);
/* 输出灯的状态,输出到 pcWriteBuffer 缓冲区中 */ sprintf(pcWriteBuffer, "%s: %s\r\n", led_helper_id_to_string(mLedId), led_helper_status_to_string(mLedStatus));
/* There is no more data to return after this single string, so return pdFALSE. */ return pdFALSE;}


07
注册命令

先定义结构体,把命令字符串和解析函数关联在一起。

(滑动查看)

/* Structure that defines the "ledset" command line command.  This generatesa table that gives information on each task in the system. */static const CLI_Command_Definition_t xLedSet ={  "ledset", /* The command string to type. */  "\r\nledset  :\r\n set r/g/b led status\r\nexample: ledset r on or ledset g off\r\n",  prvLedSetCommand, /* The function to run. */  2 /* 2 parameters are expected. */};

/* Structure that defines the "ledget" command line command. This generatesa table that gives information on each task in the system. */static const CLI_Command_Definition_t xLedGet ={ "ledget", /* The command string to type. */ "\r\nledget :\r\n get r/g/b led status\r\nexample: ledget r or ledget g\r\n", prvLedGetCommand, /* The function to run. */ 1 /* 1 parameters are expected. */};


再在合适的时机注册命令,如下所示:

(滑动查看)

void vRegisterBspCliCommands(void){  /* Register all the command line commands defined immediately above. */  FreeRTOS_CLIRegisterCommand( &xLedSet );  FreeRTOS_CLIRegisterCommand( &xLedGet );}

static void zygote_task(void *pvParameters){  uint32_t zygote_loop_cnt = 0;
/* FreeRTOS-CLI 任务创建 */ vUARTCommandConsoleStart(); extern void vRegisterSampleCLICommands(void); vRegisterSampleCLICommands(); vRegisterBspCliCommands();

for (;;) { zygote_loop_cnt++; PRINTF("zygote loop cnt: %u \r\n", zygote_loop_cnt);
vTaskDelay(pdMS_TO_TICKS(2000)); }}


08
验证

  • 发送命令ledset  r  on电量红色LED

  • 发送命令ledset  r  off熄灭红色LED

  • 发送命令ledget r获取红色LED点亮状态

  • 替换r/g/b可以正确执行命令




您可以点击文末“阅读原文”,前往与非网(eefocus)工程师社区查看原始文章。

END


用户测评(三):使用NXP MCX-N板卡搭建环境及点灯

用户测评(二):体验NXP MCX-N板卡的NPU功能


 

                                                           
                           

安富利 安富利助您将今日构思转化为明日科技.我们帮助初创企业设计和制造,让这些技术梦想家准备好成长为新的大型企业;也为需要全球供货的合同制造商和OEM制造商提供优质产品与支持.
评论 (0)
  • 一、行业背景与需求痛点智能电子指纹锁作为智能家居的核心入口,近年来市场规模持续增长,用户对产品的功能性、安全性和设计紧凑性提出更高要求:极致空间利用率:锁体内部PCB空间有限,需高度集成化设计。语音交互需求:操作引导(如指纹识别状态、低电量提醒)、安全告警(防撬、试错报警)等语音反馈。智能化扩展能力:集成传感器以增强安全性(如温度监测、防撬检测)和用户体验。成本与可靠性平衡:在复杂环境下确保低功耗、高稳定性,同时控制硬件成本。WTV380-P(QFN32)语音芯片凭借4mm×4mm超小封装、多传
    广州唯创电子 2025-03-13 09:24 46浏览
  • DeepSeek自成立之初就散发着大胆创新的气息。明明核心开发团队只有一百多人,却能以惊人的效率实现许多大厂望尘莫及的技术成果,原因不仅在于资金或硬件,而是在于扁平架构携手塑造的蜂窝创新生态。创办人梁文锋多次强调,与其与大厂竞争一时的人才风潮,不如全力培养自家的优质员工,形成不可替代的内部生态。正因这样,他对DeepSeek内部人才体系有着一套别具一格的见解。他十分重视中式教育价值,因而DeepSeek团队几乎清一色都是中国式学霸。许多人来自北大清华,或者在各种数据比赛中多次获奖,可谓百里挑一。
    优思学院 2025-03-13 12:15 51浏览
  • 在追求更快、更稳的无线通信路上,传统射频架构深陷带宽-功耗-成本的“不可能三角”:带宽每翻倍,系统复杂度与功耗增幅远超线性增长。传统方案通过“分立式功放+多级变频链路+JESD204B 接口”的组合试图平衡性能与成本,却难以满足实时性严苛的超大规模 MIMO 通信等场景需求。在此背景下,AXW49 射频开发板以“直采+异构”重构射频范式:基于 AMD Zynq UltraScale+™ RFSoC Gen3XCZU49DR 芯片的 16 通道 14 位 2.5GSPS ADC 与 16
    ALINX 2025-03-13 09:27 37浏览
  • 2025年,科技浪潮汹涌澎湃的当下,智能数字化变革正进行得如火如荼,从去年二季度开始,触觉智能RK3562核心板上市以来,受到了火爆的关注,上百家客户选用了此方案,也获得了众多的好评与认可,为客户的降本增效提供了广阔的空间。随着原厂的更新,功能也迎来了一波重大的更新,无论是商业级(RK3562)还是工业级(RK3562J),都可支持NPU和2×CAN,不再二选一。我们触觉智能做了一个艰难又大胆的决定,为大家带来两大重磅福利,请继续往下看~福利一:RK3562核心板149元特惠再续,支持2×CAN
    Industio_触觉智能 2025-03-12 14:45 30浏览
  • 本文介绍OpenHarmony4.1系统开发板,出现打不开WiFi和蓝牙的问题排查和解决方法。触觉智能Purple Pi OH鸿蒙开发板演示,搭载了瑞芯微RK3566四核处理器,1TOPS算力NPU;Laval鸿蒙社区推荐并通过了开源鸿蒙XTS认证,成功适配OpenHarmony3.2、4.0、4.1、5.0 Release系统,SDK源码全开放!WiFi打不开缺少WiFi固件在WiFi打不开时我们可以通过使用串口工具查看WiFi打印信息:这条log主要说明了打开固件文件失败,说明了在/vend
    Industio_触觉智能 2025-03-12 14:32 55浏览
  • 北京时间3月11日,国内领先的二手消费电子产品交易和服务平台万物新生(爱回收)集团(纽交所股票代码:RERE)发布2024财年第四季度和全年业绩报告。财报显示,2024年第四季度万物新生集团总收入48.5亿元,超出业绩指引,同比增长25.2%。单季non-GAAP经营利润1.3亿元(non-GAAP口径,即经调整口径,均不含员工股权激励费用、无形资产摊销及因收购产生的递延成本,下同),并汇报创历史新高的GAAP净利润7742万元,同比增长近27倍。总览全年,万物新生总收入同比增长25.9%达到1
    华尔街科技眼 2025-03-13 12:23 54浏览
  • 文/杜杰编辑/cc孙聪颖‍主打影像功能的小米15 Ultra手机,成为2025开年的第一款旗舰机型。从发布节奏上来看,小米历代Ultra机型,几乎都选择在开年发布,远远早于其他厂商秋季主力机型的发布时间。这毫无疑问会掀起“Ultra旗舰大战”,今年影像手机将再次被卷上新高度。无意臆断小米是否有意“领跑”一场“军备竞赛”,但各种复杂的情绪难以掩盖。岁岁年年机不同,但将2-3年内记忆中那些关于旗舰机的发布会拼凑起来,会发现,包括小米在内,旗舰机的革新点,除了摄影参数的不同,似乎没什么明显变化。贵为旗
    华尔街科技眼 2025-03-13 12:30 69浏览
  • 一、行业背景与用户需求随着健康消费升级,智能眼部按摩仪逐渐成为缓解眼疲劳、改善睡眠的热门产品。用户对这类设备的需求不再局限于基础按摩功能,而是追求更智能化、人性化的体验,例如:语音交互:实时反馈按摩模式、操作提示、安全提醒。环境感知:通过传感器检测佩戴状态、温度、压力等,提升安全性与舒适度。低功耗长续航:适应便携场景,延长设备使用时间。高性价比方案:在控制成本的同时实现功能多样化。针对这些需求,WTV380-8S语音芯片凭借其高性能、多传感器扩展能力及超高性价比,成为眼部按摩仪智能化升级的理想选
    广州唯创电子 2025-03-13 09:26 36浏览
  • 引言汽车行业正经历一场巨变。随着电动汽车、高级驾驶辅助系统(ADAS)和自动驾驶技术的普及,电子元件面临的要求从未如此严格。在这些复杂系统的核心,存在着一个看似简单却至关重要的元件——精密电阻。贞光科技代理品牌光颉科技的电阻选型过程,特别是在精度要求高达 0.01% 的薄膜和厚膜技术之间的选择,已成为全球汽车工程师的关键决策点。当几毫欧姆的差异可能影响传感器的灵敏度或控制系统的精确性时,选择正确的电阻不仅仅是满足规格的问题——它关系到车辆在极端条件下的安全性、可靠性和性能。在这份全面指南中,我们
    贞光科技 2025-03-12 17:25 96浏览
  • 文/Leon编辑/cc孙聪颖作为全球AI领域的黑马,DeepSeek成功搅乱了中国AI大模型市场的格局。科技大厂们选择合作,接入其模型疯抢用户;而AI独角兽们则陷入两难境地,上演了“Do Or Die”的抉择。其中,有着“大模型六小虎”之称的六家AI独角兽公司(智谱AI、百川智能、月之暗面、MiniMax、阶跃星辰及零一万物),纷纷开始转型:2025年伊始,李开复的零一万物宣布转型,不再追逐超大模型,而是聚焦AI商业化应用;紧接着,消息称百川智能放弃B端金融市场,聚焦AI医疗;月之暗面开始削减K
    华尔街科技眼 2025-03-12 17:37 166浏览
  • 本文介绍Android系统主板应用配置默认获取管理所有文件权限方法,基于触觉智能SBC3588行业主板演示,搭载了瑞芯微RK3588芯片,八核处理器,6T高算力NPU;音视频接口、通信接口等各类接口一应俱全,支持安卓Android、Linux、开源鸿蒙OpenHarmony、银河麒麟Kylin等操作系统。配置前提在配置前,建议先将应用配置成系统应用,不然配置后系统每次重启后都会弹窗提示是否获取权限。应用配置成系统应用,可参考以下链接方法:瑞芯微开发板/主板Android系统APK签名文件使用方法
    Industio_触觉智能 2025-03-12 14:34 54浏览
  • 曾经听过一个“隐形经理”的故事:有家公司,新人进来后,会惊讶地发现老板几乎从不在办公室。可大家依旧各司其职,还能在关键时刻自发协作,把项目完成得滴水不漏。新员工起初以为老板是“放羊式”管理,结果去茶水间和老员工聊过才发现,这位看似“隐形”的管理者其实“无处不在”,他提前铺好了企业文化、制度和激励机制,让一切运行自如。我的观点很简单:管理者的最高境界就是——“无为而治”。也就是说,你的存在感不需要每天都凸显,但你的思路、愿景、机制早已渗透到组织血液里。为什么呢?因为真正高明的管理,不在于事必躬亲,
    优思学院 2025-03-12 18:24 84浏览
  • 在海洋监测领域,基于无人艇能够实现高效、实时、自动化的海洋数据采集,从而为海洋环境保护、资源开发等提供有力支持。其中,无人艇的控制算法训练往往需要大量高质量的数据支持。然而,海洋数据采集也面临数据噪声和误差、数据融合与协同和复杂海洋环境适应等诸多挑战,制约着无人艇技术的发展。针对这些挑战,我们探索并推出一套基于多传感器融合的海洋数据采集系统,能够高效地采集和处理海洋环境中的多维度数据,为无人艇的自主航行和控制算法训练提供高质量的数据支持。一、方案架构无人艇要在复杂海上环境中实现自主导航,尤其是完
    康谋 2025-03-13 09:53 49浏览
  • 前言在快速迭代的科技浪潮中,汽车电子技术的飞速发展不仅重塑了行业的面貌,也对测试工具提出了更高的挑战与要求。作为汽车电子测试领域的先锋,TPT软件始终致力于为用户提供高效、精准、可靠的测试解决方案。新思科技出品的TPT软件迎来了又一次重大更新,最新版本TPT 2024.12将进一步满足汽车行业日益增长的测试需求,推动汽车电子技术的持续革新。基于当前汽车客户的实际需求与痛点,结合最新的技术趋势,对TPT软件进行了全面的优化与升级。从模型故障注入测试到服务器函数替代C代码函数,从更准确的需求链接到P
    北汇信息 2025-03-13 14:43 53浏览
  •        随着人工智能算力集群的爆发式增长,以及5.5G/6G通信技术的演进,网络数据传输速率的需求正以每年30%的速度递增。万兆以太网(10G Base-T)作为支撑下一代数据中心、高端交换机的核心组件,其性能直接决定了网络设备的稳定性与效率。然而,万兆网络变压器的技术门槛极高:回波损耗需低于-20dB(比千兆产品严格30%),耐压值需突破1500V(传统产品仅为1000V),且需在高频信号下抑制电磁干扰。全球仅有6家企业具备规模化量产能力,而美信科
    中科领创 2025-03-13 11:24 44浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦