364 lines
13 KiB
C
364 lines
13 KiB
C
/**
|
|
******************************************************************************
|
|
* @file hw_config.c
|
|
* @author MCD Application Team
|
|
* @version V4.1.0
|
|
* @date 26-May-2017
|
|
* @brief Hardware Configuration & Setup
|
|
******************************************************************************
|
|
* @attention
|
|
*
|
|
* <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without modification,
|
|
* are permitted provided that the following conditions are met:
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
* 3. Neither the name of STMicroelectronics nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
|
|
#include "stm32_it.h"
|
|
#include "usb_lib.h"
|
|
#include "usb_prop.h"
|
|
#include "usb_desc.h"
|
|
#include "hal.h"
|
|
#include "usb_pwr.h"
|
|
|
|
/* Private typedef -----------------------------------------------------------*/
|
|
/* Private define ------------------------------------------------------------*/
|
|
/* Private macro -------------------------------------------------------------*/
|
|
/* Private variables ---------------------------------------------------------*/
|
|
ErrorStatus HSEStartUpStatus;
|
|
EXTI_InitTypeDef EXTI_InitStructure;
|
|
extern __IO uint32_t packet_sent;
|
|
extern __IO uint8_t Send_Buffer[MIDI_CDC_DEV_DATA_SIZE] ;
|
|
extern __IO uint32_t packet_receive;
|
|
extern __IO uint8_t Receive_length;
|
|
|
|
uint8_t Receive_Buffer[64];
|
|
uint32_t Send_length;
|
|
/* Extern variables ----------------------------------------------------------*/
|
|
|
|
extern LINE_CODING linecoding;
|
|
|
|
/* Private function prototypes -----------------------------------------------*/
|
|
/* Private functions ---------------------------------------------------------*/
|
|
/*******************************************************************************
|
|
* Function Name : Set_System
|
|
* Description : Configures Main system clocks & power
|
|
* Input : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
void Set_System(void)
|
|
{
|
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|
/*!< At this stage the microcontroller clock setting is already configured,
|
|
this is done through SystemInit() function which is called from startup
|
|
file (startup_stm32xxx.s) before to branch to application main.
|
|
To reconfigure the default setting of SystemInit() function, refer to
|
|
system_stm32xxx.c file
|
|
*/
|
|
|
|
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD) || defined(STM32F37X) || defined(STM32F303xC) || defined(STM32F303xE) || defined(STM32F302x8)
|
|
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
|
|
|
|
#else /* defined(STM32F10X_HD) || defined(STM32F10X_MD) defined(STM32F10X_XL)*/
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
|
|
#endif
|
|
|
|
/********************************************/
|
|
/* Configure USB DM/DP pins */
|
|
/********************************************/
|
|
|
|
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)
|
|
|
|
/* Configure USB DM/DP pin. This is optional, and maintained only for user guidance.
|
|
For the STM32L products there is no need to configure the PA12/PA11 pins couple
|
|
as Alternate Function */
|
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
|
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
|
|
|
|
#elif defined(STM32F10X_HD) || defined(STM32F10X_MD) || defined(STM32F10X_XL)
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
|
|
/* Enable all GPIOs Clock*/
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALLGPIO, ENABLE);
|
|
|
|
#else /* defined(STM32F37X) || defined(STM32F303xC) */
|
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
|
|
/*SET PA11,12 for USB: USB_DM,DP*/
|
|
GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_14);
|
|
GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_14);
|
|
|
|
#endif
|
|
|
|
#if ! defined(USE_NUCLEO)
|
|
/********************************************/
|
|
/* Enable the USB PULL UP */
|
|
/********************************************/
|
|
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)
|
|
|
|
/* Enable integrated STM32L15xx internal pull up
|
|
Enable the SYSCFG module clock*/
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
|
|
|
|
#elif defined(STM32F10X_HD) || defined(STM32F10X_MD) || defined(STM32F10X_XL)
|
|
|
|
/* USB_DISCONNECT used as USB pull-up */
|
|
GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
|
|
GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);
|
|
|
|
/* Enable the USB disconnect GPIO clock */
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE);
|
|
|
|
#else /* defined(STM32F37X) || defined(STM32F303xC) */
|
|
|
|
/* Enable the USB disconnect GPIO clock */
|
|
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIO_DISCONNECT, ENABLE);
|
|
|
|
/* USB_DISCONNECT used as USB pull-up */
|
|
GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
|
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
|
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
|
GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);
|
|
|
|
#endif
|
|
#endif /* USE_NUCLEO */
|
|
#ifdef USB_LOW_PWR_MGMT_SUPPORT
|
|
|
|
/**********************************************************************/
|
|
/* Configure the EXTI line 18 connected internally to the USB IP */
|
|
/**********************************************************************/
|
|
|
|
EXTI_ClearITPendingBit(EXTI_Line18);
|
|
EXTI_InitStructure.EXTI_Line = EXTI_Line18;
|
|
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
|
|
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
|
|
EXTI_Init(&EXTI_InitStructure);
|
|
|
|
#endif /* USB_LOW_PWR_MGMT_SUPPORT */
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : Set_USBClock
|
|
* Description : Configures USB Clock input (48MHz)
|
|
* Input : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
void Set_USBClock(void)
|
|
{
|
|
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD) || defined(STM32L1XX_MD_PLUS)
|
|
/* Enable USB clock */
|
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);
|
|
|
|
#else
|
|
/* Select USBCLK source */
|
|
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
|
|
|
|
/* Enable the USB clock */
|
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);
|
|
#endif /* STM32L1XX_MD */
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : Leave_LowPowerMode
|
|
* Description : Restores system clocks and power while exiting suspend mode
|
|
* Input : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
void Leave_LowPowerMode(void)
|
|
{
|
|
DEVICE_INFO *pInfo = &Device_Info;
|
|
|
|
/* Set the device state to the correct state */
|
|
if (pInfo->Current_Configuration != 0)
|
|
{
|
|
/* Device configured */
|
|
bDeviceState = CONFIGURED;
|
|
}
|
|
else
|
|
{
|
|
bDeviceState = ATTACHED;
|
|
}
|
|
/*Enable SystemCoreClock*/
|
|
SystemInit();
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : USB_Interrupts_Config
|
|
* Description : Configures the USB interrupts
|
|
* Input : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
void USB_Interrupts_Config(void)
|
|
{
|
|
NVIC_InitTypeDef NVIC_InitStructure;
|
|
|
|
/* 4 bits for pre-emption priority, 0 bit for subpriority */
|
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
|
|
|
|
#if defined(STM32L1XX_MD)|| defined(STM32L1XX_HD) || defined(STM32L1XX_MD_PLUS)
|
|
/* Enable the USB interrupt */
|
|
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_IRQn;
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
|
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
|
|
/* Enable the USB Wake-up interrupt */
|
|
NVIC_InitStructure.NVIC_IRQChannel = USB_FS_WKUP_IRQn;
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
|
|
#elif defined(STM32F37X)
|
|
/* Enable the USB interrupt */
|
|
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_IRQn;
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
|
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
|
|
/* Enable the USB Wake-up interrupt */
|
|
NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn;
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
|
|
#else
|
|
/* Enable the USB interrupt */
|
|
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
|
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
|
|
/* Enable the USB Wake-up interrupt */
|
|
NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn;
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
#endif
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : USB_Cable_Config
|
|
* Description : Software Connection/Disconnection of USB Cable
|
|
* Input : None.
|
|
* Return : Status
|
|
*******************************************************************************/
|
|
void USB_Cable_Config (FunctionalState NewState)
|
|
{
|
|
if (NewState != DISABLE)
|
|
{
|
|
GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
|
|
}
|
|
else
|
|
{
|
|
GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
|
|
}
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : HAL_GetHwSerialNum.
|
|
* Description : Create the serial number string descriptor.
|
|
* Input : None.
|
|
* Output : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
uint64_t HAL_GetHwSerialNum(void)
|
|
{
|
|
uint32_t Device_Serial0, Device_Serial1, Device_Serial2;
|
|
|
|
Device_Serial0 = *(uint32_t*)ID1;
|
|
Device_Serial1 = *(uint32_t*)ID2;
|
|
Device_Serial2 = *(uint32_t*)ID3;
|
|
|
|
Device_Serial0 += Device_Serial2;
|
|
return (uint64_t)Device_Serial0|((uint64_t)Device_Serial1<<32);
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
* Function Name : Send DATA .
|
|
* Description : send the data received from the STM32 to the PC through USB
|
|
* Input : None.
|
|
* Output : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
uint32_t CDC_Send_DATA (uint8_t *ptrBuffer, uint8_t Send_length)
|
|
{
|
|
/*if max buffer is Not reached*/
|
|
if(Send_length < MIDI_CDC_DEV_DATA_SIZE)
|
|
{
|
|
/*Sent flag*/
|
|
packet_sent = 0;
|
|
/* send packet to PMA*/
|
|
UserToPMABufferCopy((unsigned char*)ptrBuffer, ENDP1_TXADDR, Send_length);
|
|
SetEPTxCount(ENDP1, Send_length);
|
|
SetEPTxValid(ENDP1);
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : Receive DATA .
|
|
* Description : receive the data from the PC to STM32 and send it through USB
|
|
* Input : None.
|
|
* Output : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
uint32_t CDC_Receive_DATA(void)
|
|
{
|
|
/*Receive flag*/
|
|
packet_receive = 0;
|
|
SetEPRxValid(ENDP3);
|
|
SetEPRxValid(ENDP4);
|
|
return 1 ;
|
|
}
|
|
|
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|