介绍

FRDM-MCXW71这个板子是NXP官方赠送给我的,到手已经快2年了,闲来无事给它移植了RTT;这篇文章简单介绍一下RT-Thread系统移植过程,给广大NXP MCU爱好者一个参考

img

移植

board

board\SConscript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from building import *

cwd = GetCurrentDir()

# add the general drivers.
src = Split("""
board.c
MCUX_Config/board/clock_config.c
MCUX_Config/board/pin_mux.c
""")

CPPPATH = [cwd, cwd + '/MCUX_Config/board']
CPPDEFINES = ['DEBUG', 'CPU_MCXW716CMFPA']

group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES=CPPDEFINES)

Return('group')

board\Kconfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
menu "Hardware Drivers Config"

config SOC_MCXW71
bool
select SOC_MCXW71_SERIES
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y

menu "On-chip Peripheral Drivers"

config BSP_USING_PIN
bool "Enable GPIO"
select RT_USING_PIN
default y

menuconfig BSP_USING_UART
bool "Enable UART"
default y
select RT_USING_SERIAL
if BSP_USING_UART
config BSP_USING_UART4
bool "Enable UART1"
default y
endif

endmenu

endmenu

board\board.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
* Copyright (c) 2006-2024, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2009-09-22 Bernard add board.h to this bsp
* 2010-02-04 Magicoe add board.h to LPC176x bsp
* 2013-12-18 Bernard porting to LPC4088 bsp
* 2017-08-02 XiaoYang porting to LPC54608 bsp
*/

#ifndef __BOARD_H__
#define __BOARD_H__

#include <stdint.h>

#include <rtthread.h>

#include "clock_config.h"
#include "fsl_common.h"
#include "fsl_gpio.h"
#include "pin_mux.h"
#include "fsl_edma.h"

// <RDTConfigurator URL="http://www.rt-thread.com/eclipse">

// </RDTConfigurator>
#if defined(__ARMCC_VERSION)
extern int Image$$ARM_LIB_HEAP$$ZI$$Base;
extern int Image$$ARM_LIB_STACK$$ZI$$Base;
#define HEAP_BEGIN ((void *)&Image$$ARM_LIB_HEAP$$ZI$$Base)
#define HEAP_END ((void*)&Image$$ARM_LIB_STACK$$ZI$$Base)
#elif defined(__ICCARM__)
#pragma section="HEAP"
#define HEAP_BEGIN (__section_begin("HEAP"))
#define HEAP_END (__section_end("HEAP"))
#elif defined(__GNUC__)
extern int __HeapBase;
extern int __HeapLimit;
#define HEAP_BEGIN ((void *)&__HeapBase)
#define HEAP_END ((void *)&__HeapLimit)
#endif

void rt_hw_board_init(void);

#endif

