Used with eeprom_flash to write network configuration to STM32F103 flash

Dependents:   F103-Web-Server

Fork of my_eeprom_funcs by Chau Vo

Revision:
1:6bdc99dd8e0a
Child:
2:57d40eaa1b1b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/my_eeprom_funcs.cpp	Sun Sep 28 17:35:07 2014 +0000
@@ -0,0 +1,191 @@
+#include "mbed.h"
+#include "my_eeprom_funcs.h"
+
+
+/*
+* EEPROM functions
+*/
+void write_eeprom_network(char *buf) {
+    // Write network configuration
+    // 4-byte IP address + 4-byte subnet + 4-byte gateway + 3-byte MAC
+    
+    printf("Saving network configuration for this device...\r\n");
+    
+    // Unlock the Flash Program Erase controller */
+    FLASH_Unlock();
+    // EEPROM Init
+    EE_Init();
+    // IP address
+    EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+0], *buf++);
+    EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+1], *buf++);
+    EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+2], *buf++);
+    EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+3], *buf++);
+    
+    // IP subnet
+    EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+0], *buf++);
+    EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+1], *buf++);
+    EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+2], *buf++);
+    EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+3], *buf++);
+    
+    // IP gateway
+    EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+0], *buf++);
+    EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+1], *buf++);
+    EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+2], *buf++);
+    EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+3], *buf++);
+    
+    //// TCP server port, not used
+    //EE_WriteVariable(VirtAddVarTab[TCP_SERVER_LOCAL_PORT_POS], *buf++);
+    //// UDP server port, not used
+    //EE_WriteVariable(VirtAddVarTab[UDP_SERVER_LOCAL_PORT_POS], *buf++);
+    
+    // erase first_run flag
+    EE_WriteVariable(VirtAddVarTab[FIRST_RUN_FLAG_POS], 0xA5A5);
+    
+    // MAC address
+    EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+0], *buf++);
+    EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+1], *buf++);
+    EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+2], *buf++);
+    FLASH_Lock();
+    
+    printf("Success\r\n");
+}
+
+void load_eeprom_network(void) {
+    mbed_mac_address((char *)u8mac);
+    
+    printf("Loading network configuration...\r\n");
+    
+    EE_Init();
+    
+    // check if 1st run
+    EE_ReadVariable(VirtAddVarTab[FIRST_RUN_FLAG_POS], &first_run);
+    // if not first run, load network config
+    if (first_run == 0xA5A5) {
+        printf("User settings\r\n");
+        
+        // IP address
+        EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+0], &u16ip_addr[0]);
+        EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+1], &u16ip_addr[1]);
+        EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+2], &u16ip_addr[2]);
+        EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+3], &u16ip_addr[3]);
+        u8ip_addr[0] = (uint8_t)(u16ip_addr[0] & 0x00FF);
+        u8ip_addr[1] = (uint8_t)(u16ip_addr[1] & 0x00FF);
+        u8ip_addr[2] = (uint8_t)(u16ip_addr[2] & 0x00FF);
+        u8ip_addr[3] = (uint8_t)(u16ip_addr[3] & 0x00FF);
+        
+        // IP subnet
+        EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+0], &u16ip_subnet[0]);
+        EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+1], &u16ip_subnet[1]);
+        EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+2], &u16ip_subnet[2]);
+        EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+3], &u16ip_subnet[3]);
+        
+        // IP gateway
+        EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+0], &u16ip_gateway[0]);
+        EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+1], &u16ip_gateway[1]);
+        EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+2], &u16ip_gateway[2]);
+        EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+3], &u16ip_gateway[3]);
+        
+        //// TCP server port
+        //EE_ReadVariable(VirtAddVarTab[TCP_SERVER_LOCAL_PORT_POS], &tcp_server_port);
+        //// UDP server port
+        //EE_ReadVariable(VirtAddVarTab[UDP_SERVER_LOCAL_PORT_POS], &udp_server_port);
+        
+        // First run flag, already read above
+
+        // MAC address
+        EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+0], &u16mac_addr[0]);
+        EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+1], &u16mac_addr[1]);
+        EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+2], &u16mac_addr[2]);
+        u8mac[0] = DEFAULT_MAC0; u8mac[1] = DEFAULT_MAC1; u8mac[2] = DEFAULT_MAC2;
+        u8mac[3] = (uint8_t)(u16mac_addr[0] & 0x00FF);
+        u8mac[4] = (uint8_t)(u16mac_addr[1] & 0x00FF);
+        u8mac[5] = (uint8_t)(u16mac_addr[2] & 0x00FF);
+        //FLASH_Lock();
+        
+        sprintf(str_ip_addr, "%d.%d.%d.%d", u8ip_addr[0], u8ip_addr[1], u8ip_addr[2], u8ip_addr[3]);
+        sprintf(str_ip_subnet, "%d.%d.%d.%d", (uint8_t)u16ip_subnet[0], (uint8_t)u16ip_subnet[1], (uint8_t)u16ip_subnet[2], (uint8_t)u16ip_subnet[3]);
+        sprintf(str_ip_gateway, "%d.%d.%d.%d", (uint8_t)u16ip_gateway[0], (uint8_t)u16ip_gateway[1], (uint8_t)u16ip_gateway[2], (uint8_t)u16ip_gateway[3]);
+    }
+    // if 1st run, use default addresses
+    else {
+        printf("No user settings, load defaults\r\n");
+        u8mac[0] = DEFAULT_MAC0; u8mac[1] = DEFAULT_MAC1; u8mac[2] = DEFAULT_MAC2;
+        u8mac[3] = DEFAULT_MAC3; u8mac[4] = DEFAULT_MAC4; u8mac[5] = DEFAULT_MAC5; 
+        sprintf(str_ip_addr, DEFAULT_IP_ADDRESS);
+        sprintf(str_ip_subnet, DEFAULT_IP_SUBNET);
+        sprintf(str_ip_gateway, DEFAULT_IP_GATEWAY);
+    }
+    
+    printf("Success\r\n");
+    printf("IP: %s\r\n", str_ip_addr);
+    printf("MASK: %s\r\n", str_ip_subnet);
+    printf("GW: %s\r\n", str_ip_gateway);
+    printf("TCP server: %d\r\n", tcp_server_local_port);
+    printf("UDP server: %d\r\n", udp_server_local_port);
+}
+
+
+/*
+* TCP server info, only when this device in TCP client mode
+* This device auto transmits data to TCP server
+*/
+void write_eeprom_tcpserver(char* buf) {
+    // Write network configuration
+    // 4-byte IP address + 4-byte subnet + 4-byte gateway + 3-byte MAC
+    
+    printf("Saving TCP server info\r\n");
+    
+    // Unlock the Flash Program Erase controller
+    FLASH_Unlock();
+    // EEPROM Init
+    EE_Init();
+    
+    // Auto transmit
+    EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], *buf++);
+    EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_TIME_PERIOD_POS], *buf++);
+    // IP address
+    EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+0], *buf++);
+    EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+1], *buf++);
+    EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+2], *buf++);
+    EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+3], *buf++);
+    // TCP server port
+    EE_WriteVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], *buf);
+    
+    FLASH_Lock();
+    
+    printf("Success\r\n");
+}
+
+void load_eeprom_tcpserver(void) {
+    printf("Loading tcp server info...\r\n");
+    
+    EE_Init();
+    
+    // check if 1st run
+    EE_ReadVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], &auto_transmit_flag);
+    // if not auto transmit, exit
+    if (auto_transmit_flag == 0xA5A5) {
+        // Time period for transmitting to server
+        EE_ReadVariable(VirtAddVarTab[AUTO_TRANSMIT_TIME_PERIOD_POS], &transmit_time_period);
+        // IP address
+        EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+0], &u16server_ip_addr[0]);
+        EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+1], &u16server_ip_addr[1]);
+        EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+2], &u16server_ip_addr[2]);
+        EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+3], &u16server_ip_addr[3]);
+        u8server_ip_addr[0] = (uint8_t)(u16server_ip_addr[0] & 0x00FF);
+        u8server_ip_addr[1] = (uint8_t)(u16server_ip_addr[1] & 0x00FF);
+        u8server_ip_addr[2] = (uint8_t)(u16server_ip_addr[2] & 0x00FF);
+        u8server_ip_addr[3] = (uint8_t)(u16server_ip_addr[3] & 0x00FF);
+        
+        // TCP server port
+        EE_ReadVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], &u16tcp_server_port);
+        
+        sprintf(str_server_ip_addr, "%d.%d.%d.%d", u8server_ip_addr[0], u8server_ip_addr[1], u8server_ip_addr[2], u8server_ip_addr[3]);
+    }
+    // if 1st run, use default addresses
+    else {
+        printf("No tcp server requirement\r\n");
+    }
+    
+    printf("Done checking tcp server info.\r\n");
+}
\ No newline at end of file