NXP FRDM-MCXN947测评:ETH设备所用到的问题和解决方案

目录

说明

使能PHY驱动

使能网络相关组件

遇到的问题和解决方案

测试结果


说明

此次是参加RT-Thread组织的活动,进行FRDM-MCXN947开发板的评测。本文先发于RT-Thread论坛,稍加修改后发表在我的博客。在上一篇博文中,我介绍了如何配置FRDM-MCXN947开发板的开发环境
我的任务是测试ETH接口,也就是网络接口。开发板提供了RJ45的接口,我们先测试最基本的网络功能,然后在此基础上测试网络相关的应用程序。

我使用的开发环境是Env环境,直接使用命令行进行编译。
在Env中使用menuconfig命令进行配置工作。官方提供了网络的驱动程序,所以可以直接进行有关网络的配置:

使能PHY驱动

在RT-Thread Components -> Device Drivers中选择Using ethernet phy device drivers


使能网络相关组件

在RT-Thread Components -> Network中选择网络相关的组件


遇到的问题和解决方案

不过当直接将程序下载到开发板时遇到了一个问题,当使用ifconfig命令时,程序报告错误:ifconfig: network interface device list error.
然后使用list device命令也确实没有看到网络相关的设备。
经过仔细检查编译日志,发现drv_eth.c文件就压根没有编译。而注册网络设备的工作是在drv_eth.c文件中实现的。我检查了drv_eth.c所在目录的D:\rt-thread\bsp\nxp\mcx\mcxn\Libraries\drivers\SConscript。该文件的内容是这样的:

from building import *

cwd = GetCurrentDir()

src = []

if GetDepend('BSP_USING_PIN'):
    src += ['drv_pin.c']

if  GetDepend('BSP_USING_UART'):
    src += ['drv_uart.c']

if GetDepend('BSP_USING_RTC'):
    src += ['drv_rtc.c']

if  GetDepend('BSP_USING_SPI'):
    src += ['drv_spi.c']

if  GetDepend('BSP_USING_SDIO'):
    src += ['drv_sdio.c']

if  GetDepend('BSP_USING_I2C'):
    src += ['drv_i2c.c']

if  GetDepend('BSP_USING_ADC'):
    src += ['drv_adc.c']

if  GetDepend('BSP_USING_DAC'):
    src += ['drv_dac.c']

if  GetDepend('BSP_USING_HWTIMER'):
    src += ['drv_hwtimer.c']

if  GetDepend('BSP_USING_WDT'):
    src += ['drv_wdt.c']

if  GetDepend('BSP_USING_PWM'):
    src += ['drv_pwm.c']

path =  [cwd,cwd + '/config']

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

Return('group')


从这个文件看,压根就没有添加drv_eth.c,所以即使我们在前面选择了ETH PHY的选项,也不会编译drv_eth.c文件。解决的办法是在文件中加上:

if  GetDepend('RT_USING_PHY'):
    src += ['drv_eth.c']

修改后的文件参见:rt-thread/bsp/nxp/mcx/mcxn/Libraries/drivers/SConscript at master · zealsoftstudio/rt-thread · GitHub

测试结果

再次编译程序并下载,这次程序就可以正常运行了。
我们通过ifconfig命令很容易看到当前的网络配置。ps命令也可以看出当前的各个网络相关线程都正常运行。

再使用PING命令可以正常工作了!

下面我们将继续测试网络的其他功能。