board\MCUX_Config\board\pin_mux.c,这里使能了RGB LED以及LPUART1作为RT-Thread最小系统外设

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
void BOARD_InitPins(void)
{
/* Clock Configuration: Peripheral clocks are enabled; module does not stall low power mode entry */
CLOCK_EnableClock(kCLOCK_GpioA);
/* Clock Configuration: Peripheral clocks are enabled; module does not stall low power mode entry */
CLOCK_EnableClock(kCLOCK_PortA);
/* Clock Configuration: Peripheral clocks are enabled; module does not stall low power mode entry */
CLOCK_EnableClock(kCLOCK_PortC);

gpio_pin_config_t LED_GREEN_config = {
.pinDirection = kGPIO_DigitalOutput,
.outputLogic = 0U
};
/* Initialize GPIO functionality on pin PTA19 (pin 14) */
GPIO_PinInit(BOARD_INITPINS_LED_GREEN_GPIO, BOARD_INITPINS_LED_GREEN_PIN, &LED_GREEN_config);

const port_pin_config_t LED_GREEN = {/* Internal pull-up/down resistor is disabled */
(uint16_t)kPORT_PullDisable,
/* Low internal pull resistor value is selected. */
(uint16_t)kPORT_LowPullResistor,
/* Fast slew rate is configured */
(uint16_t)kPORT_FastSlewRate,
/* Passive input filter is disabled */
(uint16_t)kPORT_PassiveFilterDisable,
/* Open drain output is disabled */
(uint16_t)kPORT_OpenDrainDisable,
/* Low drive strength is configured */
(uint16_t)kPORT_LowDriveStrength,
/* Normal drive strength is configured */
(uint16_t)kPORT_NormalDriveStrength,
/* Pin is configured as PTA19 */
(uint16_t)kPORT_MuxAsGpio,
/* Pin Control Register fields [15:0] are not locked */
(uint16_t)kPORT_UnlockRegister};
/* PORTA19 (pin 14) is configured as PTA19 */
PORT_SetPinConfig(BOARD_INITPINS_LED_GREEN_PORT, BOARD_INITPINS_LED_GREEN_PIN, &LED_GREEN);

const port_pin_config_t portc2_pin39_config = {/* Internal pull-up/down resistor is disabled */
(uint16_t)kPORT_PullDisable,
/* Low internal pull resistor value is selected. */
(uint16_t)kPORT_LowPullResistor,
/* Fast slew rate is configured */
(uint16_t)kPORT_FastSlewRate,
/* Passive input filter is disabled */
(uint16_t)kPORT_PassiveFilterDisable,
/* Open drain output is disabled */
(uint16_t)kPORT_OpenDrainDisable,
/* Low drive strength is configured */
(uint16_t)kPORT_LowDriveStrength,
/* Normal drive strength is configured */
(uint16_t)kPORT_NormalDriveStrength,
/* Pin is configured as LPUART1_RX */
(uint16_t)kPORT_MuxAlt3,
/* Pin Control Register fields [15:0] are not locked */
(uint16_t)kPORT_UnlockRegister};
/* PORTC2 (pin 39) is configured as LPUART1_RX */
PORT_SetPinConfig(PORTC, 2U, &portc2_pin39_config);

const port_pin_config_t portc3_pin40_config = {/* Internal pull-up/down resistor is disabled */
(uint16_t)kPORT_PullDisable,
/* Low internal pull resistor value is selected. */
(uint16_t)kPORT_LowPullResistor,
/* Fast slew rate is configured */
(uint16_t)kPORT_FastSlewRate,
/* Passive input filter is disabled */
(uint16_t)kPORT_PassiveFilterDisable,
/* Open drain output is disabled */
(uint16_t)kPORT_OpenDrainDisable,
/* Low drive strength is configured */
(uint16_t)kPORT_LowDriveStrength,
/* Normal drive strength is configured */
(uint16_t)kPORT_NormalDriveStrength,
/* Pin is configured as LPUART1_TX */
(uint16_t)kPORT_MuxAlt3,
/* Pin Control Register fields [15:0] are not locked */
(uint16_t)kPORT_UnlockRegister};
/* PORTC3 (pin 40) is configured as LPUART1_TX */
PORT_SetPinConfig(PORTC, 3U, &portc3_pin40_config);
}

board\linker_scripts,从NXP官方的MCXW71 SDK包里边获取

img

Libraries

Libraries\Kconfig

1
2
3
4
config SOC_MCX
bool
select ARCH_ARM_CORTEX_M33
select ARCH_ARM_CORTEX_FPU

Libraries\MCXW71\MCXW71,这些基本的BSP文件均可以从官方的SDK包里边提取:gcc编译要保证gcc目录文件齐全

img

Libraries\MCXW71\MCXW71\MCXW716C_features.h,去掉这个宏,否则编译不过

img

applications

applications\main.c,测试用例,这里使用pin驱动点亮RGB LED、驱动开发板按钮

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
* Copyright (c) 2006-2024, RT-Thread Development Team
* Copyright (c) 2019-2020, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2025-06-11 hywing first version
*
*/

#include <rtdevice.h>
#include <rtthread.h>
#include "drv_pin.h"

#define R_LED ((0*32)+21)
#define G_LED ((0*32)+20)
#define B_LED ((0*32)+19)
#define BUTTON_PIN ((2*32)+6)

static void sw_pin_cb(void *args);

