1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
59
60
63
64
67
68
71
72
73
74
77
78
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
118
122
123
124
131
142
143
146
150
151
158
159
160
161
162
163
164
165
166
167
168
172
173
174
175
176
177
178
179
180
181
182
189
190
191
192
193
194
195
199
203
204
205
210
211
212
213
214
215
216
220
224
225
226
230
231
232
233
234
235
236
240
244
245
246
251
262
263
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
313
314
315
316
317
318
322
323
324
325
326
330
331
332
335
336
339
340
/* ... */
/* ... */
#include "stm324x9i_eval_nor.h"
/* ... */
/* ... */
/* ... */
/* ... */
static NOR_HandleTypeDef norHandle;
static FMC_NORSRAM_TimingTypeDef Timing;
/* ... */
/* ... */
uint8_t BSP_NOR_Init(void)
{
norHandle.Instance = FMC_NORSRAM_DEVICE;
norHandle.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
Timing.AddressSetupTime = 4;
Timing.AddressHoldTime = 3;
Timing.DataSetupTime = 7;
Timing.BusTurnAroundDuration = 1;
Timing.CLKDivision = 2;
Timing.DataLatency = 2;
Timing.AccessMode = FMC_ACCESS_MODE_A;
norHandle.Init.NSBank = FMC_NORSRAM_BANK1;
norHandle.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
norHandle.Init.MemoryType = FMC_MEMORY_TYPE_NOR;
norHandle.Init.MemoryDataWidth = NOR_MEMORY_WIDTH;
norHandle.Init.BurstAccessMode = NOR_BURSTACCESS;
norHandle.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
norHandle.Init.WrapMode = FMC_WRAP_MODE_DISABLE;
norHandle.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
norHandle.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
norHandle.Init.WaitSignal = FMC_WAIT_SIGNAL_ENABLE;
norHandle.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
norHandle.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_ENABLE;
norHandle.Init.WriteBurst = NOR_WRITEBURST;
norHandle.Init.ContinuousClock = CONTINUOUSCLOCK_FEATURE;
BSP_NOR_MspInit();
if(HAL_NOR_Init(&norHandle, &Timing, &Timing) != HAL_OK)
{
return NOR_STATUS_ERROR;
}if (HAL_NOR_Init(&norHandle, &Timing, &Timing) != HAL_OK) { ... }
else
{
return NOR_STATUS_OK;
}else { ... }
}{ ... }
/* ... */
uint8_t BSP_NOR_ReadData(uint32_t uwStartAddress, uint16_t* pData, uint32_t uwDataSize)
{
if(HAL_NOR_ReadBuffer(&norHandle, NOR_DEVICE_ADDR + uwStartAddress, pData, uwDataSize) != HAL_OK)
{
return NOR_STATUS_ERROR;
}if (HAL_NOR_ReadBuffer(&norHandle, NOR_DEVICE_ADDR + uwStartAddress, pData, uwDataSize) != HAL_OK) { ... }
else
{
return NOR_STATUS_OK;
}else { ... }
}{ ... }
/* ... */
void BSP_NOR_ReturnToReadMode(void)
{
HAL_NOR_ReturnToReadMode(&norHandle);
}{ ... }
/* ... */
uint8_t BSP_NOR_WriteData(uint32_t uwStartAddress, uint16_t* pData, uint32_t uwDataSize)
{
uint32_t index = uwDataSize;
while(index > 0)
{
HAL_NOR_Program(&norHandle, (uint32_t *)(NOR_DEVICE_ADDR + uwStartAddress), pData);
if(HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, PROGRAM_TIMEOUT) != NOR_SUCCESS)
{
return NOR_STATUS_ERROR;
}if (HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, PROGRAM_TIMEOUT) != NOR_SUCCESS) { ... }
index--;
uwStartAddress += 2;
pData++;
}while (index > 0) { ... }
return NOR_STATUS_OK;
}{ ... }
/* ... */
uint8_t BSP_NOR_ProgramData(uint32_t uwStartAddress, uint16_t* pData, uint32_t uwDataSize)
{
HAL_NOR_ProgramBuffer(&norHandle, uwStartAddress, pData, uwDataSize);
if(HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, PROGRAM_TIMEOUT) != NOR_SUCCESS)
{
return NOR_STATUS_ERROR;
}if (HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, PROGRAM_TIMEOUT) != NOR_SUCCESS) { ... }
else
{
return NOR_STATUS_OK;
}else { ... }
}{ ... }
/* ... */
uint8_t BSP_NOR_Erase_Block(uint32_t BlockAddress)
{
HAL_NOR_Erase_Block(&norHandle, BlockAddress, NOR_DEVICE_ADDR);
if(HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, BLOCKERASE_TIMEOUT) != NOR_SUCCESS)
{
return NOR_STATUS_ERROR;
}if (HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, BLOCKERASE_TIMEOUT) != NOR_SUCCESS) { ... }
else
{
return NOR_STATUS_OK;
}else { ... }
}{ ... }
/* ... */
uint8_t BSP_NOR_Erase_Chip(void)
{
HAL_NOR_Erase_Chip(&norHandle, NOR_DEVICE_ADDR);
if(HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, CHIPERASE_TIMEOUT) != NOR_SUCCESS)
{
return NOR_STATUS_ERROR;
}if (HAL_NOR_GetStatus(&norHandle, NOR_DEVICE_ADDR, CHIPERASE_TIMEOUT) != NOR_SUCCESS) { ... }
else
{
return NOR_STATUS_OK;
}else { ... }
}{ ... }
/* ... */
uint8_t BSP_NOR_Read_ID(NOR_IDTypeDef *pNOR_ID)
{
if(HAL_NOR_Read_ID(&norHandle, pNOR_ID) != HAL_OK)
{
return NOR_STATUS_ERROR;
}if (HAL_NOR_Read_ID(&norHandle, pNOR_ID) != HAL_OK) { ... }
else
{
return NOR_STATUS_OK;
}else { ... }
}{ ... }
/* ... */
__weak void BSP_NOR_MspInit(void)
{
GPIO_InitTypeDef GPIO_Init_Structure;
__HAL_RCC_FMC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
GPIO_Init_Structure.Mode = GPIO_MODE_AF_PP;
GPIO_Init_Structure.Pull = GPIO_PULLUP;
GPIO_Init_Structure.Speed = GPIO_SPEED_HIGH;
GPIO_Init_Structure.Alternate = GPIO_AF12_FMC;
GPIO_Init_Structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 |\
GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 |\
GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
HAL_GPIO_Init(GPIOD, &GPIO_Init_Structure);
GPIO_Init_Structure.Pin = GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 |\
GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 |\
GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
HAL_GPIO_Init(GPIOE, &GPIO_Init_Structure);
GPIO_Init_Structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2| GPIO_PIN_3 | GPIO_PIN_4 |\
GPIO_PIN_5 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
HAL_GPIO_Init(GPIOF, &GPIO_Init_Structure);
GPIO_Init_Structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2| GPIO_PIN_3 | GPIO_PIN_4 |\
GPIO_PIN_5;
HAL_GPIO_Init(GPIOG, &GPIO_Init_Structure);
}{ ... }
/* ... */
void HAL_NOR_MspWait(NOR_HandleTypeDef *hnor, uint32_t Timeout)
{
uint32_t timeout = Timeout;
while((HAL_GPIO_ReadPin(NOR_READY_BUSY_GPIO, NOR_READY_BUSY_PIN) != NOR_BUSY_STATE) && (timeout > 0))
{
timeout--;
}while ((HAL_GPIO_ReadPin(NOR_READY_BUSY_GPIO, NOR_READY_BUSY_PIN) != NOR_BUSY_STATE) && (timeout > 0)) { ... }
timeout = Timeout;
while((HAL_GPIO_ReadPin(NOR_READY_BUSY_GPIO, NOR_READY_BUSY_PIN) != NOR_READY_STATE) && (timeout > 0))
{
timeout--;
}while ((HAL_GPIO_ReadPin(NOR_READY_BUSY_GPIO, NOR_READY_BUSY_PIN) != NOR_READY_STATE) && (timeout > 0)) { ... }
}{ ... }
/* ... */
/* ... */
/* ... */