my fork
src/stm32f4xx_nucleo.c@4:987b201ec4b1, 2015-04-08 (annotated)
- Committer:
- filartrix
- Date:
- Wed Apr 08 14:17:20 2015 +0000
- Revision:
- 4:987b201ec4b1
first
Who changed what in which revision?
User | Revision | Line number | New 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>© 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 |