int main(void)
{
/* Set Onboard RGB LEDS GPIOs as Output */
rt_pin_mode(R_LED, PIN_MODE_OUTPUT);
rt_pin_mode(G_LED, PIN_MODE_OUTPUT);
rt_pin_mode(B_LED, PIN_MODE_OUTPUT);

/* Set User Key */
rt_pin_mode(BUTTON_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_attach_irq(BUTTON_PIN, PIN_IRQ_MODE_FALLING, sw_pin_cb, RT_NULL);
rt_pin_irq_enable(BUTTON_PIN, 1);

rt_kprintf("NXP MCXW71 board!\r\n");

while (1)
{
rt_pin_write(R_LED, PIN_LOW);
rt_pin_write(G_LED, PIN_HIGH);
rt_pin_write(B_LED, PIN_HIGH);
rt_thread_mdelay(500);

rt_pin_write(R_LED, PIN_HIGH);
rt_pin_write(G_LED, PIN_LOW);
rt_pin_write(B_LED, PIN_HIGH);
rt_thread_mdelay(500);

rt_pin_write(R_LED, PIN_HIGH);
rt_pin_write(G_LED, PIN_HIGH);
rt_pin_write(B_LED, PIN_LOW);
rt_thread_mdelay(500);

rt_pin_write(R_LED, PIN_LOW);
rt_pin_write(G_LED, PIN_LOW);
rt_pin_write(B_LED, PIN_HIGH);
rt_thread_mdelay(500);

rt_pin_write(R_LED, PIN_LOW);
rt_pin_write(G_LED, PIN_HIGH);
rt_pin_write(B_LED, PIN_LOW);
rt_thread_mdelay(500);

rt_pin_write(R_LED, PIN_HIGH);
rt_pin_write(G_LED, PIN_LOW);
rt_pin_write(B_LED, PIN_LOW);
rt_thread_mdelay(500);

rt_pin_write(R_LED, PIN_LOW);
rt_pin_write(G_LED, PIN_LOW);
rt_pin_write(B_LED, PIN_LOW);
rt_thread_mdelay(500);

rt_pin_write(R_LED, PIN_HIGH);
rt_pin_write(G_LED, PIN_HIGH);
rt_pin_write(B_LED, PIN_HIGH);
rt_thread_mdelay(500);
}
}

static void sw_pin_cb(void *args)
{
rt_kprintf("sw pressed\r\n");
}

// end file

rt-thread

使用env工具导出的RT-Thread系统包,因为要用NXP工程要用到Cmake

img

顶层文件

CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
CMAKE_MINIMUM_REQUIRED(VERSION 3.10)

SET(CMAKE_SYSTEM_NAME Generic)
SET(CMAKE_SYSTEM_PROCESSOR cortex-m33)
#SET(CMAKE_VERBOSE_MAKEFILE ON)

SET(CMAKE_EXPORT_COMPILE_COMMANDS ON)

SET(CMAKE_C_COMPILER "C:/env-windows/tools/bin/../../tools/gnu_gcc/arm_gcc/mingw/bin/arm-none-eabi-gcc.exe")
SET(CMAKE_ASM_COMPILER "C:/env-windows/tools/bin/../../tools/gnu_gcc/arm_gcc/mingw/bin/arm-none-eabi-gcc.exe")
SET(CMAKE_C_FLAGS " -mcpu=cortex-m33 -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -Wall -D__FPU_PRESENT -gdwarf-2 -O0")
SET(CMAKE_ASM_FLAGS " -c -mcpu=cortex-m33 -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -x assembler-with-cpp -D__START=entry -D__STARTUP_CLEAR_BSS -gdwarf-2")
SET(CMAKE_C_COMPILER_WORKS TRUE)

SET(CMAKE_CXX_COMPILER "C:/env-windows/tools/bin/../../tools/gnu_gcc/arm_gcc/mingw/bin/arm-none-eabi-g++.exe")
SET(CMAKE_CXX_FLAGS " -Woverloaded-virtual -fno-exceptions -fno-rtti -mcpu=cortex-m33 -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -Wall -D__FPU_PRESENT -gdwarf-2 -O0")
SET(CMAKE_CXX_COMPILER_WORKS TRUE)

SET(CMAKE_OBJCOPY "C:/env-windows/tools/bin/../../tools/gnu_gcc/arm_gcc/mingw/bin/arm-none-eabi-objcopy.exe")
SET(CMAKE_SIZE "C:/env-windows/tools/bin/../../tools/gnu_gcc/arm_gcc/mingw/bin/arm-none-eabi-size.exe")

SET(CMAKE_EXE_LINKER_FLAGS " -mcpu=cortex-m33 -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -specs=nano.specs -specs=nosys.specs -Wl,--defsym=__heap_size__=0x10000,--gc-sections,-Map=rtthread.map,--print-memory-usage -T ${CMAKE_SOURCE_DIR}/board/linker_scripts/MCXW716_flash.ld -Wl,--gc-sections,--print-memory-usage")

SET(CMAKE_C_STANDARD 11)
SET(CMAKE_CXX_STANDARD 17)

PROJECT(rtthread C CXX ASM)

INCLUDE_DIRECTORIES(
.
applications
board
board/MCUX_Config/board
rt-thread/include
rt-thread/libcpu/arm/common
rt-thread/libcpu/arm/cortex-m33
rt-thread/components/drivers/include
rt-thread/components/drivers/phy
rt-thread/components/drivers/smp_call
rt-thread/components/finsh
rt-thread/components/libc/compilers/common/include
rt-thread/components/libc/compilers/newlib
rt-thread/components/libc/posix/io/epoll
rt-thread/components/libc/posix/io/eventfd
rt-thread/components/libc/posix/io/poll
rt-thread/components/libc/posix/ipc
rt-thread/components/utilities/ulog
Libraries/drivers
Libraries/drivers/config
Libraries/CMSIS/Core/Include
Libraries/MCXW71/MCXW71
Libraries/MCXW71/MCXW71/drivers
Libraries/MCXW71/MCXW71/drivers/romapi/flash
Libraries/MCXW71/MCXW71/drivers/romapi/mem_interface
Libraries/MCXW71/MCXW71/drivers/romapi/nboot
Libraries/MCXW71/MCXW71/drivers/romapi/runbootloader
)

ADD_DEFINITIONS(
-D_REENT_SMALL
-DDEBUG
-DCPU_MCXW716CMFPA
-D__RTTHREAD__
-DRT_USING_NEWLIBC
-DRT_USING_LIBC
-D_POSIX_C_SOURCE=1
)

# Library source files
SET(RT_APPLICATIONS_SOURCES
applications/main.c
)

SET(RT_COMPILER_SOURCES
rt-thread/components/libc/compilers/common/cctype.c
rt-thread/components/libc/compilers/common/cstdlib.c
rt-thread/components/libc/compilers/common/cstring.c
rt-thread/components/libc/compilers/common/ctime.c
rt-thread/components/libc/compilers/common/cunistd.c
rt-thread/components/libc/compilers/common/cwchar.c
rt-thread/components/libc/compilers/newlib/syscalls.c
)

SET(RT_DEVICEDRIVERS_SOURCES
rt-thread/components/drivers/core/device.c
rt-thread/components/drivers/hwtimer/hwtimer.c
rt-thread/components/drivers/ipc/completion_comm.c
rt-thread/components/drivers/ipc/completion_up.c
rt-thread/components/drivers/ipc/condvar.c
rt-thread/components/drivers/ipc/dataqueue.c
rt-thread/components/drivers/ipc/pipe.c
rt-thread/components/drivers/ipc/ringblk_buf.c
rt-thread/components/drivers/ipc/ringbuffer.c
rt-thread/components/drivers/ipc/waitqueue.c
rt-thread/components/drivers/ipc/workqueue.c
rt-thread/components/drivers/pin/dev_pin.c
rt-thread/components/drivers/serial/dev_serial.c
)

SET(RT_DRIVERS_SOURCES
board/MCUX_Config/board/clock_config.c
board/MCUX_Config/board/pin_mux.c
board/board.c
Libraries/drivers/drv_pin.c
Libraries/drivers/drv_uart.c
)

SET(RT_FINSH_SOURCES
rt-thread/components/finsh/msh.c
rt-thread/components/finsh/msh_parse.c
rt-thread/components/finsh/shell.c
rt-thread/components/finsh/cmd.c
)

SET(RT_KERNEL_SOURCES
rt-thread/src/clock.c
rt-thread/src/components.c
rt-thread/src/cpu_up.c
rt-thread/src/defunct.c
rt-thread/src/idle.c
rt-thread/src/ipc.c
rt-thread/src/irq.c
rt-thread/src/kservice.c
rt-thread/src/mem.c
rt-thread/src/mempool.c
rt-thread/src/object.c
rt-thread/src/scheduler_comm.c
rt-thread/src/scheduler_up.c
rt-thread/src/thread.c
rt-thread/src/timer.c
)

SET(RT_KLIBC_SOURCES
rt-thread/src/klibc/kstring.c
rt-thread/src/klibc/kerrno.c
rt-thread/src/klibc/rt_vsscanf.c
rt-thread/src/klibc/rt_vsnprintf_tiny.c
rt-thread/src/klibc/kstdio.c
)

SET(RT_LIBCPU_SOURCES
rt-thread/libcpu/arm/common/atomic_arm.c
rt-thread/libcpu/arm/common/div0.c
rt-thread/libcpu/arm/common/showmem.c
rt-thread/libcpu/arm/cortex-m33/context_gcc.S
rt-thread/libcpu/arm/cortex-m33/cpuport.c
rt-thread/libcpu/arm/cortex-m33/syscall_gcc.S
rt-thread/libcpu/arm/cortex-m33/trustzone.c
)

SET(RT_LIBRARIES_SOURCES
Libraries/MCXW71/MCXW71/drivers/fsl_edma.c
Libraries/MCXW71/MCXW71/drivers/fsl_spc.c
Libraries/MCXW71/MCXW71/drivers/fsl_cmc.c
Libraries/MCXW71/MCXW71/drivers/fsl_lpuart.c
Libraries/MCXW71/MCXW71/gcc/startup_MCXW716C.S
Libraries/MCXW71/MCXW71/drivers/fsl_crc.c
Libraries/MCXW71/MCXW71/drivers/fsl_gpio.c
Libraries/MCXW71/MCXW71/drivers/fsl_ccm32k.c
Libraries/MCXW71/MCXW71/drivers/fsl_common.c
Libraries/MCXW71/MCXW71/system_MCXW716C.c
Libraries/MCXW71/MCXW71/drivers/fsl_clock.c
Libraries/MCXW71/MCXW71/drivers/fsl_common_arm.c
)

SET(RT_POSIX_SOURCES
)

SET(RT_UTESTCASES_SOURCES
)

SET(RT_UTILITIES_SOURCES
rt-thread/components/utilities/ulog/ulog.c
rt-thread/components/utilities/ulog/backend/console_be.c
)

# Library search paths
# Library local macro definitions
SET(RT_DEVICEDRIVERS_DEFINES
__RT_IPC_SOURCE__
)

SET(RT_KERNEL_DEFINES
__RT_KERNEL_SOURCE__
)

# Library dependencies
SET(RT_COMPILER_LIBS
c
m
)

# Libraries
ADD_LIBRARY(rtt_Compiler OBJECT ${RT_COMPILER_SOURCES})
ADD_LIBRARY(rtt_DeviceDrivers OBJECT ${RT_DEVICEDRIVERS_SOURCES})
ADD_LIBRARY(rtt_Drivers OBJECT ${RT_DRIVERS_SOURCES})
ADD_LIBRARY(rtt_Finsh OBJECT ${RT_FINSH_SOURCES})
ADD_LIBRARY(rtt_Kernel OBJECT ${RT_KERNEL_SOURCES})
ADD_LIBRARY(rtt_klibc OBJECT ${RT_KLIBC_SOURCES})
ADD_LIBRARY(rtt_libcpu OBJECT ${RT_LIBCPU_SOURCES})
ADD_LIBRARY(rtt_Libraries OBJECT ${RT_LIBRARIES_SOURCES})
ADD_LIBRARY(rtt_Utilities OBJECT ${RT_UTILITIES_SOURCES})

# Interface libraries
ADD_LIBRARY(rtt_POSIX INTERFACE)
ADD_LIBRARY(rtt_utestcases INTERFACE)

# Private macros
TARGET_COMPILE_DEFINITIONS(rtt_DeviceDrivers PRIVATE ${RT_DEVICEDRIVERS_DEFINES})
TARGET_COMPILE_DEFINITIONS(rtt_Kernel PRIVATE ${RT_KERNEL_DEFINES})

# Interface library search paths
TARGET_LINK_LIBRARIES(rtt_Compiler INTERFACE ${RT_COMPILER_LIBS})

ADD_EXECUTABLE(${CMAKE_PROJECT_NAME}.elf ${RT_APPLICATIONS_SOURCES})
TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME}.elf
rtt_Compiler
rtt_DeviceDrivers
rtt_Drivers
rtt_Finsh
rtt_Kernel
rtt_klibc
rtt_libcpu
rtt_Libraries
rtt_Utilities
rtt_POSIX
rtt_utestcases
)

