/
sd_operations.c
504 lines (374 loc) · 18.5 KB
/
sd_operations.c
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
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
194
195
196
197
198
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
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
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
#include "main.h"
#include "stm32f4xx.h"
#include "sdio_sd.h"
#include "usart.h"
#include "stm32f4_discovery.h"
#include "sd_operations.h"
#include "logic.h"
//Software
#include "integer.h"
#include "string.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
// chan-lib "stuff"
#include "ff.h"
#include "ffconf.h"
#include "diskio.h"
extern char fileRaw[13]; //Èìÿ ôàéëà äëÿ çàïèñè
extern unsigned int milliseconds; //Ìèëëèñåêóíäû RTC
extern unsigned char seconds; //rtc seconds
extern unsigned char minutes;
extern unsigned char hours; //rtc hours
extern unsigned long long cnt_timer; //Ñ÷åò÷èê äëÿ îðãàíèçàöèè ðàçëè÷íûõ òàéìàóòîâ â êîäå
extern Settings SETS; //íàñòðîéêè äàò÷èêà
extern bool sd_in_use;
//Áóôåð äëÿ çàïèñè íà êàðòî÷êó è óìåíüøåíèÿ ÷èñëà âêëþ÷åíèé êàðòî÷êè
char SaveBuff1[SD_WRITE_BUFFER];
char SaveBuff2[SD_WRITE_BUFFER];
char *mem = &SaveBuff1[0];
char *sd = &SaveBuff2[0];
//Äëÿ ðàáîòû ñ ôàéëîâîé ñèñòåìîé
DWORD acc_size; // Work register for fs command
WORD acc_files, acc_dirs;
FILINFO finfo;
FILINFO Finfo;
FATFS Fatfs; // File system object for each logical drive
#define LOG_LEN_MAX 32
/* Private typedef -----------------------------------------------------------*/
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
SD_Error Status = SD_OK;
/* Private functions ---------------------------------------------------------*/
GPIO_InitTypeDef GPIO_InitStructure;
// Setup SysTick Timer for 1 msec interrupts.
// ------------------------------------------
// 1. The SysTick_Config() function is a CMSIS function which configure:
// - The SysTick Reload register with value passed as function parameter.
// - Configure the SysTick IRQ priority to the lowest value (0x0F).
// - Reset the SysTick Counter register.
// - Configure the SysTick Counter clock source to be Core Clock Source (HCLK).
// - Enable the SysTick Interrupt.
// - Start the SysTick Counter.
//
// 2. You can change the SysTick Clock source to be HCLK_Div8 by calling the
// SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) just after the
// SysTick_Config() function call. The SysTick_CLKSourceConfig() is defined
// inside the misc.c file.
// 3. You can change the SysTick IRQ priority by calling the
// NVIC_SetPriority(SysTick_IRQn,...) just after the SysTick_Config() function
// call. The NVIC_SetPriority() is defined inside the core_cm4.h file.
// 4. To adjust the SysTick time base, use the following formula:
// Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s)
// - Reload Value is the parameter to be passed for SysTick_Config() function
// - Reload Value should not exceed 0xFFFFFF
void NVIC_Configuration(void){
/* NVIC_InitTypeDef NVIC_InitStructure;
//Configure the NVIC Preemption Priority Bits
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = SD_SDIO_DMA_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_Init(&NVIC_InitStructure); */
NVIC_EnableIRQ(SDIO_IRQn);
NVIC_SetPriority (SDIO_IRQn, 0);
NVIC_EnableIRQ(SD_SDIO_DMA_IRQn);
NVIC_SetPriority (SD_SDIO_DMA_IRQn, 0);
}
void settings_to_sd(void) {
//Óäàëèòü ñòàðûå íàñòðîéêè
char * filename = "settings.ini";
DEBUG("WRITE SETTINGS... ");
if (f_mount(&Fatfs, "0:", 1) == FR_OK){ //åñëè âñå îòêðûëîñü íîðìàëüíî
f_unlink(filename); //Óäàëèì ôàéë
save(SETTINGS, "<SensorID>%i</SensorID>\r\n", SETS.SensorID);
save(SETTINGS, "<XOperationMode>%i</XOperationMode>\r\n", SETS.XOperationMode);
save(SETTINGS, "<YOperationMode>%i</YOperationMode>\r\n", SETS.YOperationMode);
save(SETTINGS, "<ZOperationMode>%i</ZOperationMode>\r\n", SETS.ZOperationMode);
save(SETTINGS, "<GravityInfluenceAxis>%c</GravityInfluenceAxis>\r\n", SETS.GravityInfluenceAxis);
save(SETTINGS, "<Window>%i</Window>\r\n", SETS.Window);
save(SETTINGS, "<Sensivity>%i</Sensivity>\r\n", SETS.Sensivity);
save(SETTINGS, "<Filter>%i</Filter>\r\n", SETS.Filter);
save(SETTINGS, "<ZeroPoints>%i</ZeroPoints>\r\n", SETS.ZeroPoints);
save(SETTINGS, "<SSID>%s</SSID>\r\n", SETS.SSID);
save(SETTINGS, "<pass>%s</pass>\r\n", SETS.pass);
f_mount(NULL, "0:", 1); //Unmount
}
DEBUG("DONE\r\n");
}
void read_all(char * filename){
FIL file;
char buff[64]; //Áóôôåð äëÿ ÷òåíèÿ â íåãî
if (f_mount(&Fatfs, "0:", 1) == FR_OK){; //Ìîíòèðóåìñÿ
char r=f_open(&file, filename, FA_READ); //Îòêðûâàåì
while (f_gets(buff, sizeof(buff), &file)) 1+1;
// DEBUG("LOG: %s\r\n", buff);
f_close(&file); //Çàêðûâàåì
f_mount(NULL, "0:", 1); //Unmount
}
}
int save_buffer (FileType FT, char *buff){
FIL file;
char* filename = "log.txt";
switch (FT) {
case DATA:
filename = "actual.dat";
break;
case LOG:
filename = "log.txt";
break;
case SETTINGS:
filename = "settings.ini";
break;
}
unsigned int bw; //Êîë-âî çàïèñàííûõ áàéòîâ
if (f_mount(&Fatfs, "0:", 1) == FR_OK){ //Ìîíòèðóåìñÿ
f_open (&file, filename, FA_WRITE | FA_OPEN_ALWAYS); //Îòêðûâàåì èëè ñîçäàåì
f_lseek(&file, f_size(&file)); //Èäåì â êîíåö ôàéëà
f_write(&file, buff, strlen(buff), &bw); //Write data to the file
f_close(&file); //Çàêðûâàåì è òåì ñàìûì ïðîèçâîäèì çàïèñü íà äèñê
f_mount(NULL, "0:", 1); //Unmount
}
return 0;
}
//Çàïèñü ñâåæèõ äàííûõ â ïàìÿòü ñ ôîðìàòèðîâàíèåì
int save (FileType FT, char const* fmt, ... ) {
FIL file;
char* filename = "log.txt";
switch (FT) {
case DATA:
filename = "actual.dat";
break;
case LOG:
filename = "log.txt";
break;
case SETTINGS:
filename = "settings.ini";
break;
case DOWNLOAD:
filename = "download.tmp";
break;
}
//Â êàêîé ôàéë ïèñàòü
unsigned int bw; //Êîë-âî çàïèñàííûõ áàéòîâ
char buff[1024+1];
va_list uk_arg;
va_start (uk_arg, fmt);
int slen = vsnprintf(buff, 1024, fmt, uk_arg); //Ôîðìàòèðîâàíèå ñòðîêè
if (slen > 1024) slen = 1024;
int a, b;
// LED_on(LED5);
//LED_on(LED_GREEN);
f_open(&file, filename, FA_WRITE | FA_OPEN_ALWAYS); //Îòêðûâàåì èëè ñîçäàåì
f_lseek(&file, f_size(&file)); //Èäåì â êîíåö ôàéëà
a = (int)cnt_timer;
f_write(&file, buff, slen, &bw); // Write data to the file
f_sync(&file);
b = (int)cnt_timer;
f_close(&file); //Çàêðûâàåì
//LED_off(LED_GREEN);
return (b-a);
}
void unmount (){
f_mount(NULL, "0:", 1); //Unmount
}
void mount (){
if (f_mount(&Fatfs, "0:", 1) == FR_OK){ //Ìîíòèðóåìñÿ
//OK
} else {
//Îøèáêà
}
}
//Îòêðûâàåò ôàéë download.tmp äëÿ çàïèñè
/*
void open_download_file (){
disk_initialize(0); //Âñÿêèé ðàç ïåðåä çàïèñüþ èíèöèàëèçèðóåì êàðòó,
//ò.ê. åå îòêëþ÷àåì ÷åðåç òðàíçèñòîð äëÿ ýíåðãîñáåðåæåíèÿ
//ÍÀÄÎ ÓËÓ×ØÈÒÜ
if (f_mount(&Fatfs, "0:", 1) == FR_OK){ //Ìîíòèðóåìñÿ
f_open(&download_file, "download.tmp", FA_CREATE_ALWAYS); //Îòêðûâàåì ôàéë. Ñóùåñòâóþùèé, åñëè îí ñåòü, î÷èùàåì
f_lseek(&download_file, f_size(&download_file)); //Èäåì â êîíåö ôàéëà
}
}
void write_download_file (char *buff) {
unsigned int bw; //Êîë-âî çàïèñàííûõ áàéòîâ
f_write(&download_file, buff, strlen(buff), &bw); // Write data to the file
f_sync(&download_file); //flush data
}
void close_download_file () {
f_close(&download_file); //Çàêðûâàåì
f_mount(NULL, "0:", 1); //Unmount
}
*/
//Ñîõðàíÿåò íîâûå äàííûå. Ñíà÷àëà â áóôåð. Ïîòîì íà êàðò÷êó.
void save_value(char Axis, float Filtered, float a, float b){
RTC_TimeTypeDef RTC_Time;
RTC_DateTypeDef RTC_Date;
//Ïîëó÷àåì òåêóùèå âðåìÿ è äàòó
RTC_GetTime(RTC_Format_BIN, &RTC_Time);
RTC_GetDate(RTC_Format_BIN, &RTC_Date);
//milliseconds //Çäåñü ìèëëèñåêóíäû
char buff[256]; //Êóäà ñîõðàíèì ñòîðêó + \0
static long rec_num;
rec_num++;
//Ôîðìèðóåì ñòðîêó ñ çàïèñüþ.
int slen = sprintf(buff, "%0.6d %0.2d-%0.2d-%0.2d %0.2d:%0.2d:%0.2d.%0.3d %c %0.3f %0.3f %0.3f\r\n", rec_num,
RTC_Date.RTC_Year, RTC_Date.RTC_Month, RTC_Date.RTC_Date,
RTC_Time.RTC_Hours, RTC_Time.RTC_Minutes, RTC_Time.RTC_Seconds,
milliseconds,
Axis, Filtered, a, b); //Ôîðìàòèðîâàíèå ñòðîêè
//Åñëè áóôôåð óæå íå âìåñòèò íîâûå äàííûå, ïîäìåíÿåì áóôôåð.
//Áóôôåð â ïàìÿòè ñäåëàí äëÿ òîãî, ÷òîáû ìîæíî áûëî îòêëþ÷àòü SD-êàðòî÷ó è íå òðàòèòü ýíåðãèþ.
if (strlen(mem) + slen+1 >= SD_WRITE_BUFFER) {
if (mem != &SaveBuff1[0]){
mem = &SaveBuff1[0];
sd = &SaveBuff2[0];
} else {
mem = &SaveBuff2[0];
sd = &SaveBuff1[0];
}
memset (mem, (char)'\0', SD_WRITE_BUFFER);
}
//Äîáàâèì âî âðåìåííûé áóôåð
strcat(mem, buff);
//Ïðîâåðêà íåîáõîäèìîñòè ïåðåíîñà äàííûõ íà êàðòî÷êó âî èçáåæàíèå ïåðåïîëíåíèÿ
//ÔÈÔÎ âûçûâàåòñÿ èç main ÷òîáû íå çàäåðæèâàòü ïðåðûâàíèå
//Íî ïðè îòïðàâêå ôàéëîâ îí ôóíêöèÿ çàïèñè íà SD âûçûâàåòñÿ ñëèøêîì ðåäêî!
}
//Ñîõðàíÿåò íîâûå äàííûå. Ñíà÷àëà â áóôåð. Ïîòîì íà êàðò÷êó.
void save_raw_values(int X, int Y, int Z){
char buff[256]; //Êóäà ñîõðàíèì ñòîðêó + \0
static long rec_num;
rec_num++;
//Ôîðìèðóåì ñòðîêó ñ çàïèñüþ.
int slen = sprintf(buff, "%0.8d %0.2d %0.2d %0.2d %0.3d %0.3d %0.3d %0.3d\r\n", rec_num, hours, minutes, seconds, milliseconds, X, Y, Z); //Ôîðìàòèðîâàíèå ñòðîêè
//Åñëè áóôôåð óæå íå âìåñòèò íîâûå äàííûå, ïîäìåíÿåì áóôôåð.
//Áóôôåð â ïàìÿòè ñäåëàí äëÿ òîãî, ÷òîáû ìîæíî áûëî îòêëþ÷àòü SD-êàðòî÷ó è íå òðàòèòü ýíåðãèþ.
if (strlen(mem) + slen+1 >= SD_WRITE_BUFFER) {
if (mem != &SaveBuff1[0]){
mem = &SaveBuff1[0];
sd = &SaveBuff2[0];
} else {
mem = &SaveBuff2[0];
sd = &SaveBuff1[0];
}
memset (mem, (char)'\0', SD_WRITE_BUFFER);
}
//Äîáàâèì âî âðåìåííûé áóôåð
strcat(mem, buff);
//Ïðîâåðêà íåîáõîäèìîñòè ïåðåíîñà äàííûõ íà êàðòî÷êó âî èçáåæàíèå ïåðåïîëíåíèÿ
//ÔÈÔÎ âûçûâàåòñÿ èç main ÷òîáû íå çàäåðæèâàòü ïðåðûâàíèå
//Íî ïðè îòïðàâêå ôàéëîâ îí ôóíêöèÿ çàïèñè íà SD âûçûâàåòñÿ ñëèøêîì ðåäêî!
}
void flush_to_sd (void){
FIL file;
UINT bytes_written;
unsigned int filelen;
char sendfilename[13]; //äëÿ ôîðìèðîâàíèÿ èìåíè íîâîãî ôàéëà
unsigned short rest; //Îñòàòîê áóôôåðà ïîñëå äåëåíèÿ íà áëîêè WRITE_SAFE_BLOCK = 256 áàéò
unsigned short t; //×èñëî áëîêîâ WRITE_SAFE_BLOCK = 256 áàéò
char *wr; //Äëÿ ññûëêè íà ìàññèâ sd ÷òîáû íå èíêðåìåíòèðîâàòü àäðåñ ñèìâîëà â ñàìîì sd
unsigned short len; //Îáúåì áóôôåðà
// unsigned short mss;
//Â áóôôåð mem ïèøóòñÿ äàííûå. Êàê òîëüêî èõ òàì ñòàíîâèòñÿ ìíîãî áóôôåðû mem è sd âçàèìíî ìåíÿþòñÿ
//ñäåëàíî ÷òîáû íå áûëî ïðîáëåì ñ îäíîâðåìåííîé ðàáîòîé èçìåðåíèé è çàïèñè
len = strlen(sd);
if (len){ //Íå ïîðà ëè ïåðåíîñèòü äàííûå íà êðòî÷êó? À òî ïåðåïîëíèòñÿ áóôôåð mem
//Íå ïðîèçâîæó çàïèñü ìèíóÿ áóôåð ïðè ïîìîùè f_putc, ò.ê. ÿ îïàñàþñü äëèòåëüíûõ çàäåðæåê â âûïîëíåíèè ïðåðûâàíèÿ
//Â òî æå âðåìÿ áóôôåð äîëæåí ïîïîëíÿòüñÿ ïî ïðåðûâàíèþ âíå çàâèñèìîñòè îò çàïèñè
//Âîîáùå âñå ýòî çàòåÿíî ÷òîáû ðåçæå âêëþ÷àòü ïèòàíèå êàðòî÷êè
//DEBUG("TRY FLUSH TO SD %i bytes\r\n", len);
//RTC_DateTimePrint();
if (f_mount(&Fatfs, "0:", 1) == FR_OK){ //åñëè âñå îòêðûëîñü íîðìàëüíî
//LED_on(LED_GREEN);
//Ïèøåì êóñî÷êàìè ïî 256 áàéò, èíà÷å âîçíèêàþò îøèáêè. Ãäå-òî â FATFS áàã. Ìîãóò ïðîïóñêàòüñÿ èëè ïîâòîðÿòüñÿ ñèìâîëû ïðè çàïèñè ôàéëà åñëè ïèñàòü ñðàçó ìíîãî. Ïðîèñõîäèò ñëó÷àéíûì îáðàçîì.
wr = sd; //Êîïèðóåì óêàçàòåëü â íîâûé óêàçàòåëü ÷òîáû åãî ìîæíî áûëî áåç ïðîáëåì èíêðåìåíòèðîâàòü
t = len/WRITE_SAFE_BLOCK; //Öåëîå ÷èñëî áëîêîâ
rest = len % WRITE_SAFE_BLOCK; //Îñòàòîê áóôôåðà íå êðàòíûé 256
// f_open(&file, "actual.dat", FA_WRITE | FA_OPEN_ALWAYS); //Îòêðûâàåì èëè ñîçäàåì
f_open(&file, fileRaw, FA_WRITE | FA_OPEN_ALWAYS); //Îòêðûâàåì èëè ñîçäàåì
f_lseek(&file, f_size(&file)); //Èäåì â êîíåö ôàéëà
for (unsigned short k = t; k != 0; k--){
//Ïèøåì WRITE_SAFE_BLOCK áàéò èç wr â ôàéë. åñëè ïèñàòü áîëüøå - áóäóò ïðîïàäàòü ñèìâîëû
f_write(&file, wr, WRITE_SAFE_BLOCK , &bytes_written);
wr += WRITE_SAFE_BLOCK; //Ñäâèãàåì áóôôåð
}
f_close(&file);
//È îñòàëñÿ åùå êóñî÷åê áóôôåðà íå êðàòíûé WRITE_SAFE_BLOCK áàéò
//ïèøåì rest áàéò
/* f_open(&file, "actual.dat", FA_WRITE | FA_OPEN_ALWAYS); //Îòêðûâàåì èëè ñîçäàåì
f_lseek(&file, f_size(&file)); //Èäåì â êîíåö ôàéëà
f_write(&file, wr, rest, &bytes_written);
// DEBUG("BYTES WRITTEN %i\r\n", bytes_written);
filelen = file.fsize;
f_close(&file);*/
//DEBUG("DONE\r\n");
//RTC_DateTimePrint();
//Åñëè ôàéë óæå ñëèøêîì áîëüøîé, ïîìåòèì åãî íà îòïðàâêó, à ïèñàòü áóäåì â íîâûé.
//Ïåðåèìåíîâàíèå ôàéëà íå òðåáóåò åãî áëîêèðîâàíèÿ, òàê êàê èç ïðåðûâàíèÿ ñåé÷àñ èäåò çàïèñü â áóôôåð
//È çàïèñè â ôàéë ñåé÷àñ ïðîèñõîäèòü ïðîñòî íå ìîæåò
/* if (filelen > MAX_FILE_SIZE){
//Îïðåäåëÿåì íîâîå èìÿ äëÿ ôàéëà. Ãåíåðèì ïîêà îíî íå ñòàíåò óíèêàëüíûì
generate_name:
sprintf(sendfilename, "%0.2d%0.2d%0.4d.TS", minutes, seconds, milliseconds);
if (f_stat(sendfilename, NULL) == FR_OK) goto generate_name;
//Ïåðåèìåíîâàëè actual.dat
f_rename("actual.dat", sendfilename); //Ïåðåèìåíîâûâàåì ôàéë
DEBUG("MARK file as '%s' for post to server\r\n", sendfilename);
}*/
f_mount(NULL, 0, 1);
//LED_off(LED_GREEN);
} else {
DEBUG("SD mount FAIL!\r\n");
}
sd[0] = 0; //Èíà÷å ñíîâà áóäåì ïèñàòü íà êàðòî÷êó òî æå ñàìîå
} //if
}
void test_write_sd (void){
unsigned short rest; //Îñòàòîê áóôôåðà ïîñëå äåëåíèÿ íà áëîêè WRITE_SAFE_BLOCK = 256 áàéò
unsigned short t; //×èñëî áëîêîâ WRITE_SAFE_BLOCK = 256 áàéò
char *wr; //Äëÿ ññûëêè íà ìàññèâ sd ÷òîáû íå èíêðåìåíòèðîâàòü àäðåñ ñèìâîëà â ñàìîì sd
FIL file;
UINT bytes_written;
char bfr[512*2];
short rt=0;
int slen = sprintf(bfr, "QWERTYUIOPASDF1234567890-=- --QWERTYUIOPASDF1234567890-=-906QWERTYUIOPASDF1234567890-=- PASDF1234567890-=-906QWERTYUIOPASDF1234567890-=PASDF1234567890-=-906QWERTYUIOPASDF1234567890-=PASDF1234567890-=-906QWERTYUIOPASDF1234567890-= --QWERTYUIOPASDF1234567890-=-90699202321QWERTYUIOPASDF1234567890-=- --QWERTYUIOPASDF1234567890-=-906QWERTYUIOPASDF1234567890-QWERTYUIOPASDF1234567890-=- --QWERTYUIOPASDF1234567890-=-906QWERTYUIOPASDF1234567890-=- PASDF1234567890-=-906QWERTYUIOPASDF1234567890-=PASDF1234567890-=-906Q78687435\r\n"); //Ôîðìàòèðîâàíèå ñòðîêè
printf("TRY write SD %i Kbytes\r\n", slen*1000/1024);
RTC_DateTimePrint();
if (f_mount(&Fatfs, "0:", 1) == FR_OK){ //åñëè âñå îòêðûëîñü íîðìàëüíî
// LED_on(LED_GREEN);
//Ïèøåì êóñî÷êàìè ïî 256 áàéò, èíà÷å âîçíèêàþò îøèáêè. Ãäå-òî â FATFS áàã. Ìîãóò ïðîïóñêàòüñÿ èëè ïîâòîðÿòüñÿ ñèìâîëû ïðè çàïèñè ôàéëà åñëè ïèñàòü ñðàçó ìíîãî. Ïðîèñõîäèò ñëó÷àéíûì îáðàçîì.
wr = bfr; //Êîïèðóåì óêàçàòåëü â íîâûé óêàçàòåëü ÷òîáû åãî ìîæíî áûëî áåç ïðîáëåì èíêðåìåíòèðîâàòü
t = slen/WRITE_SAFE_BLOCK; //Öåëîå ÷èñëî áëîêîâ
rest = slen % WRITE_SAFE_BLOCK; //Îñòàòîê áóôôåðà íå êðàòíûé 256
f_unlink("test.dat");
while (rt<100) {
f_open(&file, "test.dat", FA_WRITE | FA_OPEN_ALWAYS); //Îòêðûâàåì èëè ñîçäàåì
f_lseek(&file, f_size(&file)); //Èäåì â êîíåö ôàéëà
for (unsigned short k = t; k != 0; k--){
//Ïèøåì WRITE_SAFE_BLOCK áàéò èç wr â ôàéë. åñëè ïèñàòü áîëüøå - áóäóò ïðîïàäàòü ñèìâîëû
f_write(&file, wr, WRITE_SAFE_BLOCK , &bytes_written);
wr += WRITE_SAFE_BLOCK; //Ñäâèãàåì áóôôåð
}
f_close(&file);
//È îñòàëñÿ åùå êóñî÷åê áóôôåðà íå êðàòíûé WRITE_SAFE_BLOCK áàéò
//ïèøåì rest áàéò
// f_open(&file, "test.dat", FA_WRITE | FA_OPEN_ALWAYS); //Îòêðûâàåì èëè ñîçäàåì
// f_lseek(&file, f_size(&file)); //Èäåì â êîíåö ôàéëà
// f_write(&file, wr, rest, &bytes_written);
// f_close(&file);
rt++;
}
printf("DONE\r\n");
RTC_DateTimePrint();
f_mount(NULL, 0, 1);
// LED_off(LED_GREEN);
} else {
printf("SD mount FAIL!\r\n");
}
while(1){
}
}