全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 控制/MCU >

恩智浦MCU教程 基于MCUXpresso和FRDM-MCXA346的RT-Threa

时间:2025-08-21 09:49

人气:

作者:admin

标签:   恩智  基于  mcu  MC  教程 

导读:本篇还是以移植RT-Thread Nano到MCUXpresso IDE为主,移植的代码可以在nxpic.org.cn论坛搜索到。...

RT-Thread Nano是一个极简版的硬实时内核,Nano简介与下载 具体见官方。

介绍完官方下载地址,本篇还是以移植RT-Thread Nano到MCUXpresso IDE为主,移植的代码可以在nxpic.org.cn论坛搜索到。稍后也会有基于MCUXpresso VSC(Visual Studio Code)的介绍文档。

简单运行

1.准备一台安装有最新MCUXpresso IDE的PC和一块FRDM-MCXA346开发板:

6b23686a-7e29-11f0-a18e-92fbcf53809c.png

2. 导入代码包,运行结果:

6b4cccaa-7e29-11f0-a18e-92fbcf53809c.png

软件下载

1.RT-Thread Nano源代码下载

2.MCUXpresso SDK下载

3.MCUXpresso IDE下载

4.MCUXpresso Config Tool下载,这个不是必须的,IDE自带的也有

移植步骤

1.导入MCUXpresso SDK到MCUXpresso IDE,直接把SDK的zip包拖到这个窗口里就行:

6b5d43fa-7e29-11f0-a18e-92fbcf53809c.png

2.创建一个新工程,咱们这里就用lpuart的polling的example为模板好了,创建好后,顺手改个工程名字:

6b7bdf04-7e29-11f0-a18e-92fbcf53809c.png

6b9570a4-7e29-11f0-a18e-92fbcf53809c.png

3.将RT-Thread Nano源代码文件复制进工程,并且包含进编译序列:

6ba3be8e-7e29-11f0-a18e-92fbcf53809c.png

6bb71fec-7e29-11f0-a18e-92fbcf53809c.png

6bd3f59a-7e29-11f0-a18e-92fbcf53809c.png

4.移除RT-Thread Nano里咱们目前平台不需要的文件,比如bsp文件夹,libcpu文件夹下边的risc-v文件夹,libcpuarm文件夹下边的arm926, armv6, cortex-a, cortex-m0, cortex-m23, cortex-m3, cortex-m4, cortex-m7,cortex-r4(保留libcpuarm下的common和cortex-m33文件夹):

6bed8820-7e29-11f0-a18e-92fbcf53809c.png

5.将divsi3.S, context_iar.S, context_rvds.s, syscall_iar.S, syscall_rvds.S移除出编译序列:

6c022e92-7e29-11f0-a18e-92fbcf53809c.png

适配 RT-Thread Nanoo

1.把lpuart_polling.c改成main.c:

6c193e7a-7e29-11f0-a18e-92fbcf53809c.png

2.将rt-thread/include和rt-thread/components/finsh两个目录添加到工程的include路径:

6c2e36e0-7e29-11f0-a18e-92fbcf53809c.png

3.将rt-thread nano源代码bsp\_template路径下的rtconfig.h和board.c复制到工程的source目录下,这里我把board.c重命名为rtt_board.c:

6c461ff8-7e29-11f0-a18e-92fbcf53809c.png

4.编译后编译器提醒有两个错误,提醒移植的时候添加必要的API:

6c64a892-7e29-11f0-a18e-92fbcf53809c.png

5.将"MCXA346.h", "app.h"和"fsl_lpuart.h"添加到source/board.c文件中:

6c8e50ac-7e29-11f0-a18e-92fbcf53809c.png

6.在sourceoard.cvoid rt_hw_board_init(void)函数中添加BOARD_InitHardware();和SysTick_Config(SystemCoreClock/RT_TICK_PER_SECOND):

6ca1edd8-7e29-11f0-a18e-92fbcf53809c.png