ADD_CUSTOM_COMMAND(TARGET ${CMAKE_PROJECT_NAME}.elf POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -O binary --remove-section=.boot_data --remove-section=.image_vertor_table --remove-section=.ncache ${CMAKE_PROJECT_NAME}.elf rtthread.bin
COMMAND ${CMAKE_SIZE} ${CMAKE_PROJECT_NAME}.elf
)

# if custom.cmake is exist, add it
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/custom.cmake)
include(${CMAKE_CURRENT_SOURCE_DIR}/custom.cmake)
endif()

Kconfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mainmenu "RT-Thread Configuration"

BSP_DIR := .

RTT_DIR := ../../../../..

PKGS_DIR := packages

config SOC_MCX
bool
select ARCH_ARM_CORTEX_M33
select ARCH_ARM_CORTEX_SECURE
default y

source "$(RTT_DIR)/Kconfig"
osource "$PKGS_DIR/Kconfig"
rsource "Libraries/Kconfig"
rsource "board/Kconfig"

rtconfig.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
import os
import sys

# toolchains options
ARCH='arm'
CPU='cortex-m33'
CROSS_TOOL='gcc'
BOARD_NAME = 'lpcxpresso'
BSP_LIBRARY_TYPE = 'MCXW71'

if os.getenv('RTT_CC'):
CROSS_TOOL = os.getenv('RTT_CC')
if os.getenv('RTT_ROOT'):
RTT_ROOT = os.getenv('RTT_ROOT')

