From 6482cf2a698d1108510680f95ac0373ac21b92ce Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 30 Jul 2017 16:10:36 +0200 Subject: USB HID host code import --- main.c | 296 +++++++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 214 insertions(+), 82 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index eb093c4..f0141f0 100644 --- a/main.c +++ b/main.c @@ -1,82 +1,214 @@ - -#include -#include -#include -#include -#include -#include -#include -/* - * Part number: STM32F030F4C6 - */ - -void _init(void) {} - -void tick(void) { - for(int i=0; i<50; i++) - __asm__("nop"); -} - -int main(void) { - /* - RCC->CR |= RCC_CR_HSEON; - while (!(RCC->CR&RCC_CR_HSERDY)); - RCC->CFGR &= ~RCC_CFGR_PLLMUL_Msk & ~RCC_CFGR_SW_Msk; - RCC->CFGR |= (2<CFGR2 &= ~RCC_CFGR2_PREDIV_Msk; - RCC->CFGR2 |= RCC_CFGR2_PREDIV_DIV2; - RCC->CR |= RCC_CR_PLLON; - while (!(RCC->CR&RCC_CR_PLLRDY)); - RCC->CFGR |= (2<AHB1ENR |= RCC_AHB1ENR_GPIOAEN; - - GPIOA->MODER |= - (1<OSPEEDR |= - (2<BSRR = GPIO_BSRR_BR_5; - GPIOA->BSRR = GPIO_BSRR_BR_6; - GPIOA->BSRR = GPIO_BSRR_BR_7; - while (42) { - for (int i=0; i<10000; i++) - tick(); - GPIOA->BSRR = GPIO_BSRR_BS_5; - GPIOA->BSRR = GPIO_BSRR_BS_6; - GPIOA->BSRR = GPIO_BSRR_BS_7; - for (int i=0; i<10000; i++) - tick(); - GPIOA->BSRR = GPIO_BSRR_BR_5; - GPIOA->BSRR = GPIO_BSRR_BR_6; - GPIOA->BSRR = GPIO_BSRR_BR_7; - } -} - -void NMI_Handler(void) { -} - -void HardFault_Handler(void) { - for(;;); -} - -void SVC_Handler(void) { -} - - -void PendSV_Handler(void) { -} - -void SysTick_Handler(void) { -} - +/** + ****************************************************************************** + * @file USB_Host/HID_Standalone/Src/main.c + * @author MCD Application Team + * @version V1.1.0 + * @date 17-February-2017 + * @brief USB host HID Mouse and Keyboard demo main file + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics International N.V. + * All rights reserved.

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution 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 other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS 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. + * + ****************************************************************************** + */ +#include "main.h" + +USBH_HandleTypeDef hUSBHost; +HID_ApplicationTypeDef Appli_state = APPLICATION_IDLE; + +static void SystemClock_Config(void); +static void USBH_UserProcess(USBH_HandleTypeDef* phost, uint8_t id); +static void HID_InitApplication(void); +static void Error_Handler(void); + +int main(void) +{ + HAL_Init(); + SystemClock_Config(); + HID_InitApplication(); + USBH_Init(&hUSBHost, USBH_UserProcess, 0); + USBH_RegisterClass(&hUSBHost, USBH_HID_CLASS); + USBH_Start(&hUSBHost); + + while (1) { + USBH_Process(&hUSBHost); + HID_MenuProcess(); + } +} + +static void HID_InitApplication(void) +{ + BSP_LED_Init(LED1); + BSP_LED_Init(LED2); + BSP_LED_Init(LED3); + BSP_LED_Init(LED4); + + BSP_PB_Init(BUTTON_WAKEUP, BUTTON_MODE_GPIO); + + HID_MenuInit(); +} + +static void USBH_UserProcess(USBH_HandleTypeDef* phost, uint8_t id) +{ + switch (id) { + case HOST_USER_SELECT_CONFIGURATION: + break; + + case HOST_USER_DISCONNECTION: + Appli_state = APPLICATION_DISCONNECT; + break; + + case HOST_USER_CLASS_ACTIVE: + Appli_state = APPLICATION_READY; + break; + + case HOST_USER_CONNECTION: + Appli_state = APPLICATION_START; + break; + + default: + break; + } +} + +void Toggle_Leds(void) +{ + static uint32_t ticks; + + if (ticks++ == 100) { + BSP_LED_Toggle(LED1); + BSP_LED_Toggle(LED2); + BSP_LED_Toggle(LED3); + BSP_LED_Toggle(LED4); + ticks = 0; + } +} + +/** + * @brief System Clock Configuration + * The system Clock is configured as follow : + * System Clock source = PLL (HSE) + * SYSCLK(Hz) = 180000000 + * HCLK(Hz) = 180000000 + * AHB Prescaler = 1 + * APB1 Prescaler = 4 + * APB2 Prescaler = 2 + * HSE Frequency(Hz) = 8000000 + * PLL_M = 8 + * PLL_N = 360 + * PLL_P = 2 + * PLL_Q = 7 + * PLL_R = 2 + * VDD(V) = 3.3 + * Main regulator output voltage = Scale1 mode + * Flash Latency(WS) = 5 + * The USB clock configuration from PLLSAI: + * PLLSAIM = 8 + * PLLSAIN = 384 + * PLLSAIP = 8 + * @param None + * @retval None + */ +static void SystemClock_Config(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; + + /* Enable Power Control clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* The voltage scaling allows optimizing the power consumption when the device + is + clocked below the maximum system frequency, to update the voltage scaling + value + regarding system frequency refer to product datasheet. */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /* Enable HSE Oscillator and activate PLL with HSE as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; +#if defined(USE_STM32469I_DISCO_REVA) + RCC_OscInitStruct.PLL.PLLM = 25; +#else + RCC_OscInitStruct.PLL.PLLM = 8; +#endif /* USE_STM32469I_DISCO_REVA */ + RCC_OscInitStruct.PLL.PLLN = 360; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + Error_Handler(); + + /* Enable the OverDrive to reach the 180 Mhz Frequency */ + if (HAL_PWREx_EnableOverDrive() != HAL_OK) + Error_Handler(); + + /* Select PLLSAI output as USB clock source */ + PeriphClkInitStruct.PLLSAI.PLLSAIQ = 7; + PeriphClkInitStruct.PLLSAI.PLLSAIN = 384; + PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV8; + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CK48; + PeriphClkInitStruct.Clk48ClockSelection = RCC_CK48CLKSOURCE_PLLSAIP; + HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); + + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 + clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) + Error_Handler(); +} + +void HAL_Delay(__IO uint32_t Delay) +{ + while (Delay) { + if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) + Delay--; + } +} + +static void Error_Handler(void) +{ + while (1) + ; +} + -- cgit