/** ****************************************************************************** * @file stm32l0xx_nucleo.c * @author MCD Application Team * @brief This file provides set of firmware functions to manage: * - LEDs and push-button available on STM32L0XX-Nucleo Kit * from STMicroelectronics * - LCD, joystick and microSD available on Adafruit 1.8" TFT LCD * shield (reference ID 802) ****************************************************************************** * @attention * * Copyright (c) 2016 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "stm32l0xx_nucleo.h" /** @addtogroup BSP * @{ */ /** @addtogroup STM32L0XX_NUCLEO * @{ */ /** @addtogroup STM32L0XX_NUCLEO_LOW_LEVEL * @brief This file provides set of firmware functions to manage Leds and push-button * available on STM32L0XX-Nucleo Kit from STMicroelectronics. * @{ */ /** @defgroup STM32L0XX_NUCLEO_LOW_LEVEL_Private_TypesDefinitions Private Types Definitions * @{ */ /** * @} */ /** @defgroup STM32L0XX_NUCLEO_LOW_LEVEL_Private_Defines Private Defines * @{ */ /** * @brief STM32L0XX NUCLEO BSP Driver version number */ #define __STM32L0XX_NUCLEO_BSP_VERSION_MAIN (0x02) /*!< [31:24] main version */ #define __STM32L0XX_NUCLEO_BSP_VERSION_SUB1 (0x01) /*!< [23:16] sub1 version */ #define __STM32L0XX_NUCLEO_BSP_VERSION_SUB2 (0x04) /*!< [15:8] sub2 version */ #define __STM32L0XX_NUCLEO_BSP_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32L0XX_NUCLEO_BSP_VERSION ((__STM32L0XX_NUCLEO_BSP_VERSION_MAIN << 24)\ |(__STM32L0XX_NUCLEO_BSP_VERSION_SUB1 << 16)\ |(__STM32L0XX_NUCLEO_BSP_VERSION_SUB2 << 8 )\ |(__STM32L0XX_NUCLEO_BSP_VERSION_RC)) /** * @brief LINK SD Card */ #define SD_DUMMY_BYTE 0xFF #define SD_NO_RESPONSE_EXPECTED 0x80 /** * @} */ /** @defgroup STM32L0XX_NUCLEO_LOW_LEVEL_Private_Variables Private Variables * @{ */ GPIO_TypeDef* LED_PORT[LEDn] = {LED2_GPIO_PORT}; const uint16_t LED_PIN[LEDn] = {LED2_PIN}; GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {USER_BUTTON_GPIO_PORT }; const uint16_t BUTTON_PIN[BUTTONn] = {USER_BUTTON_PIN }; const uint8_t BUTTON_IRQn[BUTTONn] = {USER_BUTTON_EXTI_IRQn }; /** * @brief BUS variables */ #ifdef HAL_SPI_MODULE_ENABLED uint32_t SpixTimeout = NUCLEO_SPIx_TIMEOUT_MAX; /*SR) & SPI_FLAG_TXE) != SPI_FLAG_TXE) { } /* Need to invert bytes for LCD*/ *((__IO uint8_t*)&hnucleo_Spi.Instance->DR) = *(pData+1); while(((hnucleo_Spi.Instance->SR) & SPI_FLAG_TXE) != SPI_FLAG_TXE) { } *((__IO uint8_t*)&hnucleo_Spi.Instance->DR) = *pData; counter--; pData += 2; } /* Wait until the bus is ready before releasing Chip select */ while(((hnucleo_Spi.Instance->SR) & SPI_FLAG_BSY) != RESET) { } } /* Empty the Rx fifo */ data = *(&hnucleo_Spi.Instance->DR); UNUSED(data); /* Remove GNU warning */ /* Deselect : Chip Select high */ LCD_CS_HIGH(); } /** * @brief Wait for loop in ms. * @param Delay in ms. * @retval None */ void LCD_Delay(uint32_t Delay) { HAL_Delay(Delay); } #endif /* HAL_SPI_MODULE_ENABLED */ /******************************* LINK JOYSTICK ********************************/ #ifdef HAL_ADC_MODULE_ENABLED /** * @brief Initialize ADC MSP. * @retval None */ static void ADCx_MspInit(ADC_HandleTypeDef *hadc) { GPIO_InitTypeDef gpioinitstruct = {0}; /*** Configure the GPIOs ***/ /* Enable GPIO clock */ NUCLEO_ADCx_GPIO_CLK_ENABLE(); /* Configure ADC1 Channel8 as analog input */ gpioinitstruct.Pin = NUCLEO_ADCx_GPIO_PIN ; gpioinitstruct.Mode = GPIO_MODE_ANALOG; gpioinitstruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(NUCLEO_ADCx_GPIO_PORT, &gpioinitstruct); /*** Configure the ADC peripheral ***/ /* Enable ADC clock */ NUCLEO_ADCx_CLK_ENABLE(); } /** * @brief DeInitializes ADC MSP. * @param hadc: ADC peripheral * @note ADC DeInit does not disable the GPIO clock * @retval None */ static void ADCx_MspDeInit(ADC_HandleTypeDef *hadc) { GPIO_InitTypeDef gpioinitstruct; /*** DeInit the ADC peripheral ***/ /* Disable ADC clock */ NUCLEO_ADCx_CLK_DISABLE(); /* Configure the selected ADC Channel as analog input */ gpioinitstruct.Pin = NUCLEO_ADCx_GPIO_PIN ; HAL_GPIO_DeInit(NUCLEO_ADCx_GPIO_PORT, gpioinitstruct.Pin); /* Disable GPIO clock has to be done by the application*/ /* NUCLEO_ADCx_GPIO_CLK_DISABLE(); */ } /** * @brief Initializes ADC HAL. * @retval None */ static HAL_StatusTypeDef ADCx_Init(void) { /* Set ADC instance */ hnucleo_Adc.Instance = NUCLEO_ADCx; if(HAL_ADC_GetState(&hnucleo_Adc) == HAL_ADC_STATE_RESET) { /* ADC Config */ hnucleo_Adc.Instance = NUCLEO_ADCx; hnucleo_Adc.Init.OversamplingMode = DISABLE; hnucleo_Adc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; /* (must not exceed 16MHz) */ hnucleo_Adc.Init.LowPowerAutoPowerOff = DISABLE; hnucleo_Adc.Init.LowPowerFrequencyMode = ENABLE; hnucleo_Adc.Init.LowPowerAutoWait = ENABLE; hnucleo_Adc.Init.Resolution = ADC_RESOLUTION_12B; hnucleo_Adc.Init.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; hnucleo_Adc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; hnucleo_Adc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hnucleo_Adc.Init.ContinuousConvMode = DISABLE; hnucleo_Adc.Init.DiscontinuousConvMode = DISABLE; hnucleo_Adc.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* Trig of conversion start done manually by software, without external event */ hnucleo_Adc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because trig by software start */ hnucleo_Adc.Init.EOCSelection = ADC_EOC_SEQ_CONV; hnucleo_Adc.Init.DMAContinuousRequests = DISABLE; /* Initialize MSP related to ADC */ ADCx_MspInit(&hnucleo_Adc); /* Initialize ADC */ if (HAL_ADC_Init(&hnucleo_Adc) != HAL_OK) { return HAL_ERROR; } if (HAL_ADCEx_Calibration_Start(&hnucleo_Adc,ADC_SINGLE_ENDED) != HAL_OK) { return HAL_ERROR; } } return HAL_OK; } /** * @brief Initializes ADC HAL. * @retval None */ static void ADCx_DeInit(void) { hnucleo_Adc.Instance = NUCLEO_ADCx; HAL_ADC_DeInit(&hnucleo_Adc); ADCx_MspDeInit(&hnucleo_Adc); } /******************************* LINK JOYSTICK ********************************/ /** * @brief Configures joystick available on adafruit 1.8" TFT shield * managed through ADC to detect motion. * @retval Joystickstatus (0=> success, 1=> fail) */ uint8_t BSP_JOY_Init(void) { if (ADCx_Init() != HAL_OK) { return (uint8_t) HAL_ERROR; } /* Select Channel 8 to be converted */ sConfig.Channel = ADC_CHANNEL_8; sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; /* Return Joystick initialization status */ return (uint8_t) HAL_ADC_ConfigChannel(&hnucleo_Adc, &sConfig); } /** * @brief DeInit joystick GPIOs. * @note JOY DeInit does not disable the Mfx, just set the Mfx pins in Off mode * @retval None. */ void BSP_JOY_DeInit(void) { ADCx_DeInit(); } /** * @brief Returns the Joystick key pressed. * @note To know which Joystick key is pressed we need to detect the voltage * level on each key output * - None : 3.3 V / 4095 * - SEL : 1.055 V / 1308 * - DOWN : 0.71 V / 88 * - LEFT : 3.0 V / 3720 * - RIGHT : 0.595 V / 737 * - UP : 1.65 V / 2046 * @retval JOYState_TypeDef: Code of the Joystick key pressed. */ JOYState_TypeDef BSP_JOY_GetState(void) { JOYState_TypeDef state = JOY_NONE; uint16_t keyconvertedvalue = 0; /* Start the conversion process */ HAL_ADC_Start(&hnucleo_Adc); /* Wait for the end of conversion */ if (HAL_ADC_PollForConversion(&hnucleo_Adc, 10) != HAL_TIMEOUT) { /* Get the converted value of regular channel */ keyconvertedvalue = HAL_ADC_GetValue(&hnucleo_Adc); } if((keyconvertedvalue > 2010) && (keyconvertedvalue < 2090)) { state = JOY_UP; } else if((keyconvertedvalue > 680) && (keyconvertedvalue < 780)) { state = JOY_RIGHT; } else if((keyconvertedvalue > 1270) && (keyconvertedvalue < 1350)) { state = JOY_SEL; } else if((keyconvertedvalue > 50) && (keyconvertedvalue < 130)) { state = JOY_DOWN; } else if((keyconvertedvalue > 3570) && (keyconvertedvalue < 3800)) { state = JOY_LEFT; } else { state = JOY_NONE; } /* Return the code of the Joystick key pressed */ return state; } #endif /* HAL_ADC_MODULE_ENABLED */ /** * @} */ /** * @} */ /** * @} */ /** * @} */