# cross_tool provides the cross compiler
# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR
if CROSS_TOOL == 'gcc':
PLATFORM = 'gcc'
EXEC_PATH = r'C:\Users\XXYYZZ'
elif CROSS_TOOL == 'keil':
PLATFORM = 'armclang'
EXEC_PATH = r'C:/Keil_v5'
elif CROSS_TOOL == 'iar':
PLATFORM = 'iccarm'
EXEC_PATH = r'C:\Program Files\IAR Systems\Embedded Workbench 9.1'

if os.getenv('RTT_EXEC_PATH'):
EXEC_PATH = os.getenv('RTT_EXEC_PATH')

BUILD = 'debug'
#BUILD = 'release'

if PLATFORM == 'gcc':
PREFIX = 'arm-none-eabi-'
CC = PREFIX + 'gcc'
CXX = PREFIX + 'g++'
AS = PREFIX + 'gcc'
AR = PREFIX + 'ar'
LINK = PREFIX + 'gcc'
TARGET_EXT = 'elf'
SIZE = PREFIX + 'size'
OBJDUMP = PREFIX + 'objdump'
OBJCPY = PREFIX + 'objcopy'
STRIP = PREFIX + 'strip'

DEVICE = ' -mcpu=' + CPU + ' -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections'
CFLAGS = DEVICE + ' -Wall -D__FPU_PRESENT'
AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__START=entry -D__STARTUP_CLEAR_BSS'
LFLAGS = DEVICE + ' -specs=nano.specs -specs=nosys.specs -Wl,--defsym=__heap_size__=0x10000,--gc-sections,-Map=rtthread.map,--print-memory-usage -Tboard/linker_scripts/MCXW716_flash.ld'

