Austins SD card logger

Dependencies:   mbed SDFileSystem

Revision:
4:4bd2b85412c3
Parent:
3:8d4c12a3b5d4
--- a/main.cpp	Wed Apr 17 06:36:24 2019 +0000
+++ b/main.cpp	Sat Apr 04 19:09:05 2020 +0000
@@ -1,12 +1,26 @@
 #include "mbed.h"
 #include "SDFileSystem.h"
 #include "string.h"
+
+
+
+/*
+
+F401 Data Logger
+Many problems were encountered. It seems that the data logger just needs the 32.7678whe KhZ crystal to run both
+the SD card and the RTC. 
+
+
+
+Had to split testing code into 2 and real code into 2B. This is because the serials are effectively hardcoded, RIP.
+USART6 must be changed to USART2
+
+
+UNTESTED. But I belive this should work!!
+
+*/
  
 /*SD card*/
-//#define DI D11
-//#define DO D12
-//#define SCK D13
-//#define CS D10
 #define DI PB_5
 #define DO PB_4
 #define SCK PB_3
@@ -18,99 +32,131 @@
 
  
 /*Serial buffer*/
-//#define PAGE_SIZE 4096
-#define PAGE_SIZE 2048
-#define HEADER_SIZE 10
-#define CHUNK_SIZE (PAGE_SIZE-HEADER_SIZE)
-#define BUF_SIZE (16*PAGE_SIZE)
+#define PAGE_SIZE 4096
+#define CHUNK_SIZE (2*PAGE_SIZE)  //double size copy
+#define BUF_SIZE (2*CHUNK_SIZE)    //total buffer len
  
 //RTC
-#define SET_TIME false
+#define SET_TIME false //true
  
 int start = 0, end = 0;
 unsigned char buf[BUF_SIZE];
-unsigned char hdr[HEADER_SIZE] = {0xff, 0xff,'M','A','N','B','L','O','R','T'};
- 
-/*UART*/
-#define BAUD_RATE 256000
-//#define BAUD_RATE 9600
-//Serial serial4(PA_11, D9);
-Serial serial4(PA_2, PA_3);
-Serial pc(PA_9, PA_10);
- 
-/*Test pins*/
-DigitalOut test(PC_0);
-DigitalOut test2(PC_2);
-int flag=0, flag2=0;
- 
+unsigned char last_char = '0';
+bool main_log_break = false;
+
+
+
 
 
  