<think>嗯,用户想用NXPFRDM-MCXN947开发板上的GPIO0的6号引脚来实现按键检测。首先,我需要确定这个引脚的具体配置使用方法。MCXN947属于MCX N系列微控制器,可能使用MCUXpresso SDK或者其他的开发环境。 首先,用户需要知道按键的连接方式。通常,按键一端接GPIO,另一端接地,GPIO配置为上拉输入,这样按键按下时引脚会拉低。或者使用外部下拉电阻,配置为下拉输入,按键接电源,但更常见的是上拉加接地按键。 接下来,需要查阅MCXN947的文档,确认GPIO0_6的具体寄存器配置时钟使能。使用MCUXpresso配置工具可以生成初始化代码,但用户可能需要手动编写代码。 然后是初始化GPIO为输入模式,启用上拉电阻。可能需要配置引脚的中断功能,边沿触发(下降沿或上升沿),或者轮询方式检测按键状态。 用户可能需要去抖动处理,防止机械开关的抖动导致多次触发。软件去抖动可以通过延时检测或计数器实现。 如果是中断方式,需要配置NVIC,编写中断服务函数,处理按键事件。如果是轮询方式,在主循环中不断读取引脚状态,检测电平变化。 还要考虑使用的SDK版本库函数,比如使用GPIO_PinInit、GPIO_SetPinInterruptConfig等函数。需要确保正确包含头文件,比如fsl_gpio.h。 可能还需要板级支持包(BSP)中的宏定义,比如板载按键对应的GPIO引脚,但用户明确指定了GPIO0_6,可能需要直接使用该引脚定义。 最后,编写示例代码,包括初始化函数、中断处理(如果需要)以及主函数中的处理逻辑。如果用户不熟悉中断,可能轮询方式更容易上手,但中断更高效。 需要提醒用户检查电路连接,确保按键硬件连接正确,比如是否使用上拉电阻,避免引脚悬空。另外,注意消抖的时间设置,通常10-50毫秒。 总结步骤:初始化GPIO时钟,配置引脚为输入带上拉,设置中断(可选),实现去抖动逻辑,在循环或中断中检测按键状态变化,执行相应操作。</think>以下是一个基于MCUXpresso SDK的GPIO按键检测参考代码(使用轮询方式),适用于FRDM-MCXN947开发板的GPIO0_6引脚: ```c #include "fsl_gpio.h" #include "fsl_common.h" // 硬件配置宏 #define BUTTON_GPIO GPIO0 #define BUTTON_PIN 6U #define BUTTON_IRQ GPIO0_Combined_0_15_IRQn // 初始化按键GPIO void button_init(void) { gpio_pin_config_t button_config = { .pinDirection = kGPIO_DigitalInput, .outputLogic = 0U }; // 初始化GPIO时钟(如果尚未启用) CLOCK_EnableClock(kCLOCK_Gpio0); // 配置GPIO引脚为输入模式(内部上拉) GPIO_PinInit(BUTTON_GPIO, BUTTON_PIN, &button_config); GPIO_PinSetPullConfig(BUTTON_GPIO, BUTTON_PIN, kGPIO_PullUp); } // 按键去抖检测函数 bool is_button_pressed(void) { static bool last_state = 1; // 默认上拉状态为高电平 bool current_state = GPIO_PinRead(BUTTON_GPIO, BUTTON_PIN); // 检测下降沿(按键按下) if (last_state == 1 && current_state == 0) { // 简单延时去抖(约20ms) SDK_DelayAtLeastUs(20000, SystemCoreClock); current_state = GPIO_PinRead(BUTTON_GPIO, BUTTON_PIN); if (current_state == 0) { last_state = 0; return true; } } // 检测上升沿(按键释放) if (last_state == 0 && current_state == 1) { SDK_DelayAtLeastUs(20000, SystemCoreClock); current_state = GPIO_PinRead(BUTTON_GPIO, BUTTON_PIN); if (current_state == 1) { last_state = 1; } } return false; } // 主函数示例 int main(void) { // 硬件初始化 button_init(); while(1) { if(is_button_pressed()) { // 在这里添加按键按下后的处理逻辑 // 例如:翻转LED、发送消息等 } // 可添加其他任务或延时 SDK_DelayAtLeastUs(10000, SystemCoreClock); // 10ms延时 } } ``` ### 关键点说明: 1. **GPIO配置**: - 配置为数字输入模式 - 启用内部上拉电阻(按键未按下时保持高电平) 2. **消抖处理**: - 使用20ms延时消除机械抖动 - 采用状态机检测稳定电平变化 3. **检测逻辑**: - 检测下降沿(高→低)表示按键按下 - 检测上升沿(低→高)表示按键释放 4. **使用方法**: - 调用`button_init()`进行初始化 - 在主循环中调用`is_button_pressed()`检测按键事件 ### 硬件连接验证: 1. 确认开发板原理图,确保按键实际连接到GPIO0_6 2. 确认按键为低电平有效(按下时接地) 3. 若需要修改触发方式(如上升沿),可调整检测逻辑 ### 扩展建议: - 如需实时响应,可改用中断模式(配置GPIO中断) - 可添加长按检测逻辑(持续低电平超过设定时间) - 结合LED或其他外设实现反馈功能 建议配合MCUXpresso IDE的Pin Tool工具确认引脚配置,并根据实际使用的SDK版本调整相关头文件引用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神一样的老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值