CPATH = ''
LPATH = ''

if BUILD == 'debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
CFLAGS += ' -O0'
else:
CFLAGS += ' -O2 -Os'

POST_ACTION = OBJCPY + ' -O binary --remove-section=.boot_data --remove-section=.image_vertor_table --remove-section=.ncache $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n'

# module setting
CXXFLAGS = ' -Woverloaded-virtual -fno-exceptions -fno-rtti'
CXXFLAGS += CFLAGS

M_CFLAGS = CFLAGS + ' -mlong-calls -fPIC '
M_CXXFLAGS = CXXFLAGS + ' -mlong-calls -fPIC'
M_LFLAGS = DEVICE + CXXFLAGS + ' -Wl,--gc-sections,-z,max-page-size=0x4' +\
' -shared -fPIC -nostartfiles -static-libgcc'
M_POST_ACTION = STRIP + ' -R .hash $TARGET\n' + SIZE + ' $TARGET \n'

elif PLATFORM == 'armcc':
# toolchains
CC = 'armcc'
CXX = 'armcc'
AS = 'armasm'
AR = 'armar'
LINK = 'armlink'
TARGET_EXT = 'axf'

DEVICE = ' --cpu ' + CPU + '.fp.sp'
CFLAGS = DEVICE + ' --apcs=interwork'
AFLAGS = DEVICE
LFLAGS = DEVICE + ' --libpath "' + EXEC_PATH + '/ARM/ARMCC/lib" --info sizes --info totals --info unused --info veneers --list rtthread.map --scatter "board/linker_scripts/MCXW716_flash" '

