1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
22
23
24
25
38
39
40
41
42
43
44
45
46
47
48
49
50
55
56
57
63
64
65
66
67
68
69
70
71
72
73
74
75
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
108
109
110
139
140
141
142
143
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
264
265
266
270
271
272
273
274
275
276
277
278
279
280
282
283
284
285
286
287
288
292
293
294
295
313
314
331
332
337
338
339
/* ... */
#include "main.h"
Includes
FATFS SDFatFs;
FIL MyFile;
char SDPath[4];
typedef enum {
APPLICATION_IDLE = 0,
APPLICATION_RUNNING,
APPLICATION_SD_UNPLUGGED,
...}FS_FileOperationsTypeDef;
FS_FileOperationsTypeDef Appli_state = APPLICATION_IDLE;
Private variables
static void SystemClock_Config(void);
static void FS_FileOperations(void);
static void SD_Initialize(void);
static void Error_Handler(void);
static uint8_t isInitialized = 0;
static uint8_t isFsCreated = 0;
uint8_t workBuffer[_MAX_SS];Private function prototypes
/* ... */
int main(void)
{
/* ... */
HAL_Init();
SystemClock_Config();
BSP_IO_Init();
BSP_LED_Init(LED1);
BSP_LED_Init(LED3);
/* ... */
BSP_IO_ConfigPin(RSTI_PIN, IO_MODE_OUTPUT);
BSP_IO_ConfigPin(XSDN_PIN, IO_MODE_OUTPUT);
BSP_IO_WritePin(XSDN_PIN, BSP_IO_PIN_RESET);
BSP_IO_WritePin(RSTI_PIN, BSP_IO_PIN_RESET);
if(FATFS_LinkDriver(&SD_Driver, SDPath) == 0)
{
SD_Initialize();
HAL_NVIC_SetPriority(SysTick_IRQn, 0x0E ,0);
if(BSP_SD_IsDetected())
{
Appli_state = APPLICATION_RUNNING;
}if (BSP_SD_IsDetected()) { ... }
while (1)
{
switch(Appli_state)
{
case APPLICATION_RUNNING:
BSP_LED_Off(LED_RED);
SD_Initialize();
FS_FileOperations();
Appli_state = APPLICATION_IDLE;
break;
case APPLICATION_RUNNING:
case APPLICATION_IDLE:
break;
case APPLICATION_IDLE:
case APPLICATION_SD_UNPLUGGED:
if (isInitialized == 1)
{
Error_Handler();
isInitialized = 0;
}if (isInitialized == 1) { ... }
Appli_state = APPLICATION_IDLE;
break;
case APPLICATION_SD_UNPLUGGED:
default:
break;default
}switch (Appli_state) { ... }
}while (1) { ... }
}if (FATFS_LinkDriver(&SD_Driver, SDPath) == 0) { ... }
while (1)
{
}while (1) { ... }
}{ ... }
static void FS_FileOperations(void)
{
FRESULT res;
uint32_t byteswritten, bytesread;
uint8_t wtext[] = "This is STM32 working with FatFs";
uint8_t rtext[100];
if(f_mount(&SDFatFs, (TCHAR const*)SDPath, 0) == FR_OK)
{
if (isFsCreated == 0)
{
if(f_mkfs(SDPath, FM_ANY, 0, workBuffer, sizeof(workBuffer)) != FR_OK)
{
BSP_LED_On(LED3);
return;
}if (f_mkfs(SDPath, FM_ANY, 0, workBuffer, sizeof(workBuffer)) != FR_OK) { ... }
isFsCreated = 1;
}if (isFsCreated == 0) { ... }
if(f_open(&MyFile, "STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE) == FR_OK)
{
res = f_write(&MyFile, wtext, sizeof(wtext), (void *)&byteswritten);
if((byteswritten > 0) && (res == FR_OK))
{
f_close(&MyFile);
if(f_open(&MyFile, "STM32.TXT", FA_READ) == FR_OK)
{
res = f_read(&MyFile, rtext, sizeof(rtext), (void *)&bytesread);
if((bytesread > 0) && (res == FR_OK))
{
f_close(&MyFile);
if((bytesread == byteswritten))
{
BSP_LED_On(LED1);
return;
}if ((bytesread == byteswritten)) { ... }
}if ((bytesread > 0) && (res == FR_OK)) { ... }
}if (f_open(&MyFile, "STM32.TXT", FA_READ) == FR_OK) { ... }
}if ((byteswritten > 0) && (res == FR_OK)) { ... }
}if (f_open(&MyFile, "STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE) == FR_OK) { ... }
}if (f_mount(&SDFatFs, (TCHAR const*)SDPath, 0) == FR_OK) { ... }
Error_Handler();
}{ ... }
/* ... */
static void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_PeriphCLKInitTypeDef RCC_PeriphClkInitStruct;
HAL_StatusTypeDef ret = HAL_OK;
__HAL_RCC_PWR_CLK_ENABLE();
/* ... */
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 360;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
RCC_OscInitStruct.PLL.PLLR = 2;
ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
if(ret != HAL_OK)
{
Error_Handler();
}if (ret != HAL_OK) { ... }
ret = HAL_PWREx_EnableOverDrive();
if(ret != HAL_OK)
{
Error_Handler();
}if (ret != HAL_OK) { ... }
RCC_PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_CK48;
RCC_PeriphClkInitStruct.SdioClockSelection = RCC_SDIOCLKSOURCE_CK48;
RCC_PeriphClkInitStruct.Clk48ClockSelection = RCC_CK48CLKSOURCE_PLLSAIP;
RCC_PeriphClkInitStruct.PLLSAI.PLLSAIM = 8;
RCC_PeriphClkInitStruct.PLLSAI.PLLSAIN = 384;
RCC_PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV8;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInitStruct);
/* ... */
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
if(ret != HAL_OK)
{
Error_Handler();
}if (ret != HAL_OK) { ... }
}{ ... }
static void SD_Initialize(void)
{
if (isInitialized == 0)
{
if (BSP_SD_Init() == MSD_OK)
{
BSP_SD_ITConfig();
isInitialized = 1;
}if (BSP_SD_Init() == MSD_OK) { ... }
else
{
BSP_LED_On(LED3);
while (BSP_SD_IsDetected() != SD_PRESENT)
{}while (BSP_SD_IsDetected() != SD_PRESENT) { ... }
}else { ... }
}if (isInitialized == 0) { ... }
}{ ... }
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(MFX_IRQOUT_PIN == GPIO_Pin)
{
if(BSP_SD_IsDetected())
{
Appli_state = APPLICATION_RUNNING;
}if (BSP_SD_IsDetected()) { ... }
else
{
Appli_state = APPLICATION_SD_UNPLUGGED;
f_mount(NULL, (TCHAR const*)"", 0);
}else { ... }
}if (MFX_IRQOUT_PIN == GPIO_Pin) { ... }
}{ ... }
static void Error_Handler(void)
{
BSP_LED_Off(LED_GREEN);
BSP_LED_On(LED_RED);
}{ ... }
#ifdef USE_FULL_ASSERT
/* ... */
void assert_failed(uint8_t* file, uint32_t line)
{
/* ... */
while (1)
{
}while (1) { ... }
}assert_failed (uint8_t* file, uint32_t line) { ... }
/* ... */#endifPrivate functions