• 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

手把手教您用 ConfigTool 创建自己的 USB 例程

2025/02/06
2606
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

MCUXpresso Config Tools 强大的代码生成功能超乎你的想象。下面我们来一起学习如何用 MCUXpresso Config Tools 来从头开始创建一个属于你自己的 USB 实用例程。我们以LPC55S69 的键盘鼠标复合 USB 设备工程为例,一步步实现 USB 复合设备的配置并生成相应的 USB 源文件,进而实现 USB 复合设备的功能。

开发环境:MCUXpresso IDE v11.1.0,

SDK:SDK_2.7.1_LPCXpresso55S69

开发板:LPCXpresso55S69-EVK。

1. 首先在MCUXpresso IDE中安装好 LPC55S69 的 SDK, 下面使用的 SDKSDK_2.7.1_LPCXpresso55S69,左键单击 New project

2.选择 LPCXpresso55s69 的 SDK,点击 next

3.在 Middleware 窗口中选择 USB device 文件,在选中 USB device 文件的同时,USBcommon 文件会同时被选中,点击 Finish

4. 如下图所示,为创建好的 usb 工程。

5. 选中新创建的 LPC55S69_Project 文件,单击 Config Tool 图标右侧的箭头,从下拉菜单中选择 Open Peripherals

6. 在 Peripherals 窗口中选择 USB0,在弹出的中间的 USB0 窗口中进行 USB 的相关配置。

7. 在 USB 设置的 Preset 下拉菜单中选择 HID Keyboard

8.点击 Supported interfaces 右侧的加号,添加一个新的设备,在 Class 窗口中选择HID,Preset 窗口中选择 mouse

9.在 Problems 窗口中右键选择 Error,然后选择 Show problem in BOARD_BootClockPLL150M

10. 在“Clocks Diagram”里选中 USB0CLKSEL, 在弹出的时钟配置界面,打开 FRO_96MHz 时钟,将 USB0 的时钟源设置为 FRO 96MHz clock,分频系数选择/2,得到 USB0 的时钟频率为 48MHz

11.时钟设置好之后,回到 Peripheral 窗口中,在 Problems 窗口里,通过上一步配置 USB0时钟源,已经去除掉第一个 Error;继续配置来去除第二个Error。同样右键单击 Error,这里需要我们给 USB0 分配引脚,左键单击选择 Route to[78]……, 手动切换到 PinConfiguration 界面,我们可以看到 USB0_VBUS 管脚已设置好。

12. 设置完成之后,选择 Update Code,在图中可以看到要创建和修改的文件。

13.配置好的工程文件如图所示

14.创建好新的工程后,打开 source 文件夹下主程序源文件,用户需要在 LPC55S69_Project.c文件中编写代码,实现特定的键盘鼠标复合设备功能。将 15 部分所示代码添加在在LPC55S69_Project.c 文件中,它可以实现键盘鼠标复合设备功能。

15.添加的代码如下。

