mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-12 20:08:48 +01:00
d71ade8227
git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@1409 ebee16cc-31ac-478f-84a7-5cbb03baadba
417 lines
13 KiB
C
417 lines
13 KiB
C
/******************** (C) COPYRIGHT 2010 STMicroelectronics ********************
|
|
* File Name : hw_config.c
|
|
* Author : MCD Application Team
|
|
* Version : V3.2.1
|
|
* Date : 07/05/2010
|
|
* Description : Hardware Configuration & Setup
|
|
********************************************************************************
|
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
|
|
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
|
|
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
|
|
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
|
|
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
*******************************************************************************/
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "stm32f10x.h"
|
|
#include "platform_config.h"
|
|
#include "hw_config.h"
|
|
#include "usb_lib.h"
|
|
#include "usb_desc.h"
|
|
#include "usb_pwr.h"
|
|
#include "stm32_eval.h"
|
|
|
|
/* Private typedef -----------------------------------------------------------*/
|
|
/* Private define ------------------------------------------------------------*/
|
|
#define ADC1_DR_Address ((uint32_t)0x4001244C)
|
|
/* Private macro -------------------------------------------------------------*/
|
|
/* Private variables ---------------------------------------------------------*/
|
|
ErrorStatus HSEStartUpStatus;
|
|
uint32_t ADC_ConvertedValueX = 0;
|
|
uint32_t ADC_ConvertedValueX_1 = 0;
|
|
|
|
/* Extern variables ----------------------------------------------------------*/
|
|
/* Private function prototypes -----------------------------------------------*/
|
|
static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len);
|
|
/* Private functions ---------------------------------------------------------*/
|
|
|
|
/*******************************************************************************
|
|
* Function Name : Set_System
|
|
* Description : Configures Main system clocks & power.
|
|
* Input : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
void Set_System(void)
|
|
{
|
|
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
|
|
/* RCC system reset(for debug purpose) */
|
|
RCC_DeInit();
|
|
|
|
/* Enable HSE */
|
|
RCC_HSEConfig(RCC_HSE_ON);
|
|
|
|
/* Wait till HSE is ready */
|
|
HSEStartUpStatus = RCC_WaitForHSEStartUp();
|
|
|
|
if (HSEStartUpStatus == SUCCESS)
|
|
{
|
|
/* Enable Prefetch Buffer */
|
|
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
|
|
|
|
/* Flash 2 wait state */
|
|
FLASH_SetLatency(FLASH_Latency_2);
|
|
|
|
/* HCLK = SYSCLK */
|
|
RCC_HCLKConfig(RCC_SYSCLK_Div1);
|
|
|
|
/* PCLK2 = HCLK */
|
|
RCC_PCLK2Config(RCC_HCLK_Div1);
|
|
|
|
/* PCLK1 = HCLK/2 */
|
|
RCC_PCLK1Config(RCC_HCLK_Div2);
|
|
|
|
/* ADCCLK = PCLK2/8 */
|
|
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
|
|
|
|
#ifdef STM32F10X_CL
|
|
/* Configure PLLs *********************************************************/
|
|
/* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
|
|
RCC_PREDIV2Config(RCC_PREDIV2_Div5);
|
|
RCC_PLL2Config(RCC_PLL2Mul_8);
|
|
|
|
/* Enable PLL2 */
|
|
RCC_PLL2Cmd(ENABLE);
|
|
|
|
/* Wait till PLL2 is ready */
|
|
while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
|
|
{}
|
|
|
|
/* PLL configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz */
|
|
RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
|
|
RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);
|
|
#else
|
|
/* PLLCLK = 8MHz * 9 = 72 MHz */
|
|
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
|
|
#endif
|
|
|
|
/* Enable PLL */
|
|
RCC_PLLCmd(ENABLE);
|
|
|
|
/* Wait till PLL is ready */
|
|
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
|
|
{
|
|
}
|
|
|
|
/* Select PLL as system clock source */
|
|
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
|
|
|
|
/* Wait till PLL is used as system clock source */
|
|
while(RCC_GetSYSCLKSource() != 0x08)
|
|
{
|
|
}
|
|
}
|
|
else
|
|
{ /* If HSE fails to start-up, the application will have wrong clock configuration.
|
|
User can add here some code to deal with this error */
|
|
|
|
/* Go to infinite loop */
|
|
while (1)
|
|
{
|
|
}
|
|
}
|
|
|
|
/* Configure the used GPIOs*/
|
|
GPIO_Configuration();
|
|
|
|
/* Configure the KEY button in EXTI mode */
|
|
//STM_EVAL_PBInit(Button_KEY, Mode_EXTI);
|
|
|
|
/* Configure the Tamper button in EXTI mode */
|
|
//STM_EVAL_PBInit(Button_TAMPER, Mode_EXTI);
|
|
|
|
/* Additional EXTI configuration (configure both edges) */
|
|
//EXTI_Configuration();
|
|
|
|
/* Configure the LEDs */
|
|
STM_EVAL_LEDInit(LED1);
|
|
STM_EVAL_LEDInit(LED2);
|
|
STM_EVAL_LEDInit(LED3);
|
|
STM_EVAL_LEDInit(LED4);
|
|
|
|
/* Configure the ADC*/
|
|
// ADC_Configuration();
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : Set_USBClock
|
|
* Description : Configures USB Clock input (48MHz).
|
|
* Input : None.
|
|
* Output : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
void Set_USBClock(void)
|
|
{
|
|
#ifdef STM32F10X_CL
|
|
/* Select USBCLK source */
|
|
RCC_OTGFSCLKConfig(RCC_OTGFSCLKSource_PLLVCO_Div3);
|
|
|
|
/* Enable the USB clock */
|
|
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_OTG_FS, ENABLE) ;
|
|
#else
|
|
/* Select USBCLK source */
|
|
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
|
|
|
|
/* Enable the USB clock */
|
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);
|
|
#endif /* STM32F10X_CL */
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : Enter_LowPowerMode.
|
|
* Description : Power-off system clocks and power while entering suspend mode.
|
|
* Input : None.
|
|
* Output : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
void Enter_LowPowerMode(void)
|
|
{
|
|
/* Set the device state to suspend */
|
|
bDeviceState = SUSPENDED;
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : Leave_LowPowerMode.
|
|
* Description : Restores system clocks and power while exiting suspend mode.
|
|
* Input : None.
|
|
* Output : 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;
|
|
}
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : USB_Interrupts_Config.
|
|
* Description : Configures the USB interrupts.
|
|
* Input : None.
|
|
* Output : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
void USB_Interrupts_Config(void)
|
|
{
|
|
NVIC_InitTypeDef NVIC_InitStructure;
|
|
|
|
/* 2 bit for pre-emption priority, 2 bits for subpriority */
|
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
|
|
|
|
#ifdef STM32F10X_CL
|
|
/* Enable the USB Interrupts */
|
|
NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn;
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
#else
|
|
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
#endif /* STM32F10X_CL */
|
|
|
|
/* Enable the EXTI9_5 Interrupt */
|
|
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
|
|
/* Enable the EXTI15_10 Interrupt */
|
|
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
|
|
/* Enable the DMA1 Channel1 Interrupt */
|
|
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : USB_Cable_Config.
|
|
* Description : Software Connection/Disconnection of USB Cable.
|
|
* Input : NewState: new state.
|
|
* Output : None.
|
|
* Return : None
|
|
*******************************************************************************/
|
|
void USB_Cable_Config (FunctionalState NewState)
|
|
{
|
|
#ifdef USE_STM3210C_EVAL
|
|
if (NewState != DISABLE)
|
|
{
|
|
USB_DevConnect();
|
|
}
|
|
else
|
|
{
|
|
USB_DevDisconnect();
|
|
}
|
|
#else /* USE_STM3210B_EVAL or USE_STM3210E_EVAL */
|
|
if (NewState != DISABLE)
|
|
{
|
|
GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
|
|
}
|
|
else
|
|
{
|
|
GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
|
|
}
|
|
#endif /* USE_STM3210C_EVAL */
|
|
}
|
|
/*******************************************************************************
|
|
* Function Name : Reset_Device.
|
|
* Description : Reset the device.
|
|
* Input : None.
|
|
* Output : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
void Reset_Device(void)
|
|
{
|
|
USB_Cable_Config(DISABLE);
|
|
NVIC_SystemReset();
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : GPIO_Configuration
|
|
* Description : Configures the different GPIO ports.
|
|
* Input : None
|
|
* Output : None
|
|
* Return : None
|
|
*******************************************************************************/
|
|
void GPIO_Configuration(void)
|
|
{
|
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|
|
|
|
|
|
|
#ifndef USE_STM3210C_EVAL
|
|
/* 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);
|
|
#endif /* USE_STM3210C_EVAL */
|
|
|
|
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : EXTI_Configuration.
|
|
* Description : Configure the EXTI lines for Key and Tamper push buttons.
|
|
* Input : None.
|
|
* Output : None.
|
|
* Return value : The direction value.
|
|
*******************************************************************************/
|
|
void EXTI_Configuration(void)
|
|
{
|
|
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : ADC_Configuration.
|
|
* Description : Configure the ADC and DMA.
|
|
* Input : None.
|
|
* Output : None.
|
|
* Return value : The direction value.
|
|
*******************************************************************************/
|
|
void ADC_Configuration(void)
|
|
{
|
|
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : Get_SerialNum.
|
|
* Description : Create the serial number string descriptor.
|
|
* Input : None.
|
|
* Output : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
void Get_SerialNum(void)
|
|
{
|
|
uint32_t Device_Serial0, Device_Serial1, Device_Serial2;
|
|
|
|
Device_Serial0 = *(__IO uint32_t*)(0x1FFFF7E8);
|
|
Device_Serial1 = *(__IO uint32_t*)(0x1FFFF7EC);
|
|
Device_Serial2 = *(__IO uint32_t*)(0x1FFFF7F0);
|
|
|
|
Device_Serial0 += Device_Serial2;
|
|
|
|
if (Device_Serial0 != 0)
|
|
{
|
|
IntToUnicode (Device_Serial0, &CustomHID_StringSerial[2] , 8);
|
|
IntToUnicode (Device_Serial1, &CustomHID_StringSerial[18], 4);
|
|
}
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name : HexToChar.
|
|
* Description : Convert Hex 32Bits value into char.
|
|
* Input : None.
|
|
* Output : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len)
|
|
{
|
|
uint8_t idx = 0;
|
|
|
|
for( idx = 0 ; idx < len ; idx ++)
|
|
{
|
|
if( ((value >> 28)) < 0xA )
|
|
{
|
|
pbuf[ 2* idx] = (value >> 28) + '0';
|
|
}
|
|
else
|
|
{
|
|
pbuf[2* idx] = (value >> 28) + 'A' - 10;
|
|
}
|
|
|
|
value = value << 4;
|
|
|
|
pbuf[ 2* idx + 1] = 0;
|
|
}
|
|
}
|
|
#ifdef STM32F10X_CL
|
|
/*******************************************************************************
|
|
* Function Name : USB_OTG_BSP_uDelay.
|
|
* Description : provide delay (usec).
|
|
* Input : None.
|
|
* Output : None.
|
|
* Return : None.
|
|
*******************************************************************************/
|
|
void USB_OTG_BSP_uDelay (const uint32_t usec)
|
|
{
|
|
RCC_ClocksTypeDef RCC_Clocks;
|
|
|
|
/* Configure HCLK clock as SysTick clock source */
|
|
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
|
|
|
|
RCC_GetClocksFreq(&RCC_Clocks);
|
|
|
|
SysTick_Config(usec * (RCC_Clocks.HCLK_Frequency / 1000000));
|
|
|
|
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk ;
|
|
|
|
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
|
|
}
|
|
#endif
|
|
/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/
|