LFLAGS += ' --keep *.o(.rti_fn.*) --keep *.o(FSymTab) --keep *.o(VSymTab)'

CFLAGS += ' --diag_suppress=66,1296,186,6134'
CFLAGS += ' -I' + EXEC_PATH + '/ARM/RV31/INC'
LFLAGS += ' --libpath ' + EXEC_PATH + '/ARM/RV31/LIB'

EXEC_PATH += '/arm/bin40/'

if BUILD == 'debug':
CFLAGS += ' -g -O0'
AFLAGS += ' -g'
else:
CFLAGS += ' -O2'

CXXFLAGS = CFLAGS
CFLAGS += ' --c99'

POST_ACTION = 'fromelf -z $TARGET'
# POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET'

elif PLATFORM == 'armclang':
# toolchains
CC = 'armclang'
CXX = 'armclang'
AS = 'armasm'
AR = 'armar'
LINK = 'armlink'
TARGET_EXT = 'axf'

DEVICE = ' --cpu Cortex-M33 '
CFLAGS = ' --target=arm-arm-none-eabi'
CFLAGS += ' -mcpu=' + CPU
CFLAGS += ' -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar '
CFLAGS += ' -gdwarf-3 -ffunction-sections '
AFLAGS = DEVICE + ' --apcs=interwork '
LFLAGS = DEVICE + ' --info sizes --info totals --info unused --info veneers '
LFLAGS += ' --list rt-thread.map '
LFLAGS += r' --strict --scatter "board/linker_scripts/MCXW716_flash" '
CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCLANG/include'
LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCLANG/lib'

EXEC_PATH += '/ARM/ARMCLANG/bin/'

if BUILD == 'debug':
CFLAGS += ' -g -O1' # armclang recommend
AFLAGS += ' -g'
else:
CFLAGS += ' -O2'

CXXFLAGS = CFLAGS
CFLAGS += ' -std=c99'

POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET'

elif PLATFORM == 'iccarm':
CC = 'iccarm'
CXX = 'iccarm'
AS = 'iasmarm'
AR = 'iarchive'
LINK = 'ilinkarm'
TARGET_EXT = 'out'

DEVICE = ' -D__FPU_PRESENT'

