前言
FDRM-MCXA156简介:
有幸能够参与NXP和RT-thread的评测活动,关于这一块FRDM-MCXA156主控的开发板,第一感觉就是小巧,其次是通过官网了解,该A系列拥有同等的低功耗与高达 1 MB 的闪存和高达 128 KB 的 RAM,具有 8 KB ECC、CAN-FD、FlexIO、FS USB、I3C、LPLUART、LPSPI、LPI2C、DMA 和 LDO,主要的应用场景有空调,无刷直流电机(BLDC)控制,电表,电机驱动器。
原理图和版图(文章底部可供下载),如图所示:



本篇文章,来对FRDM-MCXA156浅浅入个门,搭载RTThread实时操作系统,点亮LED,并且针对rtthread的pin驱动进行一个介绍和使用。
首先需要配置一下初始的开发环境:ENV2.0的版本,rtthread源码,在github下载即可,keil5。rtthread官网下的文档中心都有
从github将rtthread的源码下载下来,我使用压缩包下载,然后解压根据路径
rt-thread-master\bsp\nxp\mcx\mcxa\frdm-mcxa156 找到这一个文件下的工程文件并且打开

通过原理图可以看出,MCXA156的RGB三色灯是由P3_12,P3_13,P3_0组成的,因此只需要控制这三个引脚的高低电平就可以控制IO口驱动RGB三色灯。
接下来,通过以下三个宏定义,来控制相应的引脚
1 #define LED_R_PIN ((332)+12) 表示的是P3端口的12引脚
2 #define LED_G_PIN ((332)+13) 表示的是P3端口的13引脚
3 #define LED_B_PIN ((3*32)+0) 表示的是P3端口的0引脚
通过 rt_pin_mode(LED_B_PIN, PIN_MODE_OUTPUT); 配置LED_B_PIN为输出模式
如果需要配置其它模式可以更改,例如
PIN_MODE_INPUT 输入模式
PIN_MODE_INPUT_PULLDOWN 下拉输入
PIN_MODE_INPUT_PULLUP 上拉输入
PIN_MODE_OUTPUT_OD 推挽输出
rtthread还提供了设备驱动的支持,在本例子中,通过访问PIN设备驱动,能够很快捷方便的操控PIN设备,
例如通过 rt_pin_write(rt_base_t pin, rt_base_t value)和rt_pin_read(rt_base_t pin, rt_base_t value),操控PIN设备的输出和读取。
rt_pin_attach_irq(KEY0_PIN_NUM, PIN_IRQ_MODE_FALLING, beep_on, RT_NULL);可以设置引脚的中断触发模式.可以通过读取按键的上升沿和下降沿,识别按键是否按下,进行下一步操作等等的应用。例子二有相关PIN设备具体的实现
例子一:通过控制LED灯,以每500ms进行三色切换LED灯
/*
* Copyright (c) 2006-2025, RT-Thread Development Team
* Copyright (c) 2019-2020, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2019-10-24 Magicoe first version
* 2020-01-10 Kevin/Karl Add PS demo
* 2020-09-21 supperthomas fix the main.c
*
*/
#include <rtdevice.h>
#include "drv_pin.h"
#define LED_R_PIN ((3*32)+12) //红灯
#define LED_G_PIN ((3*32)+13) //绿灯
#define LED_B_PIN ((3*32)+0) //蓝灯
int main(void)
{
rt_kprintf("MCXA156 HelloWorld\r\n");
rt_pin_mode(LED_R_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */
rt_pin_mode(LED_G_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */
rt_pin_mode(LED_B_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */
rt_pin_write(LED_R_PIN, PIN_HIGH); //初始化LED红灯,为高电平,熄灭状态
rt_pin_write(LED_G_PIN, PIN_HIGH); //初始化LED绿灯,为高电平,熄灭状态
rt_pin_write(LED_B_PIN, PIN_HIGH); //初始化LED蓝灯,为高电平,熄灭状态
while (1)
{
rt_pin_write(LED_R_PIN, PIN_LOW);
rt_thread_mdelay(500);
rt_pin_write(LED_R_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED_G_PIN, PIN_LOW);
rt_thread_mdelay(500);
rt_pin_write(LED_G_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED_B_PIN, PIN_LOW);
rt_thread_mdelay(500);
rt_pin_write(LED_B_PIN, PIN_HIGH);
rt_thread_mdelay(500);
}
}
// end file
例子二:通过使用SW_2,SW_3两个按键实现通过按键中断,进行三色灯的LED切换和清除所有LED灯。
/*
* Copyright (c) 2006-2025, RT-Thread Development Team
* Copyright (c) 2019-2020, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2019-10-24 Magicoe first version
* 2020-01-10 Kevin/Karl Add PS demo
* 2020-09-21 supperthomas fix the main.c
*
*/
#include <rtdevice.h>
#include "drv_pin.h"
#define LED_R_PIN ((3*32)+12)
#define LED_G_PIN ((3*32)+13)
#define LED_B_PIN ((3*32)+0)
#define KEY2 ((1*32)+7) //P1_7 为SW2
#define KEY3 (6) //P0_6 为SW3
int k=1;
//打开LED红灯
void LED_R_ON(void *args){
rt_pin_write(LED_R_PIN, PIN_LOW);
}
//关闭LED红灯
void LED_R_OFF(void *args){
rt_pin_write(LED_R_PIN, PIN_HIGH);
}
//打开LED绿灯
void LED_G_ON(void *args){
rt_pin_write(LED_G_PIN, PIN_LOW);
}
//关闭LED绿灯
void LED_G_OFF(void *args){
rt_pin_write(LED_G_PIN, PIN_HIGH);
}
//打开LED蓝灯
void LED_B_ON(void *args){
rt_pin_write(LED_B_PIN, PIN_LOW);
}
//关闭LED蓝灯
void LED_B_OFF(void *args){
rt_pin_write(LED_B_PIN, PIN_HIGH);
}
//切换LED三色灯
void LED_CONTROL(void *args){
k++;
if(k>3){k=1;}
if(1==k){
rt_pin_write(LED_R_PIN, PIN_LOW);
rt_pin_write(LED_G_PIN, PIN_HIGH);
rt_pin_write(LED_B_PIN, PIN_HIGH);
}else if(2==k){
rt_pin_write(LED_R_PIN, PIN_HIGH);
rt_pin_write(LED_G_PIN, PIN_LOW);
rt_pin_write(LED_B_PIN, PIN_HIGH);
}else if(3==k){
rt_pin_write(LED_R_PIN, PIN_HIGH);
rt_pin_write(LED_G_PIN, PIN_HIGH);
rt_pin_write(LED_B_PIN, PIN_LOW);
}
}
void LED_OFF(void *args){
rt_pin_write(LED_R_PIN, PIN_HIGH);
rt_pin_write(LED_G_PIN, PIN_HIGH);
rt_pin_write(LED_B_PIN, PIN_HIGH);
}
int main(void)
{
k=1;
rt_kprintf("MCXA156 HelloWorld\r\n");
rt_pin_mode(LED_R_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */
rt_pin_mode(LED_G_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */
rt_pin_mode(LED_B_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */
rt_pin_mode(KEY3, PIN_MODE_INPUT_PULLUP); //设置按键3为输入上拉模式
rt_pin_mode(KEY2, PIN_MODE_INPUT_PULLUP); //设置按键2为输入上拉模式
rt_pin_write(LED_R_PIN, PIN_HIGH);//关闭LED红灯
rt_pin_write(LED_G_PIN, PIN_HIGH);//关闭LED绿灯
rt_pin_write(LED_B_PIN, PIN_HIGH);//关闭LED蓝灯
//设置下降沿中断,采集到下降沿时触发中断,进入回调函数LED_R_ON
rt_pin_attach_irq(KEY2, PIN_IRQ_MODE_FALLING, LED_OFF, RT_NULL);
rt_pin_irq_enable(KEY2, PIN_IRQ_ENABLE);
//设置下降沿中断,采集到下降沿时触发中断,进入回调函数LED_R_OFF
rt_pin_attach_irq(KEY3, PIN_IRQ_MODE_FALLING, LED_CONTROL, RT_NULL);
rt_pin_irq_enable(KEY3, PIN_IRQ_ENABLE);
while (1)
{
}
}
原理图文件和版图文件大家自取:
SPF-90841.pdf
DNP-90841_A4.pdf