7.在sourceoard.c中用SysTick_Handler()替换rt_os_tick_callback():

6cc69732-7e29-11f0-a18e-92fbcf53809c.png

8.隐去TODO 2和TODO 3的提醒,TODO 2在example初始化的地方已经做了调试串口的初始化了,并且在TODO 3里添加如下代码:

6cd8fdc8-7e29-11f0-a18e-92fbcf53809c.png

6cf0a220-7e29-11f0-a18e-92fbcf53809c.png

9.将main.c的头文件修改为:

6d033016-7e29-11f0-a18e-92fbcf53809c.png

10.将main.c核心的main代码修改为:

6d1cb9be-7e29-11f0-a18e-92fbcf53809c.png

11.编译后提醒hardfault函数重复定义了,所以要把工程生成的semihost_hardfualt.c删除掉:

6d35d39a-7e29-11f0-a18e-92fbcf53809c.png

12.在rtconfig.h里打开#define RT_USING_CONSOLE宏,编译并运行,记得打开串口中断哦:

6d4cd5ae-7e29-11f0-a18e-92fbcf53809c.png

13.运行后,发现会进入Hardfault_handler()并且串口无打印。先来解决串口打印的问题:

6d62bf9a-7e29-11f0-a18e-92fbcf53809c.png

14.需要在startupstartup_mcxa346.c的ResetISR()函数中把main隐藏掉,用rt-thread nano的entry()替代,如下图:

在entry()的函数里会调用rt_hw_board_init()来初始化硬件。 编译并运行,这时候hardfault应该就会打印了:

6d80aab4-7e29-11f0-a18e-92fbcf53809c.png

15.Hard fault打印的信息,hard fault的原因本程序员找了些小时数,原因是需要修改分散加载文件:

6da8b7c0-7e29-11f0-a18e-92fbcf53809c.png

16.鼠标右键工程名字,选在C/C++ Build -> Settings -> MCU Linker-> Managed Linker Script禁用Manage linker script。要手工修改下分散加载文件:

6dbdc070-7e29-11f0-a18e-92fbcf53809c.png

17.将如下区段加入到frdmmcxa346_rt_thread_nano_mcux_Debug.ld中,在“> PROGRAM_FLASH”区段:

-->
/***************RTOS
add**********************/
    /* section information for finsh shell*/
    . = ALIGN(4);
    __fsymtab_start = .;
    KEEP(*(FSymTab))
    __fsymtab_end = .;
    . = ALIGN(4);
    __vsymtab_start = .;
    KEEP(*(VSymTab))
    __vsymtab_end = .;
    . = ALIGN(4);
    /* section information for utest*/
    . = ALIGN(4);
    __rt_utest_tc_tab_start = .;
    KEEP(*(UtestTcTab))
    __rt_utest_tc_tab_end = .;
    /* section information for at server */
    . = ALIGN(4);
    __rtatcmdtab_start = .;
    KEEP(*(RtAtCmdTab))
    __rtatcmdtab_end = .;
    . = ALIGN(4);
    /* section information for initial.*/
    . = ALIGN(4);
    __rt_init_start = .;
    KEEP(*(SORT(.rti_fn*)))
    __rt_init_end = .;
    . = ALIGN(4);
  /* section information for modules */
  . = ALIGN(4);
  __rtmsymtab_start = .;
  KEEP(*(RTMSymTab))
  __rtmsymtab_end = .;
    . = ALIGN(4);
    PROVIDE(__ctors_start__ = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array))
    PROVIDE(__ctors_end__ = .);
        . = ALIGN(4);

6dd786ae-7e29-11f0-a18e-92fbcf53809c.png

18.编译并运行,RT-Thread Nano就正常打印了:

6df7b528-7e29-11f0-a18e-92fbcf53809c.png

恩智浦致力于打造安全的连接和基础设施解决方案,为智慧生活保驾护航。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信