52 lines
1.7 KiB
C
52 lines
1.7 KiB
C
#include "hdl_usb.h"
|
|
|
|
static void USB_IRQ_Handler(void)
|
|
{
|
|
extern void USBD_IRQHandler(uint8_t busid);
|
|
|
|
USBD_IRQHandler(0);
|
|
}
|
|
|
|
void hdl_usb_init(void)
|
|
{
|
|
stc_clock_pllx_init_t stcUpllInit;
|
|
stc_gpio_init_t stcGpioCfg;
|
|
stc_irq_signin_config_t stcIrqRegiConf;
|
|
|
|
LL_PERIPH_WE(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM);
|
|
|
|
/* 时钟配置 */
|
|
(void)CLK_PLLxStructInit(&stcUpllInit);
|
|
stcUpllInit.u8PLLState = CLK_PLLX_ON;
|
|
stcUpllInit.PLLCFGR = 0UL;
|
|
stcUpllInit.PLLCFGR_f.PLLM = (4UL - 1UL);
|
|
stcUpllInit.PLLCFGR_f.PLLN = (84UL - 1UL);
|
|
stcUpllInit.PLLCFGR_f.PLLR = (7UL - 1UL);
|
|
stcUpllInit.PLLCFGR_f.PLLQ = (7UL - 1UL);
|
|
stcUpllInit.PLLCFGR_f.PLLP = (7UL - 1UL); //48M
|
|
(void)CLK_PLLxInit(&stcUpllInit);
|
|
CLK_SetUSBClockSrc(CLK_USBCLK_PLLXP);
|
|
|
|
/* 引脚配置 */
|
|
(void)GPIO_StructInit(&stcGpioCfg);
|
|
|
|
stcGpioCfg.u16PinAttr = PIN_ATTR_ANALOG;
|
|
(void)GPIO_Init(USB_DM_PORT, USB_DM_PIN, &stcGpioCfg);
|
|
(void)GPIO_Init(USB_DP_PORT, USB_DP_PIN, &stcGpioCfg);
|
|
// GPIO_SetFunc(USB_DM_PORT, USB_DM_PIN, GPIO_FUNC_10);
|
|
// GPIO_SetFunc(USB_DP_PORT, USB_DP_PIN, GPIO_FUNC_10);
|
|
// GPIO_SetFunc(USB_VBUS_PORT, USB_VBUS_PIN, GPIO_FUNC_10); /* VBUS */
|
|
FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBFS, ENABLE);
|
|
|
|
/* 中断配置 */
|
|
stcIrqRegiConf.enIRQn = INT030_IRQn;
|
|
stcIrqRegiConf.enIntSrc = INT_SRC_USBFS_GLB;
|
|
stcIrqRegiConf.pfnCallback = &USB_IRQ_Handler; // 添加中断函数
|
|
(void)INTC_IrqSignIn(&stcIrqRegiConf);
|
|
NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);
|
|
NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIO_15);
|
|
NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);
|
|
|
|
LL_PERIPH_WP(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_SRAM);
|
|
}
|