0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用NXP MCX-N板卡新增命令控制

安富利 来源:与非网 2025-03-17 13:38 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

恩智浦“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

78247b40-fe58-11ef-9310-92fbcf53809c.png

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工程文件和链接脚本

后缀名为*.mex是MCUXpresso Config Tools的输入文件

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

03 编译、下载、调试

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

784b9612-fe58-11ef-9310-92fbcf53809c.png

04 添加FreeRTOS组件

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

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

1. 鼠标右键单击工程名

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

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

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

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

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

7866781a-fe58-11ef-9310-92fbcf53809c.png

78825c10-fe58-11ef-9310-92fbcf53809c.png

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

789ca7dc-fe58-11ef-9310-92fbcf53809c.png

05 新建FreeRTOS任务

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

(滑动查看)

int main(void)
{
  // 管脚复用和配置
  BOARD_InitBootClocks();
  BOARD_InitBootPeripherals();
  BOARD_InitBootPins();
  BOARD_InitSWD_DEBUGPins();


  // 调试串口打印日志
  BOARD_InitDebugConsole();


  PRINTF("
");
  PRINTF("
 Build: %s %s

", __DATE__, __TIME__);


  if (xTaskCreate(zygote_task, "zygote_task", ZYGOTE_TASK_STACK_SIZE, NULL, ZYGOTE_TASK_PRIORITY, NULL) !=
        pdPASS)
    {
        PRINTF("Task creation failed!.
");
        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 
", zygote_loop_cnt);


    vTaskDelay(pdMS_TO_TICKS(2000));
  }
}

78d94548-fe58-11ef-9310-92fbcf53809c.png

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
", 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 generates
a table that gives information on each task in the system. */
static const CLI_Command_Definition_t xLedSet =
{
  "ledset", /* The command string to type. */
  "
ledset  :
 set r/g/b led status
example: ledset r on or ledset g off
",
  prvLedSetCommand, /* The function to run. */
  2 /* 2 parameters are expected. */
};




/* Structure that defines the "ledget" command line command.  This generates
a table that gives information on each task in the system. */
static const CLI_Command_Definition_t xLedGet =
{
  "ledget", /* The command string to type. */
  "
ledget :
 get r/g/b led status
example: ledget r or ledget g
",
  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 
", zygote_loop_cnt);


    vTaskDelay(pdMS_TO_TICKS(2000));
  }
}

08 验证

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

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

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

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

78f584c4-fe58-11ef-9310-92fbcf53809c.png

790d1968-fe58-11ef-9310-92fbcf53809c.gif

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 恩智浦
    +关注

    关注

    14

    文章

    6148

    浏览量

    155326
  • RGB
    RGB
    +关注

    关注

    4

    文章

    841

    浏览量

    62376
  • 命令
    +关注

    关注

    5

    文章

    767

    浏览量

    24155
  • 开发环境
    +关注

    关注

    1

    文章

    277

    浏览量

    17723

原文标题:用户测评(四):使用NXP MCX-N板卡新增命令控制

文章出处:【微信号:AvnetAsia,微信公众号:安富利】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    恩智浦 MCX N系列之电源管理(MCX N94/54与MCX N23)

    给大家揭秘MCX N系列在电源管理方面的卓越性能。电源管理对于硬件设计的优化以及低功耗应用的实现至关重要,因此,深入了解MCX N系列的电源管理机制对于开发者而言意义非凡。同时小编也列
    的头像 发表于 12-05 09:49 2612次阅读
    恩智浦 <b class='flag-5'>MCX</b> <b class='flag-5'>N</b>系列之电源管理(<b class='flag-5'>MCX</b> <b class='flag-5'>N</b>94/54与<b class='flag-5'>MCX</b> <b class='flag-5'>N</b>23)

    如何使用MCX N ROM API进行内部闪存擦除/编程?

    使用 MCX N ROM API 进行内部闪存擦除/编程
    发表于 03-27 07:04

    贴片代码MARKING丝印手册,新增NXP

    本帖最后由 lkjh88 于 2016-7-10 13:52 编辑 贴片代码MARKING丝印手册,新增NXP
    发表于 07-10 13:50

    恩智浦全新MCX N控制器推出!助力实现高性能、低功耗的边缘安全智能

    恩智浦全新MCX N控制器首次集成恩智浦专用神经处理单元(NPU),可助力实现高性能、低功耗的边缘安全智能。      新闻提要    恩智浦半导体宣布推出MCX
    的头像 发表于 11-11 08:15 2072次阅读

    贸泽电子开售适用于智能电机控制和机器学习应用的 NXP Semiconductors MCX控制

    Semiconductors的MCX工业和物联网微控制器 (MCU)。这些新款MCU属于高性能、低功耗微控制器,配备智能外设和加速器,适用于安全、智能的电机控制和机器学习应用。  
    发表于 04-12 15:10 1256次阅读

    基于MCX NMCX A系列微控制器,NXP宣布推出无线多协议MCX W系列

    MCX W 是MCX 产品组合中的重要成员,与其他系列共享通用的Arm® Cortex®-M33内核和外设平台。MCX W系列通过支持Matter、Thread、Zigbee和Bluetooth
    的头像 发表于 04-17 14:42 11.7w次阅读
    基于<b class='flag-5'>MCX</b> <b class='flag-5'>N</b>和<b class='flag-5'>MCX</b> A系列微<b class='flag-5'>控制</b>器,<b class='flag-5'>NXP</b>宣布推出无线多协议<b class='flag-5'>MCX</b> W系列

    富昌电子推荐两款恩智浦的MCX A和MCX N系列微控制

    富昌电子为您推荐恩智浦的 MCX A 和 MCX N 系列微控制器开发板 FRDM-MCXA153 和 FRDM-MCXN947,帮助您快速开始基于
    的头像 发表于 05-09 16:44 2463次阅读

    MCX N系列微控制器适用于安全、智能的电机控制和机器学习应用

    学习应用。 NXP全新MCX N系列微控制器搭载Arm Cortex-M33 CPU,配备智能外设和加速器、通信和信号处理功能,可扩展性强,易于开发。
    的头像 发表于 06-05 09:06 2288次阅读

    NXP MCX N23和MCX N94/54的不同之处

    继2024年一月份发布了MCXN94/54系列之后,NXP又在6月份发布了N系列的第二款产品,MCX N23系列,下面小编就为大家揭开它的神秘面纱,来看看这款产品有何特点,了解一下它和
    的头像 发表于 11-01 12:35 2355次阅读
    <b class='flag-5'>NXP</b> <b class='flag-5'>MCX</b> <b class='flag-5'>N</b>23和<b class='flag-5'>MCX</b> <b class='flag-5'>N</b>94/54的不同之处

    用户测评之体验NXP MCX-N板卡的NPU功能

    前言 恩智浦“FRDM-MCXN947”评测活动由安富利和与非网协同举办。 01 NXP FRDM-MCXN947: HMI初体验 N947是NXP推出的MCX系列带NPU的一款产品,
    的头像 发表于 01-17 10:27 2268次阅读
    用户测评之体验<b class='flag-5'>NXP</b> <b class='flag-5'>MCX-N</b><b class='flag-5'>板卡</b>的NPU功能

    使用NXP MCX-N板卡搭建环境及点灯

    前言     恩智浦“ FRDM-MCXN947 ”评测活动由安富利和与非网协同举办。本篇内容由与非网用户发布,已授权转载许可。原文可在与非网(eefocus)工程师社区查看。 简介 NXP
    的头像 发表于 02-12 09:07 2528次阅读
    使用<b class='flag-5'>NXP</b> <b class='flag-5'>MCX-N</b><b class='flag-5'>板卡</b>搭建环境及点灯

    贸泽开售NXP MCX E系列MCU:专为高要求边缘应用打造的安全可靠新选择

    ^®^ Semiconductors MCX E注重可靠性/安全性的微控制器 (MCU)。MCX E系列属于NXP丰富的MCX工业和物联网微
    的头像 发表于 11-18 14:18 864次阅读
    贸泽开售<b class='flag-5'>NXP</b> <b class='flag-5'>MCX</b> E系列MCU:专为高要求边缘应用打造的安全可靠新选择

    探索MCX E24系列微控制器:工业与物联网应用的理想之选

    探索MCX E24系列微控制器:工业与物联网应用的理想之选 在工业和物联网(IIoT)领域,对高性能、高可靠性微控制器的需求与日俱增。NXPMCX
    的头像 发表于 12-24 11:10 659次阅读

    NXP MCX W71x和W72x连接微控制器:物联网与工业应用新选择

    NXP MCX W71x和W72x连接微控制器:物联网与工业应用新选择 在电子设备不断智能化、互联化的今天,微控制器作为设备的核心大脑,其性能和功能直接影响着整个系统的表现。
    的头像 发表于 12-24 13:55 770次阅读

    NXP MCX C系列微控制器:入门级低功耗解决方案

    NXP MCX C系列微控制器:入门级低功耗解决方案 在电子设计领域,寻找一款既经济实惠又具备低功耗特性的微控制器是许多工程师的目标。NXP
    的头像 发表于 12-24 14:00 957次阅读