#include <stdio.h>
#include "board.h"
#include "peripherals.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "LPC55S69_cm33_core0.h"
#include "fsl_debug_console.h"
#include "usb_device_composite.h"
#include "usb_device_config.h"
#include "usb.h"
#include "usb_device.h"
#include "usb_device_class.h"
#include "usb_device_hid.h"
#include "usb_device_ch9.h"
#include "usb_device_descriptor.h"
#if (defined(FSL_FEATURE_SOC_SYSMPU_COUNT) && (FSL_FEATURE_SOC_SYSMPU_COUNT > 0U))
#include "fsl_sysmpu.h"
#endif
#if defined(FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U)
#include "usb_phy.h"
#endif
#if (defined(USB_DEVICE_CONFIG_LPCIP3511FS) && (USB_DEVICE_CONFIG_LPCIP3511FS > 0U))
#include "fsl_power.h"
#endif
#if (defined(USB_DEVICE_CONFIG_LPCIP3511HS) && (USB_DEVICE_CONFIG_LPCIP3511HS > 0U))
#if !((defined FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U))
#include "fsl_mrt.h"
#endif
#include "fsl_power.h"
#endif
/* TODO: insert other include files here. */
/* TODO: insert other definitions and declarations here. */
#if defined (USB_DEVICE_CONFIG_LPCIP3511FS) && (USB_DEVICE_CONFIG_LPCIP3511FS > 0U)
static clock_usbfs_src_t USB0_GetClockSource(void);
#endif
#if defined (USB_DEVICE_CONFIG_LPCIP3511FS) && (USB_DEVICE_CONFIG_LPCIP3511FS > 0U)
/*!
* @brief Function to retrieve clock source for USB0.
*
* @return Used clock source
*/
static clock_usbfs_src_t USB0_GetClockSource()
{
clock_usbfs_src_t src;
switch (SYSCON->USB0CLKSEL)
{
case 0U:
src = kCLOCK_UsbfsSrcMainClock;
break;
case 1U:
src = kCLOCK_UsbfsSrcPll0;
break;
case 3U:
src = kCLOCK_UsbfsSrcFro;
break;
case 5U:
src = kCLOCK_UsbfsSrcPll1;
break;
default:
src = kCLOCK_UsbfsSrcNone;
break;
}
return src;
}
#endif
/*
* @brief Application entry point.
*/
int main(void)
{
/* attach 12 MHz clock to FLEXCOMM0 (debug console) */
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
BOARD_InitPins();
BOARD_BootClockPLL150M();
BOARD_InitDebugConsole();
NVIC_ClearPendingIRQ(USB0_IRQn);
NVIC_ClearPendingIRQ(USB0_NEEDCLK_IRQn);
NVIC_ClearPendingIRQ(USB1_IRQn);
NVIC_ClearPendingIRQ(USB1_NEEDCLK_IRQn);
POWER_DisablePD(kPDRUNCFG_PD_USB0_PHY); /*< Turn on USB0 Phy */
POWER_DisablePD(kPDRUNCFG_PD_USB1_PHY); /*< Turn on USB1 Phy */
/* reset the IP to make sure it's in reset state. */
RESET_PeripheralReset(kUSB0D_RST_SHIFT_RSTn);
RESET_PeripheralReset(kUSB0HSL_RST_SHIFT_RSTn);
RESET_PeripheralReset(kUSB0HMR_RST_SHIFT_RSTn);
RESET_PeripheralReset(kUSB1H_RST_SHIFT_RSTn);
RESET_PeripheralReset(kUSB1D_RST_SHIFT_RSTn);
RESET_PeripheralReset(kUSB1_RST_SHIFT_RSTn);
RESET_PeripheralReset(kUSB1RAM_RST_SHIFT_RSTn);
#if (defined USB_DEVICE_CONFIG_LPCIP3511HS) && (USB_DEVICE_CONFIG_LPCIP3511HS)
CLOCK_EnableClock(kCLOCK_Usbh1);
/* Put PHY powerdown under software control */
*((uint32_t *)(USBHSH_BASE + 0x50)) = USBHSH_PORTMODE_SW_PDCOM_MASK;
/* According to reference mannual, device mode setting has to be set by access usb host register */
*((uint32_t *)(USBHSH_BASE + 0x50)) |= USBHSH_PORTMODE_DEV_ENABLE_MASK;
/* enable usb1 host clock */
CLOCK_DisableClock(kCLOCK_Usbh1);
#endif
#if defined (USB_DEVICE_CONFIG_LPCIP3511FS) && (USB_DEVICE_CONFIG_LPCIP3511FS > 0U)
/* Turn on USB Phy */
POWER_DisablePD(kPDRUNCFG_PD_USB0_PHY);
/* enable usb0 host clock */
CLOCK_EnableClock(kCLOCK_Usbhsl0);
/*According to reference mannual, device mode setting has to be set by access usb host register */
*((uint32_t *)(USBFSH_BASE + 0x5C)) |= USBFSH_PORTMODE_DEV_ENABLE_MASK;
/* disable usb0 host clock */
CLOCK_DisableClock(kCLOCK_Usbhsl0);
if (USB0_GetClockSource() == kCLOCK_UsbfsSrcFro)
{
/* Turn ON FRO HF and let it adjust TRIM value based on USB SOF */
ANACTRL->FRO192M_CTRL = (ANACTRL->FRO192M_CTRL &
~(ANACTRL_FRO192M_CTRL_USBCLKADJ_MASK)) | ANACTRL_FRO192M_CTRL_USBCLKADJ(1U);
}
CLOCK_EnableClock(kCLOCK_Usbd0);
CLOCK_EnableClock(kCLOCK_UsbRam1);
#if defined(FSL_FEATURE_USB_USB_RAM) && (FSL_FEATURE_USB_USB_RAM)
for (int i = 0; i < FSL_FEATURE_USB_USB_RAM; i++)
{
((uint8_t *)FSL_FEATURE_USB_USB_RAM_BASE_ADDRESS)[i] = 0x00U;
}
#endif
#endif
USB_DeviceApplicationInit();
while (1U)
{
#if USB_DEVICE_CONFIG_USE_TASK
USB_DeviceTaskFn(g_UsbDeviceComposite.deviceHandle);
#endif
}
}

16. 连接开发板的 P6 调试口将 USB 程序下载到开发板中,下载完成后重新上电,将开发板的 P10 FS USB 口连接到 PC 机上。

运行结果:

对于 HID 鼠标:可观察到鼠标箭头在 PC 屏幕上呈矩形移动。

对于 HID 键盘:可见当前屏幕上下滚动。

 

相关推荐

电子产业图谱