-void rx_callback() {
-    while(serial4.readable()) {
-        buf[end] = serial4.getc();
-        //pc.printf("%c",buf[end]);
-        end++;
-        if (end == BUF_SIZE) end = 0;
+/*UART*/
+//#define BAUD_RATE 256000
+#define BAUD_RATE 2000000
+
+Serial serial4(PA_2, PA_3);         //for actual data logger 7 board
+Serial pc(PA_9, PA_10);
+
+//Serial pc(PA_2, PA_3);            //For testing on nucleo-64 boards
+//Serial serial4(PA_11, PC_7);
+
+ 
+/*Test pins*/
+DigitalOut led(PA_7);
+DigitalOut rx_HT(PC_2);
+DigitalOut rx_TC(PC_3);
+
+//int flag=0, flag2=0; 
+//bool half_transfer = false;
+//bool full_transfer = false;
+
+
+
+
+extern "C" void DMA1_Stream5_IRQHandler(void)
+{
+        /* half transfer interrupt */
+    if (DMA1->HISR & DMA_HISR_HTIF5 )  //if half transfer on DMA1 stream 5
+    {
+        DMA1->HIFCR = DMA_HIFCR_CHTIF5;  // acknowledge interrupt
+        rx_HT = 1;
+        fwrite(buf, 1, CHUNK_SIZE, fp);
+        rx_HT = 0;
+    }
+    /* transmission complete interrupt */
+    if (DMA1->HISR & DMA_HISR_TCIF5 )  //if transfer complete on DMA1 stream 5
+    {
+        DMA1->HIFCR = DMA_HIFCR_CTCIF5;  // acknowledge interrupt
+        rx_TC = 1;
+        fwrite(buf + CHUNK_SIZE, 1, CHUNK_SIZE, fp);
+        rx_TC = 0;
     }
 }
  
+ 
 int main() {
     pc.baud(256000);
-    test = 1;
-    
-    //buf[0] = 1;
-    
+    RCC->CR |= RCC_CR_HSEON;         //turn on the HSE crystal!
+    led = 1;
+
     /*init SD card, wait for card insertion*/
-    pc.printf("\n\rconfiging SD card \n\r");     
+    pc.printf("\n\rconfiging SD card ");     
     SDFileSystem sd(DI, DO, SCK, CS, "sd");
-    pc.printf("\n\r trying status \n\r"); 
+    pc.printf("\n\rtrying status ");     
     while (sd.disk_status()) {
         sd.disk_initialize();
         wait(0.5);
-        pc.printf("nope \r");
+        led = !led;
     }
     pc.printf("disk initialized \r");
     
-    if (SET_TIME) {set_time(1526496200);}
-
-    time_t seconds = 0;//time(NULL);
+    if (SET_TIME) {set_time(1557126150);}
+    led = !led;
+    time_t seconds = time(NULL);
     pc.printf("Time as seconds since January 1, 1970 = %d\n\r", seconds);
-
-
     
     strcpy(fname, "/sd/log_");
  
     sprintf(current_time, "%u", seconds );    
     strcat(fname, current_time);
-    strcat(fname, ".dat");
+    strcat(fname, ".bin");
     pc.printf("Logging to %s\n", fname);
-    
+    led = !led;
     FILE *fp = fopen(fname, "wb");
+    pc.printf("file opened \r");
+    led = 0;
     
     
     /*init serial*/    
     serial4.baud(BAUD_RATE);
-    serial4.attach(rx_callback);
-     
-    //while (1==1) {pc.prinf("%i",end);}
+    
+    //FOR NUCLEO-64 boards: USART6, DMA2, Stream2, channel 5?
+    //for actual data logger: USART2, DMA1, Stream5, Channel 4
+    
     
+    RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN;
+
+    USART2->CR3 |= USART_CR3_DMAR;                      // enable DMA serial recieve
+    DMA1_Stream5->PAR = (uint32_t)&USART2->DR;          // transfer data from UART DR
+    DMA1_Stream5->M0AR = (uint32_t)buf;          // transfer data to rx buffer
+    DMA1_Stream5->CR |= (4<<25);                       // select channel 5 on stream 5
+    DMA1_Stream5->NDTR = BUF_SIZE;                           // tranfer full buffer of datas
+    DMA1_Stream5->CR |= DMA_SxCR_MINC;
+    NVIC_EnableIRQ(DMA1_Stream5_IRQn);                 //enable interrupts?
+    DMA1_Stream5->CR |= DMA_SxCR_TCIE;                 //enable transfer complete interrupt
+    DMA1_Stream5->CR |= DMA_SxCR_HTIE;                 //enable half tranfer interrupt
+    DMA1_Stream5->CR |= DMA_SxCR_CIRC;                   //enable circular mode
+    DMA1_Stream5->CR |= DMA_SxCR_EN;                   //enable DMA
+    pc.printf("DMA Enabled\r\n");
+
+    if(serial4.readable()) { }  //necessary to make things work
+    
+
     for (;;) {
-        int length = end - start;
-        if (length < 0) length += BUF_SIZE;
-        if (length >= CHUNK_SIZE) {
-            //fwrite(hdr, 1, HEADER_SIZE, fp);
-            if (start+CHUNK_SIZE-1 < BUF_SIZE) {
-                fwrite(buf+start, 1, CHUNK_SIZE, fp);
-            } else {
-                fwrite(buf+start, 1, BUF_SIZE-start+1, fp);
-                fwrite(buf, 1, CHUNK_SIZE-(BUF_SIZE-start+1), fp);
-            }
-            fflush(fp);
-            start += CHUNK_SIZE;
-            if (start >= BUF_SIZE) start -= BUF_SIZE;
-        }
-    }
+        
+        
+ 
+    }  
 }
  
+
  
\ No newline at end of file