d01e9c33bfcee92f6bbfff0b1807da38bbaa9b38
[SCSI2SD-V6.git] / STM32CubeMX / SCSI2SD-V6 / Src / fsmc.c
1 /**
2   ******************************************************************************
3   * File Name          : FSMC.c
4   * Description        : This file provides code for the configuration
5   *                      of the FSMC peripheral.
6   ******************************************************************************
7   *
8   * COPYRIGHT(c) 2016 STMicroelectronics
9   *
10   * Redistribution and use in source and binary forms, with or without modification,
11   * are permitted provided that the following conditions are met:
12   *   1. Redistributions of source code must retain the above copyright notice,
13   *      this list of conditions and the following disclaimer.
14   *   2. Redistributions in binary form must reproduce the above copyright notice,
15   *      this list of conditions and the following disclaimer in the documentation
16   *      and/or other materials provided with the distribution.
17   *   3. Neither the name of STMicroelectronics nor the names of its contributors
18   *      may be used to endorse or promote products derived from this software
19   *      without specific prior written permission.
20   *
21   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31   *
32   ******************************************************************************
33   */
34 /* Includes ------------------------------------------------------------------*/
35 #include "fsmc.h"
36
37 #include "gpio.h"
38
39 /* USER CODE BEGIN 0 */
40
41 /* USER CODE END 0 */
42
43 SRAM_HandleTypeDef hsram1;
44
45 /* FSMC initialization function */
46 void MX_FSMC_Init(void)
47 {
48   FSMC_NORSRAM_TimingTypeDef Timing;
49
50   /** Perform the SRAM1 memory initialization sequence
51   */
52   hsram1.Instance = FSMC_NORSRAM_DEVICE;
53   hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
54   /* hsram1.Init */
55   hsram1.Init.NSBank = FSMC_NORSRAM_BANK1;
56   hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_ENABLE;
57   hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_PSRAM;
58   hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_8;
59   hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
60   hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
61   hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
62   hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
63   hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
64   hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
65   hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
66   hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
67   hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
68   /* Timing */
69
70   // 1 clock to read the address, but since the signals aren't stable
71   // at 96MHz we wait two more clocks
72   Timing.AddressSetupTime = 3;
73   Timing.AddressHoldTime = 1;
74
75   Timing.DataSetupTime = 5;
76   // +1 clock hold time, +2 clock to let the bus settle (unstable at 96MHz)
77   // +1 clock to process read, 1 clock to output
78
79   // Allow a clock for us to release signals, or else we'll read
80   // our own output data as an address.
81   Timing.BusTurnAroundDuration = 1;
82
83   Timing.CLKDivision = 16; // Ignored for async
84   Timing.DataLatency = 17; // Ignored for async
85   Timing.AccessMode = FSMC_ACCESS_MODE_A;
86   /* ExtTiming */
87
88   HAL_SRAM_Init(&hsram1, &Timing, NULL);
89
90 }
91
92 static int FSMC_Initialized = 0;
93
94 static void HAL_FSMC_MspInit(void){
95   /* USER CODE BEGIN FSMC_MspInit 0 */
96
97   /* USER CODE END FSMC_MspInit 0 */
98   GPIO_InitTypeDef GPIO_InitStruct;
99   if (FSMC_Initialized) {
100     return;
101   }
102   FSMC_Initialized = 1;
103   /* Peripheral clock enable */
104   __FSMC_CLK_ENABLE();
105   
106   /** FSMC GPIO Configuration  
107   PE7   ------> FSMC_DA4
108   PE8   ------> FSMC_DA5
109   PE9   ------> FSMC_DA6
110   PE10   ------> FSMC_DA7
111   PD14   ------> FSMC_DA0
112   PD15   ------> FSMC_DA1
113   PD0   ------> FSMC_DA2
114   PD1   ------> FSMC_DA3
115   PD4   ------> FSMC_NOE
116   PD5   ------> FSMC_NWE
117   PD7   ------> FSMC_NE1
118   PB7   ------> FSMC_NL
119   */
120   /* GPIO_InitStruct */
121   GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
122   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
123   GPIO_InitStruct.Pull = GPIO_NOPULL;
124   GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
125   GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
126
127   HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
128
129   /* GPIO_InitStruct */
130   GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1 
131                           |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7;
132   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
133   GPIO_InitStruct.Pull = GPIO_NOPULL;
134   GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
135   GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
136
137   HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
138
139   /* GPIO_InitStruct */
140   GPIO_InitStruct.Pin = GPIO_PIN_7;
141   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
142   GPIO_InitStruct.Pull = GPIO_NOPULL;
143   GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
144   GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
145
146   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
147
148   /* USER CODE BEGIN FSMC_MspInit 1 */
149
150   /* USER CODE END FSMC_MspInit 1 */
151 }
152
153 void HAL_SRAM_MspInit(SRAM_HandleTypeDef* hsram){
154   /* USER CODE BEGIN SRAM_MspInit 0 */
155
156   /* USER CODE END SRAM_MspInit 0 */
157   HAL_FSMC_MspInit();
158   /* USER CODE BEGIN SRAM_MspInit 1 */
159
160   /* USER CODE END SRAM_MspInit 1 */
161 }
162
163 static int FSMC_DeInitialized = 0;
164
165 static void HAL_FSMC_MspDeInit(void){
166   /* USER CODE BEGIN FSMC_MspDeInit 0 */
167
168   /* USER CODE END FSMC_MspDeInit 0 */
169   if (FSMC_DeInitialized) {
170     return;
171   }
172   FSMC_DeInitialized = 1;
173   /* Peripheral clock enable */
174   __FSMC_CLK_DISABLE();
175   
176   /** FSMC GPIO Configuration  
177   PE7   ------> FSMC_DA4
178   PE8   ------> FSMC_DA5
179   PE9   ------> FSMC_DA6
180   PE10   ------> FSMC_DA7
181   PD14   ------> FSMC_DA0
182   PD15   ------> FSMC_DA1
183   PD0   ------> FSMC_DA2
184   PD1   ------> FSMC_DA3
185   PD4   ------> FSMC_NOE
186   PD5   ------> FSMC_NWE
187   PD7   ------> FSMC_NE1
188   PB7   ------> FSMC_NL
189   */
190
191   HAL_GPIO_DeInit(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);
192
193   HAL_GPIO_DeInit(GPIOD, GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1 
194                           |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7);
195
196   HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7);
197
198   /* USER CODE BEGIN FSMC_MspDeInit 1 */
199
200   /* USER CODE END FSMC_MspDeInit 1 */
201 }
202
203 void HAL_SRAM_MspDeInit(SRAM_HandleTypeDef* hsram){
204   /* USER CODE BEGIN SRAM_MspDeInit 0 */
205
206   /* USER CODE END SRAM_MspDeInit 0 */
207   HAL_FSMC_MspDeInit();
208   /* USER CODE BEGIN SRAM_MspDeInit 1 */
209
210   /* USER CODE END SRAM_MspDeInit 1 */
211 }
212 /**
213   * @}
214   */
215
216 /**
217   * @}
218   */
219
220 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/