CFLAGS = DEVICE
CFLAGS += ' --diag_suppress Pa050'
CFLAGS += ' --no_cse'
CFLAGS += ' --no_unroll'
CFLAGS += ' --no_inline'
CFLAGS += ' --no_code_motion'
CFLAGS += ' --no_tbaa'
CFLAGS += ' --no_clustering'
CFLAGS += ' --no_scheduling'
CFLAGS += ' --debug'
CFLAGS += ' --endian=little'
CFLAGS += ' --cpu=' + CPU
CFLAGS += ' -e'
CFLAGS += ' --fpu=None'
CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"'
CFLAGS += ' -Ol'
CFLAGS += ' --use_c++_inline'

AFLAGS = ''
AFLAGS += ' -s+'
AFLAGS += ' -w+'
AFLAGS += ' -r'
AFLAGS += ' --cpu ' + CPU
AFLAGS += ' --fpu None'

if BUILD == 'debug':
CFLAGS += ' --debug'
CFLAGS += ' -On'
else:
CFLAGS += ' -Oh'

LFLAGS = ' --config "board/linker_scripts/MCXW716_flash.icf"'
LFLAGS += ' --redirect _Printf=_PrintfTiny'
LFLAGS += ' --redirect _Scanf=_ScanfSmall'
LFLAGS += ' --entry __iar_program_start'

CXXFLAGS = CFLAGS

EXEC_PATH = EXEC_PATH + '/arm/bin/'
POST_ACTION = 'ielftool --bin $TARGET rtthread.bin'

def dist_handle(BSP_ROOT, dist_dir):
cwd_path = os.getcwd()
sys.path.append(os.path.join(os.path.dirname(BSP_ROOT), '..', 'tools'))
from sdk_dist import dist_do_building
dist_do_building(BSP_ROOT, dist_dir)

SConstruct

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import os
import sys
import rtconfig

if os.getenv('RTT_ROOT'):
RTT_ROOT = os.getenv('RTT_ROOT')
else:
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../../..')

# set RTT_ROOT
if not os.getenv("RTT_ROOT"):
RTT_ROOT="rt-thread"

sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
try:
from building import *
except:
print('Cannot found RT-Thread root directory, please check RTT_ROOT')
print(RTT_ROOT)
exit(-1)

TARGET = 'rtthread.' + rtconfig.TARGET_EXT

if rtconfig.PLATFORM == 'armcc':
env = Environment(tools = ['mingw'],
AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS,
CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
AR = rtconfig.AR, ARFLAGS = '-rc',
LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS,
# overwrite cflags, because cflags has '--C99'
CXXCOM = '$CXX -o $TARGET --cpp -c $CXXFLAGS $_CCCOMCOM $SOURCES')
else:
env = Environment(tools = ['mingw'],
AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS,
CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
AR = rtconfig.AR, ARFLAGS = '-rc',
LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS,
CXXCOM = '$CXX -o $TARGET -c $CXXFLAGS $_CCCOMCOM $SOURCES')

env.PrependENVPath('PATH', rtconfig.EXEC_PATH)

if rtconfig.PLATFORM in ['iccarm']:
env.Replace(CCCOM = ['$CC $CFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
env.Replace(ARFLAGS = [''])
env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map')

Export('RTT_ROOT')
Export('rtconfig')

SDK_ROOT = os.path.abspath('./')

if os.path.exists(SDK_ROOT + '/Libraries'):
libraries_path_prefix = SDK_ROOT + '/Libraries'
else:
libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/Libraries'

SDK_LIB = libraries_path_prefix
Export('SDK_LIB')

# prepare building environment
objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)

objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript')))

# include cmsis
objs.extend(SConscript(os.path.join(libraries_path_prefix, rtconfig.BSP_LIBRARY_TYPE, 'SConscript')))

# make a building
DoBuilding(TARGET, objs)

运行

在VSCode环境下按F5启动编译、运行、调试

img

开发板RGB LED点亮

img

按下用户按钮控制台输出相关日志

img

开源

BSP已经开源:https://gitee.com/hywing/rtt-mcxw71.git

参考

NXP MCU MCXW71 VSCode运行环境搭建:https://hywing.tech/frdm-mcxw71-tutorial.html


下里巴人
海纳百川,文以载道
hywing技术自留地
总访问 113701 次 | 本页访问 326