my fork

Dependencies:   mbed

Committer:
filartrix
Date:
Wed Apr 08 14:17:20 2015 +0000
Revision:
4:987b201ec4b1
first

Who changed what in which revision?

UserRevisionLine numberNew contents of line
filartrix 4:987b201ec4b1 1 /**
filartrix 4:987b201ec4b1 2 ******************************************************************************
filartrix 4:987b201ec4b1 3 * @file stm32f4xx_nucleo.c
filartrix 4:987b201ec4b1 4 * @author MCD Application Team
filartrix 4:987b201ec4b1 5 * @version V1.1.0
filartrix 4:987b201ec4b1 6 * @date 19-June-2014
filartrix 4:987b201ec4b1 7 * @cond DOXYGEN_EXCLUDE
filartrix 4:987b201ec4b1 8 * @brief This file provides set of firmware functions to manage:
filartrix 4:987b201ec4b1 9 * + LEDs and push-button available on STM32F4XX-Nucleo Kit
filartrix 4:987b201ec4b1 10 * from STMicroelectronics.
filartrix 4:987b201ec4b1 11 * + LCD, joystick and microSD available on Adafruit 1.8" TFT LCD
filartrix 4:987b201ec4b1 12 * Expansion Board (reference ID 802).
filartrix 4:987b201ec4b1 13 * @endcond
filartrix 4:987b201ec4b1 14 ******************************************************************************
filartrix 4:987b201ec4b1 15 * @attention
filartrix 4:987b201ec4b1 16 *
filartrix 4:987b201ec4b1 17 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
filartrix 4:987b201ec4b1 18 *
filartrix 4:987b201ec4b1 19 * Redistribution and use in source and binary forms, with or without modification,
filartrix 4:987b201ec4b1 20 * are permitted provided that the following conditions are met:
filartrix 4:987b201ec4b1 21 * 1. Redistributions of source code must retain the above copyright notice,
filartrix 4:987b201ec4b1 22 * this list of conditions and the following disclaimer.
filartrix 4:987b201ec4b1 23 * 2. Redistributions in binary form must reproduce the above copyright notice,
filartrix 4:987b201ec4b1 24 * this list of conditions and the following disclaimer in the documentation
filartrix 4:987b201ec4b1 25 * and/or other materials provided with the distribution.
filartrix 4:987b201ec4b1 26 * 3. Neither the name of STMicroelectronics nor the names of its contributors
filartrix 4:987b201ec4b1 27 * may be used to endorse or promote products derived from this software
filartrix 4:987b201ec4b1 28 * without specific prior written permission.
filartrix 4:987b201ec4b1 29 *
filartrix 4:987b201ec4b1 30 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
filartrix 4:987b201ec4b1 31 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
filartrix 4:987b201ec4b1 32 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
filartrix 4:987b201ec4b1 33 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
filartrix 4:987b201ec4b1 34 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
filartrix 4:987b201ec4b1 35 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
filartrix 4:987b201ec4b1 36 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
filartrix 4:987b201ec4b1 37 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
filartrix 4:987b201ec4b1 38 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
filartrix 4:987b201ec4b1 39 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
filartrix 4:987b201ec4b1 40 *
filartrix 4:987b201ec4b1 41 ******************************************************************************
filartrix 4:987b201ec4b1 42 */
filartrix 4:987b201ec4b1 43
filartrix 4:987b201ec4b1 44 /* Includes ------------------------------------------------------------------*/
filartrix 4:987b201ec4b1 45 #include "stm32f4xx_nucleo.h"
filartrix 4:987b201ec4b1 46
filartrix 4:987b201ec4b1 47 /** @addtogroup BSP
filartrix 4:987b201ec4b1 48 * @{
filartrix 4:987b201ec4b1 49 */
filartrix 4:987b201ec4b1 50
filartrix 4:987b201ec4b1 51 /** @addtogroup STM32F4XX_NUCLEO
filartrix 4:987b201ec4b1 52 * @{
filartrix 4:987b201ec4b1 53 */
filartrix 4:987b201ec4b1 54
filartrix 4:987b201ec4b1 55 /** @addtogroup STM32F4XX_NUCLEO_LOW_LEVEL
filartrix 4:987b201ec4b1 56 * @brief This file provides set of firmware functions to manage Leds and push-button
filartrix 4:987b201ec4b1 57 * available on STM32F4xx-Nucleo Kit from STMicroelectronics.
filartrix 4:987b201ec4b1 58 * @{
filartrix 4:987b201ec4b1 59 */
filartrix 4:987b201ec4b1 60
filartrix 4:987b201ec4b1 61 /** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_Private_TypesDefinitions
filartrix 4:987b201ec4b1 62 * @{
filartrix 4:987b201ec4b1 63 */
filartrix 4:987b201ec4b1 64 /**
filartrix 4:987b201ec4b1 65 * @}
filartrix 4:987b201ec4b1 66 */
filartrix 4:987b201ec4b1 67
filartrix 4:987b201ec4b1 68
filartrix 4:987b201ec4b1 69 /** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_Private_Defines
filartrix 4:987b201ec4b1 70 * @{
filartrix 4:987b201ec4b1 71 */
filartrix 4:987b201ec4b1 72
filartrix 4:987b201ec4b1 73 /**
filartrix 4:987b201ec4b1 74 * @brief STM32F4xx NUCLEO BSP Driver version number V1.1.0
filartrix 4:987b201ec4b1 75 */
filartrix 4:987b201ec4b1 76 #define __STM32F4xx_NUCLEO_BSP_VERSION_MAIN (0x01) /*!< [31:24] main version */
filartrix 4:987b201ec4b1 77 #define __STM32F4xx_NUCLEO_BSP_VERSION_SUB1 (0x01) /*!< [23:16] sub1 version */
filartrix 4:987b201ec4b1 78 #define __STM32F4xx_NUCLEO_BSP_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */
filartrix 4:987b201ec4b1 79 #define __STM32F4xx_NUCLEO_BSP_VERSION_RC (0x00) /*!< [7:0] release candidate */
filartrix 4:987b201ec4b1 80 #define __STM32F4xx_NUCLEO_BSP_VERSION ((__STM32F4xx_NUCLEO_BSP_VERSION_MAIN << 24)\
filartrix 4:987b201ec4b1 81 |(__STM32F4xx_NUCLEO_BSP_VERSION_SUB1 << 16)\
filartrix 4:987b201ec4b1 82 |(__STM32F4xx_NUCLEO_BSP_VERSION_SUB2 << 8 )\
filartrix 4:987b201ec4b1 83 |(__STM32F4xx_NUCLEO_BSP_VERSION_RC))
filartrix 4:987b201ec4b1 84
filartrix 4:987b201ec4b1 85 /**
filartrix 4:987b201ec4b1 86 * @brief LINK SD Card
filartrix 4:987b201ec4b1 87 */
filartrix 4:987b201ec4b1 88 #define SD_DUMMY_BYTE 0xFF
filartrix 4:987b201ec4b1 89 #define SD_NO_RESPONSE_EXPECTED 0x80
filartrix 4:987b201ec4b1 90
filartrix 4:987b201ec4b1 91 /**
filartrix 4:987b201ec4b1 92 * @}
filartrix 4:987b201ec4b1 93 */
filartrix 4:987b201ec4b1 94
filartrix 4:987b201ec4b1 95 /** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_Private_Macros
filartrix 4:987b201ec4b1 96 * @{
filartrix 4:987b201ec4b1 97 */
filartrix 4:987b201ec4b1 98 /**
filartrix 4:987b201ec4b1 99 * @}
filartrix 4:987b201ec4b1 100 */
filartrix 4:987b201ec4b1 101
filartrix 4:987b201ec4b1 102 /** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_Private_Variables
filartrix 4:987b201ec4b1 103 * @{
filartrix 4:987b201ec4b1 104 */
filartrix 4:987b201ec4b1 105 GPIO_TypeDef* GPIO_PORT[LEDn] = {LED2_GPIO_PORT};
filartrix 4:987b201ec4b1 106
filartrix 4:987b201ec4b1 107 const uint16_t GPIO_PIN[LEDn] = {LED2_PIN};
filartrix 4:987b201ec4b1 108
filartrix 4:987b201ec4b1 109 GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {KEY_BUTTON_GPIO_PORT};
filartrix 4:987b201ec4b1 110 const uint16_t BUTTON_PIN[BUTTONn] = {KEY_BUTTON_PIN};
filartrix 4:987b201ec4b1 111 const uint8_t BUTTON_IRQn[BUTTONn] = {KEY_BUTTON_EXTI_IRQn};
filartrix 4:987b201ec4b1 112
filartrix 4:987b201ec4b1 113 /**
filartrix 4:987b201ec4b1 114 * @brief BUS variables
filartrix 4:987b201ec4b1 115 */
filartrix 4:987b201ec4b1 116
filartrix 4:987b201ec4b1 117 uint32_t SpixTimeout = NUCLEO_SPIx_TIMEOUT_MAX; /*<! Value of Timeout when SPI communication fails */
filartrix 4:987b201ec4b1 118 static SPI_HandleTypeDef hnucleo_Spi;
filartrix 4:987b201ec4b1 119 static ADC_HandleTypeDef hnucleo_Adc;
filartrix 4:987b201ec4b1 120
filartrix 4:987b201ec4b1 121 /* ADC channel configuration structure declaration */
filartrix 4:987b201ec4b1 122 static ADC_ChannelConfTypeDef sConfig;
filartrix 4:987b201ec4b1 123
filartrix 4:987b201ec4b1 124 /**
filartrix 4:987b201ec4b1 125 * @}
filartrix 4:987b201ec4b1 126 */
filartrix 4:987b201ec4b1 127
filartrix 4:987b201ec4b1 128 /** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_Private_FunctionPrototypes
filartrix 4:987b201ec4b1 129 * @{
filartrix 4:987b201ec4b1 130 */
filartrix 4:987b201ec4b1 131 static void SPIx_Init(void);
filartrix 4:987b201ec4b1 132 static void SPIx_Write(uint8_t Value);
filartrix 4:987b201ec4b1 133 static uint32_t SPIx_Read(void);
filartrix 4:987b201ec4b1 134 static void SPIx_Error(void);
filartrix 4:987b201ec4b1 135 static void SPIx_MspInit(SPI_HandleTypeDef *hspi);
filartrix 4:987b201ec4b1 136
filartrix 4:987b201ec4b1 137 static void ADCx_Init(void);
filartrix 4:987b201ec4b1 138 static void ADCx_MspInit(ADC_HandleTypeDef *hadc);
filartrix 4:987b201ec4b1 139
filartrix 4:987b201ec4b1 140 /* SD IO functions */
filartrix 4:987b201ec4b1 141 void SD_IO_Init(void);
filartrix 4:987b201ec4b1 142 HAL_StatusTypeDef SD_IO_WriteCmd(uint8_t Cmd, uint32_t Arg, uint8_t Crc, uint8_t Response);
filartrix 4:987b201ec4b1 143 HAL_StatusTypeDef SD_IO_WaitResponse(uint8_t Response);
filartrix 4:987b201ec4b1 144 void SD_IO_WriteDummy(void);
filartrix 4:987b201ec4b1 145 void SD_IO_WriteByte(uint8_t Data);
filartrix 4:987b201ec4b1 146 uint8_t SD_IO_ReadByte(void);
filartrix 4:987b201ec4b1 147
filartrix 4:987b201ec4b1 148 /* LCD IO functions */
filartrix 4:987b201ec4b1 149 void LCD_IO_Init(void);
filartrix 4:987b201ec4b1 150 void LCD_IO_WriteData(uint8_t Data);
filartrix 4:987b201ec4b1 151 void LCD_IO_WriteReg(uint8_t LCDReg);
filartrix 4:987b201ec4b1 152 void LCD_Delay(uint32_t delay);
filartrix 4:987b201ec4b1 153 /**
filartrix 4:987b201ec4b1 154 * @}
filartrix 4:987b201ec4b1 155 */
filartrix 4:987b201ec4b1 156
filartrix 4:987b201ec4b1 157 /** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_Private_Functions
filartrix 4:987b201ec4b1 158 * @{
filartrix 4:987b201ec4b1 159 */
filartrix 4:987b201ec4b1 160
filartrix 4:987b201ec4b1 161 /**
filartrix 4:987b201ec4b1 162 * @brief This method returns the STM32F4xx NUCLEO BSP Driver revision
filartrix 4:987b201ec4b1 163 * @param None
filartrix 4:987b201ec4b1 164 * @retval version: 0xXYZR (8bits for each decimal, R for RC)
filartrix 4:987b201ec4b1 165 */
filartrix 4:987b201ec4b1 166 uint32_t BSP_GetVersion(void)
filartrix 4:987b201ec4b1 167 {
filartrix 4:987b201ec4b1 168 return __STM32F4xx_NUCLEO_BSP_VERSION;
filartrix 4:987b201ec4b1 169 }
filartrix 4:987b201ec4b1 170
filartrix 4:987b201ec4b1 171 /**
filartrix 4:987b201ec4b1 172 * @brief Configures LED GPIO.
filartrix 4:987b201ec4b1 173 * @param Led: Specifies the Led to be configured.
filartrix 4:987b201ec4b1 174 * This parameter can be one of following parameters:
filartrix 4:987b201ec4b1 175 * @arg LED2
filartrix 4:987b201ec4b1 176 * @retval None
filartrix 4:987b201ec4b1 177 */
filartrix 4:987b201ec4b1 178 void BSP_LED_Init(Led_TypeDef Led)
filartrix 4:987b201ec4b1 179 {
filartrix 4:987b201ec4b1 180 GPIO_InitTypeDef GPIO_InitStruct;
filartrix 4:987b201ec4b1 181
filartrix 4:987b201ec4b1 182 /* Enable the GPIO_LED Clock */
filartrix 4:987b201ec4b1 183 LEDx_GPIO_CLK_ENABLE(Led);
filartrix 4:987b201ec4b1 184
filartrix 4:987b201ec4b1 185 /* Configure the GPIO_LED pin */
filartrix 4:987b201ec4b1 186 GPIO_InitStruct.Pin = GPIO_PIN[Led];
filartrix 4:987b201ec4b1 187 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
filartrix 4:987b201ec4b1 188 GPIO_InitStruct.Pull = GPIO_PULLUP;
filartrix 4:987b201ec4b1 189 GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
filartrix 4:987b201ec4b1 190
filartrix 4:987b201ec4b1 191 HAL_GPIO_Init(GPIO_PORT[Led], &GPIO_InitStruct);
filartrix 4:987b201ec4b1 192
filartrix 4:987b201ec4b1 193 HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_RESET);
filartrix 4:987b201ec4b1 194 }
filartrix 4:987b201ec4b1 195
filartrix 4:987b201ec4b1 196 /**
filartrix 4:987b201ec4b1 197 * @brief Turns selected LED On.
filartrix 4:987b201ec4b1 198 * @param Led: Specifies the Led to be set on.
filartrix 4:987b201ec4b1 199 * This parameter can be one of following parameters:
filartrix 4:987b201ec4b1 200 * @arg LED2
filartrix 4:987b201ec4b1 201 * @retval None
filartrix 4:987b201ec4b1 202 */
filartrix 4:987b201ec4b1 203 void BSP_LED_On(Led_TypeDef Led)
filartrix 4:987b201ec4b1 204 {
filartrix 4:987b201ec4b1 205 HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_SET);
filartrix 4:987b201ec4b1 206 }
filartrix 4:987b201ec4b1 207
filartrix 4:987b201ec4b1 208 /**
filartrix 4:987b201ec4b1 209 * @brief Turns selected LED Off.
filartrix 4:987b201ec4b1 210 * @param Led: Specifies the Led to be set off.
filartrix 4:987b201ec4b1 211 * This parameter can be one of following parameters:
filartrix 4:987b201ec4b1 212 * @arg LED2
filartrix 4:987b201ec4b1 213 * @retval None
filartrix 4:987b201ec4b1 214 */
filartrix 4:987b201ec4b1 215 void BSP_LED_Off(Led_TypeDef Led)
filartrix 4:987b201ec4b1 216 {
filartrix 4:987b201ec4b1 217 HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_RESET);
filartrix 4:987b201ec4b1 218 }
filartrix 4:987b201ec4b1 219
filartrix 4:987b201ec4b1 220 /**
filartrix 4:987b201ec4b1 221 * @brief Toggles the selected LED.
filartrix 4:987b201ec4b1 222 * @param Led: Specifies the Led to be toggled.
filartrix 4:987b201ec4b1 223 * This parameter can be one of following parameters:
filartrix 4:987b201ec4b1 224 * @arg LED2
filartrix 4:987b201ec4b1 225 * @retval None
filartrix 4:987b201ec4b1 226 */
filartrix 4:987b201ec4b1 227 void BSP_LED_Toggle(Led_TypeDef Led)
filartrix 4:987b201ec4b1 228 {
filartrix 4:987b201ec4b1 229 HAL_GPIO_TogglePin(GPIO_PORT[Led], GPIO_PIN[Led]);
filartrix 4:987b201ec4b1 230 }
filartrix 4:987b201ec4b1 231
filartrix 4:987b201ec4b1 232 /**
filartrix 4:987b201ec4b1 233 * @brief Configures Button GPIO and EXTI Line.
filartrix 4:987b201ec4b1 234 * @param Button: Specifies the Button to be configured.
filartrix 4:987b201ec4b1 235 * This parameter should be: BUTTON_KEY
filartrix 4:987b201ec4b1 236 * @param ButtonMode: Specifies Button mode.
filartrix 4:987b201ec4b1 237 * This parameter can be one of following parameters:
filartrix 4:987b201ec4b1 238 * @arg BUTTON_MODE_GPIO: Button will be used as simple IO
filartrix 4:987b201ec4b1 239 * @arg BUTTON_MODE_EXTI: Button will be connected to EXTI line with interrupt
filartrix 4:987b201ec4b1 240 * generation capability
filartrix 4:987b201ec4b1 241 * @retval None
filartrix 4:987b201ec4b1 242 */
filartrix 4:987b201ec4b1 243 void BSP_PB_Init(Button_TypeDef Button, ButtonMode_TypeDef ButtonMode)
filartrix 4:987b201ec4b1 244 {
filartrix 4:987b201ec4b1 245 GPIO_InitTypeDef GPIO_InitStruct;
filartrix 4:987b201ec4b1 246
filartrix 4:987b201ec4b1 247 /* Enable the BUTTON Clock */
filartrix 4:987b201ec4b1 248 BUTTONx_GPIO_CLK_ENABLE(Button);
filartrix 4:987b201ec4b1 249
filartrix 4:987b201ec4b1 250 if(ButtonMode == BUTTON_MODE_GPIO)
filartrix 4:987b201ec4b1 251 {
filartrix 4:987b201ec4b1 252 /* Configure Button pin as input */
filartrix 4:987b201ec4b1 253 GPIO_InitStruct.Pin = BUTTON_PIN[Button];
filartrix 4:987b201ec4b1 254 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
filartrix 4:987b201ec4b1 255 GPIO_InitStruct.Pull = GPIO_PULLDOWN;
filartrix 4:987b201ec4b1 256 GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
filartrix 4:987b201ec4b1 257 HAL_GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStruct);
filartrix 4:987b201ec4b1 258 }
filartrix 4:987b201ec4b1 259
filartrix 4:987b201ec4b1 260 if(ButtonMode == BUTTON_MODE_EXTI)
filartrix 4:987b201ec4b1 261 {
filartrix 4:987b201ec4b1 262 /* Configure Button pin as input with External interrupt */
filartrix 4:987b201ec4b1 263 GPIO_InitStruct.Pin = BUTTON_PIN[Button];
filartrix 4:987b201ec4b1 264 GPIO_InitStruct.Pull = GPIO_NOPULL;
filartrix 4:987b201ec4b1 265 GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
filartrix 4:987b201ec4b1 266 HAL_GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStruct);
filartrix 4:987b201ec4b1 267
filartrix 4:987b201ec4b1 268 /* Enable and set Button EXTI Interrupt to the lowest priority */
filartrix 4:987b201ec4b1 269 HAL_NVIC_SetPriority((IRQn_Type)(BUTTON_IRQn[Button]), 0x0F, 0x00);
filartrix 4:987b201ec4b1 270 HAL_NVIC_EnableIRQ((IRQn_Type)(BUTTON_IRQn[Button]));
filartrix 4:987b201ec4b1 271 }
filartrix 4:987b201ec4b1 272 }
filartrix 4:987b201ec4b1 273
filartrix 4:987b201ec4b1 274 /**
filartrix 4:987b201ec4b1 275 * @brief Returns the selected Button state.
filartrix 4:987b201ec4b1 276 * @param Button: Specifies the Button to be checked.
filartrix 4:987b201ec4b1 277 * This parameter should be: BUTTON_KEY
filartrix 4:987b201ec4b1 278 * @retval The Button GPIO pin value.
filartrix 4:987b201ec4b1 279 */
filartrix 4:987b201ec4b1 280 uint32_t BSP_PB_GetState(Button_TypeDef Button)
filartrix 4:987b201ec4b1 281 {
filartrix 4:987b201ec4b1 282 return HAL_GPIO_ReadPin(BUTTON_PORT[Button], BUTTON_PIN[Button]);
filartrix 4:987b201ec4b1 283 }
filartrix 4:987b201ec4b1 284
filartrix 4:987b201ec4b1 285 /******************************************************************************
filartrix 4:987b201ec4b1 286 BUS OPERATIONS
filartrix 4:987b201ec4b1 287 *******************************************************************************/
filartrix 4:987b201ec4b1 288 /**
filartrix 4:987b201ec4b1 289 * @brief Initializes SPI MSP.
filartrix 4:987b201ec4b1 290 * @param None
filartrix 4:987b201ec4b1 291 * @retval None
filartrix 4:987b201ec4b1 292 */
filartrix 4:987b201ec4b1 293 static void SPIx_MspInit(SPI_HandleTypeDef *hspi)
filartrix 4:987b201ec4b1 294 {
filartrix 4:987b201ec4b1 295 GPIO_InitTypeDef GPIO_InitStruct;
filartrix 4:987b201ec4b1 296
filartrix 4:987b201ec4b1 297 /*** Configure the GPIOs ***/
filartrix 4:987b201ec4b1 298 /* Enable GPIO clock */
filartrix 4:987b201ec4b1 299 NUCLEO_SPIx_SCK_GPIO_CLK_ENABLE();
filartrix 4:987b201ec4b1 300 NUCLEO_SPIx_MISO_MOSI_GPIO_CLK_ENABLE();
filartrix 4:987b201ec4b1 301
filartrix 4:987b201ec4b1 302 /* Configure SPI SCK */
filartrix 4:987b201ec4b1 303 GPIO_InitStruct.Pin = NUCLEO_SPIx_SCK_PIN;
filartrix 4:987b201ec4b1 304 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
filartrix 4:987b201ec4b1 305 GPIO_InitStruct.Pull = GPIO_PULLUP;
filartrix 4:987b201ec4b1 306 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
filartrix 4:987b201ec4b1 307 GPIO_InitStruct.Alternate = NUCLEO_SPIx_SCK_AF;
filartrix 4:987b201ec4b1 308 HAL_GPIO_Init(NUCLEO_SPIx_SCK_GPIO_PORT, &GPIO_InitStruct);
filartrix 4:987b201ec4b1 309
filartrix 4:987b201ec4b1 310 /* Configure SPI MISO and MOSI */
filartrix 4:987b201ec4b1 311 GPIO_InitStruct.Pin = NUCLEO_SPIx_MOSI_PIN;
filartrix 4:987b201ec4b1 312 GPIO_InitStruct.Alternate = NUCLEO_SPIx_MISO_MOSI_AF;
filartrix 4:987b201ec4b1 313 GPIO_InitStruct.Pull = GPIO_PULLDOWN;
filartrix 4:987b201ec4b1 314 HAL_GPIO_Init(NUCLEO_SPIx_MISO_MOSI_GPIO_PORT, &GPIO_InitStruct);
filartrix 4:987b201ec4b1 315
filartrix 4:987b201ec4b1 316 GPIO_InitStruct.Pin = NUCLEO_SPIx_MISO_PIN;
filartrix 4:987b201ec4b1 317 HAL_GPIO_Init(NUCLEO_SPIx_MISO_MOSI_GPIO_PORT, &GPIO_InitStruct);
filartrix 4:987b201ec4b1 318
filartrix 4:987b201ec4b1 319 /*** Configure the SPI peripheral ***/
filartrix 4:987b201ec4b1 320 /* Enable SPI clock */
filartrix 4:987b201ec4b1 321 NUCLEO_SPIx_CLK_ENABLE();
filartrix 4:987b201ec4b1 322 }
filartrix 4:987b201ec4b1 323
filartrix 4:987b201ec4b1 324 /**
filartrix 4:987b201ec4b1 325 * @brief Initializes SPI HAL.
filartrix 4:987b201ec4b1 326 * @param None
filartrix 4:987b201ec4b1 327 * @retval None
filartrix 4:987b201ec4b1 328 */
filartrix 4:987b201ec4b1 329 static void SPIx_Init(void)
filartrix 4:987b201ec4b1 330 {
filartrix 4:987b201ec4b1 331 if(HAL_SPI_GetState(&hnucleo_Spi) == HAL_SPI_STATE_RESET)
filartrix 4:987b201ec4b1 332 {
filartrix 4:987b201ec4b1 333 /* SPI Config */
filartrix 4:987b201ec4b1 334 hnucleo_Spi.Instance = NUCLEO_SPIx;
filartrix 4:987b201ec4b1 335 /* SPI baudrate is set to 12,5 MHz maximum (PCLK2/SPI_BaudRatePrescaler = 100/8 = 12,5 MHz)
filartrix 4:987b201ec4b1 336 to verify these constraints:
filartrix 4:987b201ec4b1 337 - ST7735 LCD SPI interface max baudrate is 15MHz for write and 6.66MHz for read
filartrix 4:987b201ec4b1 338 Since the provided driver doesn't use read capability from LCD, only constraint
filartrix 4:987b201ec4b1 339 on write baudrate is considered.
filartrix 4:987b201ec4b1 340 - SD card SPI interface max baudrate is 25MHz for write/read
filartrix 4:987b201ec4b1 341 - PCLK2 max frequency is 100 MHz
filartrix 4:987b201ec4b1 342 */
filartrix 4:987b201ec4b1 343 hnucleo_Spi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
filartrix 4:987b201ec4b1 344 hnucleo_Spi.Init.Direction = SPI_DIRECTION_2LINES;
filartrix 4:987b201ec4b1 345 hnucleo_Spi.Init.CLKPhase = SPI_PHASE_2EDGE;
filartrix 4:987b201ec4b1 346 hnucleo_Spi.Init.CLKPolarity = SPI_POLARITY_HIGH;
filartrix 4:987b201ec4b1 347 hnucleo_Spi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
filartrix 4:987b201ec4b1 348 hnucleo_Spi.Init.CRCPolynomial = 7;
filartrix 4:987b201ec4b1 349 hnucleo_Spi.Init.DataSize = SPI_DATASIZE_8BIT;
filartrix 4:987b201ec4b1 350 hnucleo_Spi.Init.FirstBit = SPI_FIRSTBIT_MSB;
filartrix 4:987b201ec4b1 351 hnucleo_Spi.Init.NSS = SPI_NSS_SOFT;
filartrix 4:987b201ec4b1 352 hnucleo_Spi.Init.TIMode = SPI_TIMODE_DISABLED;
filartrix 4:987b201ec4b1 353 hnucleo_Spi.Init.Mode = SPI_MODE_MASTER;
filartrix 4:987b201ec4b1 354
filartrix 4:987b201ec4b1 355 SPIx_MspInit(&hnucleo_Spi);
filartrix 4:987b201ec4b1 356 HAL_SPI_Init(&hnucleo_Spi);
filartrix 4:987b201ec4b1 357 }
filartrix 4:987b201ec4b1 358 }
filartrix 4:987b201ec4b1 359
filartrix 4:987b201ec4b1 360 /**
filartrix 4:987b201ec4b1 361 * @brief SPI Read 4 bytes from device.
filartrix 4:987b201ec4b1 362 * @param None
filartrix 4:987b201ec4b1 363 * @retval Read data
filartrix 4:987b201ec4b1 364 */
filartrix 4:987b201ec4b1 365 static uint32_t SPIx_Read(void)
filartrix 4:987b201ec4b1 366 {
filartrix 4:987b201ec4b1 367 HAL_StatusTypeDef status = HAL_OK;
filartrix 4:987b201ec4b1 368 uint32_t readvalue = 0;
filartrix 4:987b201ec4b1 369 uint32_t writevalue = 0xFFFFFFFF;
filartrix 4:987b201ec4b1 370
filartrix 4:987b201ec4b1 371 status = HAL_SPI_TransmitReceive(&hnucleo_Spi, (uint8_t*) &writevalue, (uint8_t*) &readvalue, 1, SpixTimeout);
filartrix 4:987b201ec4b1 372
filartrix 4:987b201ec4b1 373 /* Check the communication status */
filartrix 4:987b201ec4b1 374 if(status != HAL_OK)
filartrix 4:987b201ec4b1 375 {
filartrix 4:987b201ec4b1 376 /* Execute user timeout callback */
filartrix 4:987b201ec4b1 377 SPIx_Error();
filartrix 4:987b201ec4b1 378 }
filartrix 4:987b201ec4b1 379
filartrix 4:987b201ec4b1 380 return readvalue;
filartrix 4:987b201ec4b1 381 }
filartrix 4:987b201ec4b1 382
filartrix 4:987b201ec4b1 383 /**
filartrix 4:987b201ec4b1 384 * @brief SPI Write a byte to device.
filartrix 4:987b201ec4b1 385 * @param Value: value to be written
filartrix 4:987b201ec4b1 386 * @retval None
filartrix 4:987b201ec4b1 387 */
filartrix 4:987b201ec4b1 388 static void SPIx_Write(uint8_t Value)
filartrix 4:987b201ec4b1 389 {
filartrix 4:987b201ec4b1 390 HAL_StatusTypeDef status = HAL_OK;
filartrix 4:987b201ec4b1 391
filartrix 4:987b201ec4b1 392 status = HAL_SPI_Transmit(&hnucleo_Spi, (uint8_t*) &Value, 1, SpixTimeout);
filartrix 4:987b201ec4b1 393
filartrix 4:987b201ec4b1 394 /* Check the communication status */
filartrix 4:987b201ec4b1 395 if(status != HAL_OK)
filartrix 4:987b201ec4b1 396 {
filartrix 4:987b201ec4b1 397 /* Execute user timeout callback */
filartrix 4:987b201ec4b1 398 SPIx_Error();
filartrix 4:987b201ec4b1 399 }
filartrix 4:987b201ec4b1 400 }
filartrix 4:987b201ec4b1 401
filartrix 4:987b201ec4b1 402 /**
filartrix 4:987b201ec4b1 403 * @brief SPI error treatment function.
filartrix 4:987b201ec4b1 404 * @param None
filartrix 4:987b201ec4b1 405 * @retval None
filartrix 4:987b201ec4b1 406 */
filartrix 4:987b201ec4b1 407 static void SPIx_Error (void)
filartrix 4:987b201ec4b1 408 {
filartrix 4:987b201ec4b1 409 /* De-initialize the SPI communication BUS */
filartrix 4:987b201ec4b1 410 HAL_SPI_DeInit(&hnucleo_Spi);
filartrix 4:987b201ec4b1 411
filartrix 4:987b201ec4b1 412 /* Re-Initiaize the SPI communication BUS */
filartrix 4:987b201ec4b1 413 SPIx_Init();
filartrix 4:987b201ec4b1 414 }
filartrix 4:987b201ec4b1 415
filartrix 4:987b201ec4b1 416 /******************************************************************************
filartrix 4:987b201ec4b1 417 LINK OPERATIONS
filartrix 4:987b201ec4b1 418 *******************************************************************************/
filartrix 4:987b201ec4b1 419
filartrix 4:987b201ec4b1 420 /********************************* LINK SD ************************************/
filartrix 4:987b201ec4b1 421 /**
filartrix 4:987b201ec4b1 422 * @brief Initializes the SD Card and put it into StandBy State (Ready for
filartrix 4:987b201ec4b1 423 * data transfer).
filartrix 4:987b201ec4b1 424 * @param None
filartrix 4:987b201ec4b1 425 * @retval None
filartrix 4:987b201ec4b1 426 */
filartrix 4:987b201ec4b1 427 void SD_IO_Init(void)
filartrix 4:987b201ec4b1 428 {
filartrix 4:987b201ec4b1 429 GPIO_InitTypeDef GPIO_InitStruct;
filartrix 4:987b201ec4b1 430 uint8_t counter;
filartrix 4:987b201ec4b1 431
filartrix 4:987b201ec4b1 432 /* SD_CS_GPIO Periph clock enable */
filartrix 4:987b201ec4b1 433 SD_CS_GPIO_CLK_ENABLE();
filartrix 4:987b201ec4b1 434
filartrix 4:987b201ec4b1 435 /* Configure SD_CS_PIN pin: SD Card CS pin */
filartrix 4:987b201ec4b1 436 GPIO_InitStruct.Pin = SD_CS_PIN;
filartrix 4:987b201ec4b1 437 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
filartrix 4:987b201ec4b1 438 GPIO_InitStruct.Pull = GPIO_PULLUP;
filartrix 4:987b201ec4b1 439 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
filartrix 4:987b201ec4b1 440 HAL_GPIO_Init(SD_CS_GPIO_PORT, &GPIO_InitStruct);
filartrix 4:987b201ec4b1 441
filartrix 4:987b201ec4b1 442 /*------------Put SD in SPI mode--------------*/
filartrix 4:987b201ec4b1 443 /* SD SPI Config */
filartrix 4:987b201ec4b1 444 SPIx_Init();
filartrix 4:987b201ec4b1 445
filartrix 4:987b201ec4b1 446 /* SD chip select high */
filartrix 4:987b201ec4b1 447 SD_CS_HIGH();
filartrix 4:987b201ec4b1 448
filartrix 4:987b201ec4b1 449 /* Send dummy byte 0xFF, 10 times with CS high */
filartrix 4:987b201ec4b1 450 /* Rise CS and MOSI for 80 clocks cycles */
filartrix 4:987b201ec4b1 451 for (counter = 0; counter <= 9; counter++)
filartrix 4:987b201ec4b1 452 {
filartrix 4:987b201ec4b1 453 /* Send dummy byte 0xFF */
filartrix 4:987b201ec4b1 454 SD_IO_WriteByte(SD_DUMMY_BYTE);
filartrix 4:987b201ec4b1 455 }
filartrix 4:987b201ec4b1 456 }
filartrix 4:987b201ec4b1 457
filartrix 4:987b201ec4b1 458 /**
filartrix 4:987b201ec4b1 459 * @brief Writes a byte on the SD.
filartrix 4:987b201ec4b1 460 * @param Data: byte to send.
filartrix 4:987b201ec4b1 461 * @retval None
filartrix 4:987b201ec4b1 462 */
filartrix 4:987b201ec4b1 463 void SD_IO_WriteByte(uint8_t Data)
filartrix 4:987b201ec4b1 464 {
filartrix 4:987b201ec4b1 465 /* Send the byte */
filartrix 4:987b201ec4b1 466 SPIx_Write(Data);
filartrix 4:987b201ec4b1 467 }
filartrix 4:987b201ec4b1 468
filartrix 4:987b201ec4b1 469 /**
filartrix 4:987b201ec4b1 470 * @brief Reads a byte from the SD.
filartrix 4:987b201ec4b1 471 * @param None
filartrix 4:987b201ec4b1 472 * @retval The received byte.
filartrix 4:987b201ec4b1 473 */
filartrix 4:987b201ec4b1 474 uint8_t SD_IO_ReadByte(void)
filartrix 4:987b201ec4b1 475 {
filartrix 4:987b201ec4b1 476 uint8_t data = 0;
filartrix 4:987b201ec4b1 477
filartrix 4:987b201ec4b1 478 /* Get the received data */
filartrix 4:987b201ec4b1 479 data = SPIx_Read();
filartrix 4:987b201ec4b1 480
filartrix 4:987b201ec4b1 481 /* Return the shifted data */
filartrix 4:987b201ec4b1 482 return data;
filartrix 4:987b201ec4b1 483 }
filartrix 4:987b201ec4b1 484
filartrix 4:987b201ec4b1 485 /**
filartrix 4:987b201ec4b1 486 * @brief Sends 5 bytes command to the SD card and get response.
filartrix 4:987b201ec4b1 487 * @param Cmd: The user expected command to send to SD card.
filartrix 4:987b201ec4b1 488 * @param Arg: The command argument
filartrix 4:987b201ec4b1 489 * @param Crc: The CRC
filartrix 4:987b201ec4b1 490 * @param Response: Expected response from the SD card
filartrix 4:987b201ec4b1 491 * @retval HAL_StatusTypeDef HAL Status
filartrix 4:987b201ec4b1 492 */
filartrix 4:987b201ec4b1 493 HAL_StatusTypeDef SD_IO_WriteCmd(uint8_t Cmd, uint32_t Arg, uint8_t Crc, uint8_t Response)
filartrix 4:987b201ec4b1 494 {
filartrix 4:987b201ec4b1 495 uint32_t counter = 0x00;
filartrix 4:987b201ec4b1 496 uint8_t frame[6];
filartrix 4:987b201ec4b1 497
filartrix 4:987b201ec4b1 498 /* Prepare Frame to send */
filartrix 4:987b201ec4b1 499 frame[0] = (Cmd | 0x40); /* Construct byte 1 */
filartrix 4:987b201ec4b1 500 frame[1] = (uint8_t)(Arg >> 24); /* Construct byte 2 */
filartrix 4:987b201ec4b1 501 frame[2] = (uint8_t)(Arg >> 16); /* Construct byte 3 */
filartrix 4:987b201ec4b1 502 frame[3] = (uint8_t)(Arg >> 8); /* Construct byte 4 */
filartrix 4:987b201ec4b1 503 frame[4] = (uint8_t)(Arg); /* Construct byte 5 */
filartrix 4:987b201ec4b1 504 frame[5] = (Crc); /* Construct byte 6 */
filartrix 4:987b201ec4b1 505
filartrix 4:987b201ec4b1 506 /* SD chip select low */
filartrix 4:987b201ec4b1 507 SD_CS_LOW();
filartrix 4:987b201ec4b1 508
filartrix 4:987b201ec4b1 509 /* Send Frame */
filartrix 4:987b201ec4b1 510 for (counter = 0; counter < 6; counter++)
filartrix 4:987b201ec4b1 511 {
filartrix 4:987b201ec4b1 512 SD_IO_WriteByte(frame[counter]); /* Send the Cmd bytes */
filartrix 4:987b201ec4b1 513 }
filartrix 4:987b201ec4b1 514
filartrix 4:987b201ec4b1 515 if(Response != SD_NO_RESPONSE_EXPECTED)
filartrix 4:987b201ec4b1 516 {
filartrix 4:987b201ec4b1 517 return SD_IO_WaitResponse(Response);
filartrix 4:987b201ec4b1 518 }
filartrix 4:987b201ec4b1 519
filartrix 4:987b201ec4b1 520 return HAL_OK;
filartrix 4:987b201ec4b1 521 }
filartrix 4:987b201ec4b1 522
filartrix 4:987b201ec4b1 523 /**
filartrix 4:987b201ec4b1 524 * @brief Waits response from the SD card
filartrix 4:987b201ec4b1 525 * @param Response: Expected response from the SD card
filartrix 4:987b201ec4b1 526 * @retval HAL_StatusTypeDef HAL Status
filartrix 4:987b201ec4b1 527 */
filartrix 4:987b201ec4b1 528 HAL_StatusTypeDef SD_IO_WaitResponse(uint8_t Response)
filartrix 4:987b201ec4b1 529 {
filartrix 4:987b201ec4b1 530 uint32_t timeout = 0xFFFF;
filartrix 4:987b201ec4b1 531
filartrix 4:987b201ec4b1 532 /* Check if response is got or a timeout is happen */
filartrix 4:987b201ec4b1 533 while ((SD_IO_ReadByte() != Response) && timeout)
filartrix 4:987b201ec4b1 534 {
filartrix 4:987b201ec4b1 535 timeout--;
filartrix 4:987b201ec4b1 536 }
filartrix 4:987b201ec4b1 537
filartrix 4:987b201ec4b1 538 if (timeout == 0)
filartrix 4:987b201ec4b1 539 {
filartrix 4:987b201ec4b1 540 /* After time out */
filartrix 4:987b201ec4b1 541 return HAL_TIMEOUT;
filartrix 4:987b201ec4b1 542 }
filartrix 4:987b201ec4b1 543 else
filartrix 4:987b201ec4b1 544 {
filartrix 4:987b201ec4b1 545 /* Right response got */
filartrix 4:987b201ec4b1 546 return HAL_OK;
filartrix 4:987b201ec4b1 547 }
filartrix 4:987b201ec4b1 548 }
filartrix 4:987b201ec4b1 549
filartrix 4:987b201ec4b1 550 /**
filartrix 4:987b201ec4b1 551 * @brief Sends dummy byte with CS High.
filartrix 4:987b201ec4b1 552 * @param None
filartrix 4:987b201ec4b1 553 * @retval None
filartrix 4:987b201ec4b1 554 */
filartrix 4:987b201ec4b1 555 void SD_IO_WriteDummy(void)
filartrix 4:987b201ec4b1 556 {
filartrix 4:987b201ec4b1 557 /* SD chip select high */
filartrix 4:987b201ec4b1 558 SD_CS_HIGH();
filartrix 4:987b201ec4b1 559
filartrix 4:987b201ec4b1 560 /* Send Dummy byte 0xFF */
filartrix 4:987b201ec4b1 561 SD_IO_WriteByte(SD_DUMMY_BYTE);
filartrix 4:987b201ec4b1 562 }
filartrix 4:987b201ec4b1 563
filartrix 4:987b201ec4b1 564 /********************************* LINK LCD ***********************************/
filartrix 4:987b201ec4b1 565 /**
filartrix 4:987b201ec4b1 566 * @brief Initializes the LCD.
filartrix 4:987b201ec4b1 567 * @param None
filartrix 4:987b201ec4b1 568 * @retval None
filartrix 4:987b201ec4b1 569 */
filartrix 4:987b201ec4b1 570 void LCD_IO_Init(void)
filartrix 4:987b201ec4b1 571 {
filartrix 4:987b201ec4b1 572 GPIO_InitTypeDef GPIO_InitStruct;
filartrix 4:987b201ec4b1 573
filartrix 4:987b201ec4b1 574 /* LCD_CS_GPIO and LCD_DC_GPIO Periph clock enable */
filartrix 4:987b201ec4b1 575 LCD_CS_GPIO_CLK_ENABLE();
filartrix 4:987b201ec4b1 576 LCD_DC_GPIO_CLK_ENABLE();
filartrix 4:987b201ec4b1 577
filartrix 4:987b201ec4b1 578 /* Configure LCD_CS_PIN pin: LCD Card CS pin */
filartrix 4:987b201ec4b1 579 GPIO_InitStruct.Pin = LCD_CS_PIN;
filartrix 4:987b201ec4b1 580 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
filartrix 4:987b201ec4b1 581 GPIO_InitStruct.Pull = GPIO_NOPULL;
filartrix 4:987b201ec4b1 582 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
filartrix 4:987b201ec4b1 583 HAL_GPIO_Init(SD_CS_GPIO_PORT, &GPIO_InitStruct);
filartrix 4:987b201ec4b1 584
filartrix 4:987b201ec4b1 585 /* Configure LCD_DC_PIN pin: LCD Card DC pin */
filartrix 4:987b201ec4b1 586 GPIO_InitStruct.Pin = LCD_DC_PIN;
filartrix 4:987b201ec4b1 587 HAL_GPIO_Init(LCD_DC_GPIO_PORT, &GPIO_InitStruct);
filartrix 4:987b201ec4b1 588
filartrix 4:987b201ec4b1 589 /* LCD chip select high */
filartrix 4:987b201ec4b1 590 LCD_CS_HIGH();
filartrix 4:987b201ec4b1 591
filartrix 4:987b201ec4b1 592 /* LCD SPI Config */
filartrix 4:987b201ec4b1 593 SPIx_Init();
filartrix 4:987b201ec4b1 594 }
filartrix 4:987b201ec4b1 595
filartrix 4:987b201ec4b1 596 /**
filartrix 4:987b201ec4b1 597 * @brief Writes command to select the LCD register.
filartrix 4:987b201ec4b1 598 * @param LCDReg: Address of the selected register.
filartrix 4:987b201ec4b1 599 * @retval None
filartrix 4:987b201ec4b1 600 */
filartrix 4:987b201ec4b1 601 void LCD_IO_WriteReg(uint8_t LCDReg)
filartrix 4:987b201ec4b1 602 {
filartrix 4:987b201ec4b1 603 /* Reset LCD control line CS */
filartrix 4:987b201ec4b1 604 LCD_CS_LOW();
filartrix 4:987b201ec4b1 605
filartrix 4:987b201ec4b1 606 /* Set LCD data/command line DC to Low */
filartrix 4:987b201ec4b1 607 LCD_DC_LOW();
filartrix 4:987b201ec4b1 608
filartrix 4:987b201ec4b1 609 /* Send Command */
filartrix 4:987b201ec4b1 610 SPIx_Write(LCDReg);
filartrix 4:987b201ec4b1 611
filartrix 4:987b201ec4b1 612 /* Deselect : Chip Select high */
filartrix 4:987b201ec4b1 613 LCD_CS_HIGH();
filartrix 4:987b201ec4b1 614 }
filartrix 4:987b201ec4b1 615
filartrix 4:987b201ec4b1 616 /**
filartrix 4:987b201ec4b1 617 * @brief Writes data to select the LCD register.
filartrix 4:987b201ec4b1 618 * This function must be used after st7735_WriteReg() function
filartrix 4:987b201ec4b1 619 * @param Data: data to write to the selected register.
filartrix 4:987b201ec4b1 620 * @retval None
filartrix 4:987b201ec4b1 621 */
filartrix 4:987b201ec4b1 622 void LCD_IO_WriteData(uint8_t Data)
filartrix 4:987b201ec4b1 623 {
filartrix 4:987b201ec4b1 624 /* Reset LCD control line CS */
filartrix 4:987b201ec4b1 625 LCD_CS_LOW();
filartrix 4:987b201ec4b1 626
filartrix 4:987b201ec4b1 627 /* Set LCD data/command line DC to High */
filartrix 4:987b201ec4b1 628 LCD_DC_HIGH();
filartrix 4:987b201ec4b1 629
filartrix 4:987b201ec4b1 630 /* Send Data */
filartrix 4:987b201ec4b1 631 SPIx_Write(Data);
filartrix 4:987b201ec4b1 632
filartrix 4:987b201ec4b1 633 /* Deselect : Chip Select high */
filartrix 4:987b201ec4b1 634 LCD_CS_HIGH();
filartrix 4:987b201ec4b1 635 }
filartrix 4:987b201ec4b1 636
filartrix 4:987b201ec4b1 637 /**
filartrix 4:987b201ec4b1 638 * @brief Wait for loop in ms.
filartrix 4:987b201ec4b1 639 * @param Delay in ms.
filartrix 4:987b201ec4b1 640 * @retval None
filartrix 4:987b201ec4b1 641 */
filartrix 4:987b201ec4b1 642 void LCD_Delay(uint32_t Delay)
filartrix 4:987b201ec4b1 643 {
filartrix 4:987b201ec4b1 644 HAL_Delay(Delay);
filartrix 4:987b201ec4b1 645 }
filartrix 4:987b201ec4b1 646
filartrix 4:987b201ec4b1 647 /******************************* LINK JOYSTICK ********************************/
filartrix 4:987b201ec4b1 648 /**
filartrix 4:987b201ec4b1 649 * @brief Initializes ADC MSP.
filartrix 4:987b201ec4b1 650 * @param None
filartrix 4:987b201ec4b1 651 * @retval None
filartrix 4:987b201ec4b1 652 */
filartrix 4:987b201ec4b1 653 static void ADCx_MspInit(ADC_HandleTypeDef *hadc)
filartrix 4:987b201ec4b1 654 {
filartrix 4:987b201ec4b1 655 GPIO_InitTypeDef GPIO_InitStruct;
filartrix 4:987b201ec4b1 656
filartrix 4:987b201ec4b1 657 /*** Configure the GPIOs ***/
filartrix 4:987b201ec4b1 658 /* Enable GPIO clock */
filartrix 4:987b201ec4b1 659 NUCLEO_ADCx_GPIO_CLK_ENABLE();
filartrix 4:987b201ec4b1 660
filartrix 4:987b201ec4b1 661 /* Configure the selected ADC Channel as analog input */
filartrix 4:987b201ec4b1 662 GPIO_InitStruct.Pin = NUCLEO_ADCx_GPIO_PIN ;
filartrix 4:987b201ec4b1 663 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
filartrix 4:987b201ec4b1 664 GPIO_InitStruct.Pull = GPIO_NOPULL;
filartrix 4:987b201ec4b1 665 HAL_GPIO_Init(NUCLEO_ADCx_GPIO_PORT, &GPIO_InitStruct);
filartrix 4:987b201ec4b1 666
filartrix 4:987b201ec4b1 667 /*** Configure the ADC peripheral ***/
filartrix 4:987b201ec4b1 668 /* Enable ADC clock */
filartrix 4:987b201ec4b1 669 NUCLEO_ADCx_CLK_ENABLE();
filartrix 4:987b201ec4b1 670 }
filartrix 4:987b201ec4b1 671
filartrix 4:987b201ec4b1 672 /**
filartrix 4:987b201ec4b1 673 * @brief Initializes ADC HAL.
filartrix 4:987b201ec4b1 674 * @param None
filartrix 4:987b201ec4b1 675 * @retval None
filartrix 4:987b201ec4b1 676 */
filartrix 4:987b201ec4b1 677 static void ADCx_Init(void)
filartrix 4:987b201ec4b1 678 {
filartrix 4:987b201ec4b1 679 if(HAL_ADC_GetState(&hnucleo_Adc) == HAL_ADC_STATE_RESET)
filartrix 4:987b201ec4b1 680 {
filartrix 4:987b201ec4b1 681 /* ADC Config */
filartrix 4:987b201ec4b1 682 hnucleo_Adc.Instance = NUCLEO_ADCx;
filartrix 4:987b201ec4b1 683 hnucleo_Adc.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4; /* (must not exceed 36MHz) */
filartrix 4:987b201ec4b1 684 hnucleo_Adc.Init.Resolution = ADC_RESOLUTION12b;
filartrix 4:987b201ec4b1 685 hnucleo_Adc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
filartrix 4:987b201ec4b1 686 hnucleo_Adc.Init.ContinuousConvMode = DISABLE;
filartrix 4:987b201ec4b1 687 hnucleo_Adc.Init.DiscontinuousConvMode = DISABLE;
filartrix 4:987b201ec4b1 688 hnucleo_Adc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
filartrix 4:987b201ec4b1 689 hnucleo_Adc.Init.EOCSelection = EOC_SINGLE_CONV;
filartrix 4:987b201ec4b1 690 hnucleo_Adc.Init.NbrOfConversion = 1;
filartrix 4:987b201ec4b1 691 hnucleo_Adc.Init.DMAContinuousRequests = DISABLE;
filartrix 4:987b201ec4b1 692
filartrix 4:987b201ec4b1 693 ADCx_MspInit(&hnucleo_Adc);
filartrix 4:987b201ec4b1 694 HAL_ADC_Init(&hnucleo_Adc);
filartrix 4:987b201ec4b1 695 }
filartrix 4:987b201ec4b1 696 }
filartrix 4:987b201ec4b1 697
filartrix 4:987b201ec4b1 698 /**
filartrix 4:987b201ec4b1 699 * @brief Configures joystick available on adafruit 1.8" TFT shield
filartrix 4:987b201ec4b1 700 * managed through ADC to detect motion.
filartrix 4:987b201ec4b1 701 * @param None
filartrix 4:987b201ec4b1 702 * @retval Joystickstatus (0=> success, 1=> fail)
filartrix 4:987b201ec4b1 703 */
filartrix 4:987b201ec4b1 704 uint8_t BSP_JOY_Init(void)
filartrix 4:987b201ec4b1 705 {
filartrix 4:987b201ec4b1 706 uint8_t status = 1;
filartrix 4:987b201ec4b1 707
filartrix 4:987b201ec4b1 708 ADCx_Init();
filartrix 4:987b201ec4b1 709
filartrix 4:987b201ec4b1 710 /* Select the ADC Channel to be converted */
filartrix 4:987b201ec4b1 711 sConfig.Channel = NUCLEO_ADCx_CHANNEL;
filartrix 4:987b201ec4b1 712 sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
filartrix 4:987b201ec4b1 713 sConfig.Rank = 1;
filartrix 4:987b201ec4b1 714 status = HAL_ADC_ConfigChannel(&hnucleo_Adc, &sConfig);
filartrix 4:987b201ec4b1 715
filartrix 4:987b201ec4b1 716 /* Return Joystick initialization status */
filartrix 4:987b201ec4b1 717 return status;
filartrix 4:987b201ec4b1 718 }
filartrix 4:987b201ec4b1 719
filartrix 4:987b201ec4b1 720 /**
filartrix 4:987b201ec4b1 721 * @brief Returns the Joystick key pressed.
filartrix 4:987b201ec4b1 722 * @note To know which Joystick key is pressed we need to detect the voltage
filartrix 4:987b201ec4b1 723 * level on each key output
filartrix 4:987b201ec4b1 724 * - None : 3.3 V / 4095
filartrix 4:987b201ec4b1 725 * - SEL : 1.055 V / 1308
filartrix 4:987b201ec4b1 726 * - DOWN : 0.71 V / 88
filartrix 4:987b201ec4b1 727 * - LEFT : 3.0 V / 3720
filartrix 4:987b201ec4b1 728 * - RIGHT : 0.595 V / 737
filartrix 4:987b201ec4b1 729 * - UP : 1.65 V / 2046
filartrix 4:987b201ec4b1 730 * @retval JOYState_TypeDef: Code of the Joystick key pressed.
filartrix 4:987b201ec4b1 731 */
filartrix 4:987b201ec4b1 732 JOYState_TypeDef BSP_JOY_GetState(void)
filartrix 4:987b201ec4b1 733 {
filartrix 4:987b201ec4b1 734 JOYState_TypeDef state;
filartrix 4:987b201ec4b1 735 uint16_t keyconvertedvalue = 0;
filartrix 4:987b201ec4b1 736
filartrix 4:987b201ec4b1 737 /* Start the conversion process */
filartrix 4:987b201ec4b1 738 HAL_ADC_Start(&hnucleo_Adc);
filartrix 4:987b201ec4b1 739
filartrix 4:987b201ec4b1 740 /* Wait for the end of conversion */
filartrix 4:987b201ec4b1 741 HAL_ADC_PollForConversion(&hnucleo_Adc, 10);
filartrix 4:987b201ec4b1 742
filartrix 4:987b201ec4b1 743 /* Check if the continous conversion of regular channel is finished */
filartrix 4:987b201ec4b1 744 if(HAL_ADC_GetState(&hnucleo_Adc) == HAL_ADC_STATE_EOC_REG)
filartrix 4:987b201ec4b1 745 {
filartrix 4:987b201ec4b1 746 /* Get the converted value of regular channel */
filartrix 4:987b201ec4b1 747 keyconvertedvalue = HAL_ADC_GetValue(&hnucleo_Adc);
filartrix 4:987b201ec4b1 748 }
filartrix 4:987b201ec4b1 749
filartrix 4:987b201ec4b1 750 if((keyconvertedvalue > 2010) && (keyconvertedvalue < 2090))
filartrix 4:987b201ec4b1 751 {
filartrix 4:987b201ec4b1 752 state = JOY_UP;
filartrix 4:987b201ec4b1 753 }
filartrix 4:987b201ec4b1 754 else if((keyconvertedvalue > 680) && (keyconvertedvalue < 780))
filartrix 4:987b201ec4b1 755 {
filartrix 4:987b201ec4b1 756 state = JOY_RIGHT;
filartrix 4:987b201ec4b1 757 }
filartrix 4:987b201ec4b1 758 else if((keyconvertedvalue > 1270) && (keyconvertedvalue < 1350))
filartrix 4:987b201ec4b1 759 {
filartrix 4:987b201ec4b1 760 state = JOY_SEL;
filartrix 4:987b201ec4b1 761 }
filartrix 4:987b201ec4b1 762 else if((keyconvertedvalue > 50) && (keyconvertedvalue < 130))
filartrix 4:987b201ec4b1 763 {
filartrix 4:987b201ec4b1 764 state = JOY_DOWN;
filartrix 4:987b201ec4b1 765 }
filartrix 4:987b201ec4b1 766 else if((keyconvertedvalue > 3680) && (keyconvertedvalue < 3760))
filartrix 4:987b201ec4b1 767 {
filartrix 4:987b201ec4b1 768 state = JOY_LEFT;
filartrix 4:987b201ec4b1 769 }
filartrix 4:987b201ec4b1 770 else
filartrix 4:987b201ec4b1 771 {
filartrix 4:987b201ec4b1 772 state = JOY_NONE;
filartrix 4:987b201ec4b1 773 }
filartrix 4:987b201ec4b1 774
filartrix 4:987b201ec4b1 775 /* Loop while a key is pressed */
filartrix 4:987b201ec4b1 776 if(state != JOY_NONE)
filartrix 4:987b201ec4b1 777 {
filartrix 4:987b201ec4b1 778 keyconvertedvalue = HAL_ADC_GetValue(&hnucleo_Adc);
filartrix 4:987b201ec4b1 779 }
filartrix 4:987b201ec4b1 780 /* Return the code of the Joystick key pressed */
filartrix 4:987b201ec4b1 781 return state;
filartrix 4:987b201ec4b1 782 }
filartrix 4:987b201ec4b1 783
filartrix 4:987b201ec4b1 784 /**
filartrix 4:987b201ec4b1 785 * @}
filartrix 4:987b201ec4b1 786 */
filartrix 4:987b201ec4b1 787
filartrix 4:987b201ec4b1 788 /**
filartrix 4:987b201ec4b1 789 * @}
filartrix 4:987b201ec4b1 790 */
filartrix 4:987b201ec4b1 791
filartrix 4:987b201ec4b1 792 /**
filartrix 4:987b201ec4b1 793 * @}
filartrix 4:987b201ec4b1 794 */
filartrix 4:987b201ec4b1 795
filartrix 4:987b201ec4b1 796 /**
filartrix 4:987b201ec4b1 797 * @}
filartrix 4:987b201ec4b1 798 */
filartrix 4:987b201ec4b1 799
filartrix 4:987b201ec4b1 800 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
filartrix 4:987b201ec4b1 801