rt-thread官方版本已经支持了NXP的frdm-mcxa153、frdm-mcxn947、frdm-mcxn236这3个开发板。暂时没有MCXA156 BSP,那就自己做一个BSP吧。
比较一下FRDM-MCXA153和FRDM-MCXA156的资料,会发现两者很像。
FRDM-MCXA153
MCXA15x Arm® Cortex®-M33内核,高达128KB的闪存,高达32kB的RAM,带有8kB ECC LPLUART、LPSPI、LPI2C、FS USB、DMA和LDO
FRDM-MCXA156
MCXA156 Arm® Cortex®-M33 core Up to 1 MB flash with up to 128 KB RAM with 8 KB ECC, CAN-FD, FlexIO, FS USB, I3C, LPLUART, LPSPI, LPI2C, DMA and LDO
只是MCXA156比 MCXA153的ROM、RAM大一些,应该改一下就可以用。
1、从\rt-thread\bsp\nxp\mcx\mcxa\frdm-mcxa153拷贝一份到156
2、scf和ld
拷贝一份MCXA156_flash.scf(分散加载链接文件)到frdm-mcxa156\board\linker_scripts
MCXA156_flash.scf可以从156的例程keil工程中找到,156的RAM和ROM比153大,所以下面蓝框部分与153的scf不同。
同目录下还有一个MCXA153_flash.ld,可以改成MCXA156_flash.ld,用于gcc link,我没有用gcc,应该做如下修改吧。
3、frdm-mcxa156\board\MCUX_Config\board下文件
从MCXA156 keil模板工程中拷贝4个文件到frdm-mcxa156\board\MCUX_Config\board,其实原来153有这4个文件,直接用也应该可以。
注意BOARD_InitPins(pin_mux.c)函数应该添加以下代码:
void BOARD_InitPins(void) { /* PORT0: Peripheral clock is enabled */ CLOCK_EnableClock(kCLOCK_GatePORT0); CLOCK_EnableClock(kCLOCK_GatePORT0); CLOCK_EnableClock(kCLOCK_GatePORT1); CLOCK_EnableClock(kCLOCK_GatePORT2); CLOCK_EnableClock(kCLOCK_GatePORT3); CLOCK_EnableClock(kCLOCK_GateGPIO0); CLOCK_EnableClock(kCLOCK_GateGPIO1); CLOCK_EnableClock(kCLOCK_GateGPIO2); CLOCK_EnableClock(kCLOCK_GateGPIO3); RESET_ReleasePeripheralReset(kLPUART0_RST_SHIFT_RSTn); RESET_ReleasePeripheralReset(kLPUART1_RST_SHIFT_RSTn); RESET_ReleasePeripheralReset(kLPUART2_RST_SHIFT_RSTn); RESET_ReleasePeripheralReset(kPORT0_RST_SHIFT_RSTn); RESET_ReleasePeripheralReset(kPORT1_RST_SHIFT_RSTn); RESET_ReleasePeripheralReset(kPORT2_RST_SHIFT_RSTn); RESET_ReleasePeripheralReset(kPORT3_RST_SHIFT_RSTn); RESET_ReleasePeripheralReset(kGPIO0_RST_SHIFT_RSTn); RESET_ReleasePeripheralReset(kGPIO1_RST_SHIFT_RSTn); RESET_ReleasePeripheralReset(kGPIO2_RST_SHIFT_RSTn); RESET_ReleasePeripheralReset(kGPIO3_RST_SHIFT_RSTn);
4、\frdm-mcxa156\board\Kconfig文件修改
这部分是给menuconfig用的
menu "Hardware Drivers Config" config FRDM_MCXA156 bool select FRDM_MCXA156_SERIES select RT_USING_COMPONENTS_INIT select RT_USING_USER_MAIN default y menu "On-chip Peripheral Drivers" config BSP_USING_DMA bool "Enable DMA" select RT_USING_DMA default n config BSP_USING_PIN bool "Enable GPIO" select RT_USING_PIN default y menuconfig BSP_USING_UART bool "Enable UART" select RT_USING_UART default y select RT_USING_SERIAL if BSP_USING_UART config BSP_USING_UART0 bool "Enable LPUART(UART0) as UART" default y endif
5、rt-thread\bsp\nxp\mcx\mcxa\Libraries
copy 一份MCXA153到MCXA156,将153都改成156
将156的SDK(FRDM-MCXA156\SDK_2_16_100_FRDM-MCXA156\devices\MCXA156\drivers)拷贝到bsp\nxp\mcx\mcxa\Libraries\MCXA156\MCXA156\drivers覆盖原来内容。
从156 SDK拷贝 startup_MCXA156.S 到bsp\nxp\mcx\mcxa\Libraries\MCXA156\MCXA156\arm
拷贝以下文件到bsp\nxp\mcx\mcxa\Libraries\MCXA156\MCXA156
6、修改keil模板文件template.uvprojx
回到bsp\nxp\mcx\mcxa\frdm-mcxa156
双击template.uvprojx进入keil
然后保存,keil模板就做好了。
7、menuconfig
GPIO和UART已经缺省选择了。
8、生成keil工程
9、修改main.c
int main(void) { #if defined(__CC_ARM) rt_kprintf("using armcc, version: %d\n", __ARMCC_VERSION); #elif defined(__clang__) rt_kprintf("using armclang, version: %d\n", __ARMCC_VERSION); #elif defined(__ICCARM__) rt_kprintf("using iccarm, version: %d\n", __VER__); #elif defined(__GNUC__) rt_kprintf("using gcc, version: %d.%d\n", __GNUC__, __GNUC_MINOR__); #endif rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */ rt_kprintf("FRDM-MCXA156 评测二 rt-thread配置\r\n"); while (1) { rt_pin_write(LED_PIN, PIN_HIGH); /* Set GPIO output 1 */ rt_kprintf("LED_PIN is high\r\n"); rt_thread_mdelay(500); /* Delay 500mS */ rt_pin_write(LED_PIN, PIN_LOW); /* Set GPIO output 0 */ rt_kprintf("LED_PIN is low\r\n"); rt_thread_mdelay(500); /* Delay 500mS */ } }
10、运行效果