Used with eeprom_flash to write network configuration to STM32F103 flash

Dependents:   F103-Web-Server

Fork of my_eeprom_funcs by Chau Vo

Committer:
olympux
Date:
Fri Oct 24 21:27:52 2014 +0000
Revision:
6:241d1539914a
Parent:
5:eea03d0eb95a
Child:
7:60f87ff3da60
Code improvements

Who changed what in which revision?

UserRevisionLine numberNew contents of line
olympux 1:6bdc99dd8e0a 1 #include "mbed.h"
olympux 1:6bdc99dd8e0a 2 #include "my_eeprom_funcs.h"
olympux 1:6bdc99dd8e0a 3
olympux 1:6bdc99dd8e0a 4
olympux 4:944a4646b825 5 //Debug is disabled by default
olympux 4:944a4646b825 6 #if 1
olympux 4:944a4646b825 7 //Enable debug
olympux 4:944a4646b825 8 #include <cstdio>
olympux 4:944a4646b825 9 #define DBG(x, ...) std::printf("[eeprom : DBG]"x"\r\n", ##__VA_ARGS__);
olympux 4:944a4646b825 10 #define WARN(x, ...) std::printf("[eeprom : WARN]"x"\r\n", ##__VA_ARGS__);
olympux 4:944a4646b825 11 #define ERR(x, ...) std::printf("[eeprom : ERR]"x"\r\n", ##__VA_ARGS__);
olympux 4:944a4646b825 12
olympux 4:944a4646b825 13 #else
olympux 4:944a4646b825 14 //Disable debug
olympux 4:944a4646b825 15 #define DBG(x, ...)
olympux 4:944a4646b825 16 #define WARN(x, ...)
olympux 4:944a4646b825 17 #define ERR(x, ...)
olympux 4:944a4646b825 18
olympux 4:944a4646b825 19 #endif
olympux 4:944a4646b825 20
olympux 4:944a4646b825 21
olympux 1:6bdc99dd8e0a 22 /*
olympux 1:6bdc99dd8e0a 23 * EEPROM functions
olympux 1:6bdc99dd8e0a 24 */
olympux 1:6bdc99dd8e0a 25 void write_eeprom_network(char *buf) {
olympux 1:6bdc99dd8e0a 26 // Write network configuration
olympux 1:6bdc99dd8e0a 27 // 4-byte IP address + 4-byte subnet + 4-byte gateway + 3-byte MAC
olympux 1:6bdc99dd8e0a 28
olympux 5:eea03d0eb95a 29 DBG("Saving network configuration for this device...");
olympux 1:6bdc99dd8e0a 30
olympux 1:6bdc99dd8e0a 31 // Unlock the Flash Program Erase controller */
olympux 1:6bdc99dd8e0a 32 FLASH_Unlock();
olympux 1:6bdc99dd8e0a 33 // EEPROM Init
olympux 1:6bdc99dd8e0a 34 EE_Init();
olympux 6:241d1539914a 35
olympux 6:241d1539914a 36 // erase first_run flag
olympux 6:241d1539914a 37 EE_WriteVariable(VirtAddVarTab[FIRST_RUN_FLAG_POS], DEFAULT_ENABLE_FLAG_VALUE);
olympux 6:241d1539914a 38
olympux 1:6bdc99dd8e0a 39 // IP address
olympux 1:6bdc99dd8e0a 40 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 41 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 42 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 43 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+3], *buf++);
olympux 1:6bdc99dd8e0a 44
olympux 1:6bdc99dd8e0a 45 // IP subnet
olympux 1:6bdc99dd8e0a 46 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 47 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 48 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 49 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+3], *buf++);
olympux 1:6bdc99dd8e0a 50
olympux 1:6bdc99dd8e0a 51 // IP gateway
olympux 1:6bdc99dd8e0a 52 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 53 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 54 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 55 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+3], *buf++);
olympux 1:6bdc99dd8e0a 56
olympux 1:6bdc99dd8e0a 57 //// TCP server port, not used
olympux 1:6bdc99dd8e0a 58 //EE_WriteVariable(VirtAddVarTab[TCP_SERVER_LOCAL_PORT_POS], *buf++);
olympux 1:6bdc99dd8e0a 59 //// UDP server port, not used
olympux 1:6bdc99dd8e0a 60 //EE_WriteVariable(VirtAddVarTab[UDP_SERVER_LOCAL_PORT_POS], *buf++);
olympux 1:6bdc99dd8e0a 61
olympux 1:6bdc99dd8e0a 62 // MAC address
olympux 1:6bdc99dd8e0a 63 EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 64 EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 65 EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 66 FLASH_Lock();
olympux 1:6bdc99dd8e0a 67
olympux 6:241d1539914a 68 DBG("Successful");
olympux 1:6bdc99dd8e0a 69 }
olympux 1:6bdc99dd8e0a 70
olympux 1:6bdc99dd8e0a 71 void load_eeprom_network(void) {
olympux 1:6bdc99dd8e0a 72 mbed_mac_address((char *)u8mac);
olympux 1:6bdc99dd8e0a 73
olympux 5:eea03d0eb95a 74 DBG("Loading network configuration...");
olympux 1:6bdc99dd8e0a 75
olympux 1:6bdc99dd8e0a 76 EE_Init();
olympux 1:6bdc99dd8e0a 77
olympux 1:6bdc99dd8e0a 78 // check if 1st run
olympux 1:6bdc99dd8e0a 79 EE_ReadVariable(VirtAddVarTab[FIRST_RUN_FLAG_POS], &first_run);
olympux 1:6bdc99dd8e0a 80 // if not first run, load network config
olympux 6:241d1539914a 81 if (first_run == DEFAULT_ENABLE_FLAG_VALUE) {
olympux 5:eea03d0eb95a 82 DBG("User settings");
olympux 1:6bdc99dd8e0a 83
olympux 1:6bdc99dd8e0a 84 // IP address
olympux 1:6bdc99dd8e0a 85 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+0], &u16ip_addr[0]);
olympux 1:6bdc99dd8e0a 86 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+1], &u16ip_addr[1]);
olympux 1:6bdc99dd8e0a 87 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+2], &u16ip_addr[2]);
olympux 1:6bdc99dd8e0a 88 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+3], &u16ip_addr[3]);
olympux 1:6bdc99dd8e0a 89 u8ip_addr[0] = (uint8_t)(u16ip_addr[0] & 0x00FF);
olympux 1:6bdc99dd8e0a 90 u8ip_addr[1] = (uint8_t)(u16ip_addr[1] & 0x00FF);
olympux 1:6bdc99dd8e0a 91 u8ip_addr[2] = (uint8_t)(u16ip_addr[2] & 0x00FF);
olympux 1:6bdc99dd8e0a 92 u8ip_addr[3] = (uint8_t)(u16ip_addr[3] & 0x00FF);
olympux 1:6bdc99dd8e0a 93
olympux 1:6bdc99dd8e0a 94 // IP subnet
olympux 1:6bdc99dd8e0a 95 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+0], &u16ip_subnet[0]);
olympux 1:6bdc99dd8e0a 96 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+1], &u16ip_subnet[1]);
olympux 1:6bdc99dd8e0a 97 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+2], &u16ip_subnet[2]);
olympux 1:6bdc99dd8e0a 98 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+3], &u16ip_subnet[3]);
olympux 1:6bdc99dd8e0a 99
olympux 1:6bdc99dd8e0a 100 // IP gateway
olympux 1:6bdc99dd8e0a 101 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+0], &u16ip_gateway[0]);
olympux 1:6bdc99dd8e0a 102 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+1], &u16ip_gateway[1]);
olympux 1:6bdc99dd8e0a 103 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+2], &u16ip_gateway[2]);
olympux 1:6bdc99dd8e0a 104 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+3], &u16ip_gateway[3]);
olympux 1:6bdc99dd8e0a 105
olympux 1:6bdc99dd8e0a 106 //// TCP server port
olympux 2:57d40eaa1b1b 107 //EE_ReadVariable(VirtAddVarTab[TCP_SERVER_LOCAL_PORT_POS], &tcp_server_local_port);
olympux 1:6bdc99dd8e0a 108 //// UDP server port
olympux 2:57d40eaa1b1b 109 //EE_ReadVariable(VirtAddVarTab[UDP_SERVER_LOCAL_PORT_POS], &udp_server_local_port);
olympux 1:6bdc99dd8e0a 110
olympux 1:6bdc99dd8e0a 111 // MAC address
olympux 1:6bdc99dd8e0a 112 EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+0], &u16mac_addr[0]);
olympux 1:6bdc99dd8e0a 113 EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+1], &u16mac_addr[1]);
olympux 1:6bdc99dd8e0a 114 EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+2], &u16mac_addr[2]);
olympux 1:6bdc99dd8e0a 115 u8mac[0] = DEFAULT_MAC0; u8mac[1] = DEFAULT_MAC1; u8mac[2] = DEFAULT_MAC2;
olympux 1:6bdc99dd8e0a 116 u8mac[3] = (uint8_t)(u16mac_addr[0] & 0x00FF);
olympux 1:6bdc99dd8e0a 117 u8mac[4] = (uint8_t)(u16mac_addr[1] & 0x00FF);
olympux 1:6bdc99dd8e0a 118 u8mac[5] = (uint8_t)(u16mac_addr[2] & 0x00FF);
olympux 1:6bdc99dd8e0a 119 //FLASH_Lock();
olympux 1:6bdc99dd8e0a 120
olympux 1:6bdc99dd8e0a 121 sprintf(str_ip_addr, "%d.%d.%d.%d", u8ip_addr[0], u8ip_addr[1], u8ip_addr[2], u8ip_addr[3]);
olympux 1:6bdc99dd8e0a 122 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]);
olympux 1:6bdc99dd8e0a 123 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]);
olympux 1:6bdc99dd8e0a 124 }
olympux 1:6bdc99dd8e0a 125 // if 1st run, use default addresses
olympux 1:6bdc99dd8e0a 126 else {
olympux 5:eea03d0eb95a 127 DBG("No user settings, load defaults");
olympux 1:6bdc99dd8e0a 128 u8mac[0] = DEFAULT_MAC0; u8mac[1] = DEFAULT_MAC1; u8mac[2] = DEFAULT_MAC2;
olympux 1:6bdc99dd8e0a 129 u8mac[3] = DEFAULT_MAC3; u8mac[4] = DEFAULT_MAC4; u8mac[5] = DEFAULT_MAC5;
olympux 1:6bdc99dd8e0a 130 sprintf(str_ip_addr, DEFAULT_IP_ADDRESS);
olympux 1:6bdc99dd8e0a 131 sprintf(str_ip_subnet, DEFAULT_IP_SUBNET);
olympux 1:6bdc99dd8e0a 132 sprintf(str_ip_gateway, DEFAULT_IP_GATEWAY);
olympux 1:6bdc99dd8e0a 133 }
olympux 1:6bdc99dd8e0a 134
olympux 6:241d1539914a 135 DBG("Successful");
olympux 5:eea03d0eb95a 136 DBG("IP: %s", str_ip_addr);
olympux 5:eea03d0eb95a 137 DBG("MASK: %s", str_ip_subnet);
olympux 5:eea03d0eb95a 138 DBG("GW: %s", str_ip_gateway);
olympux 5:eea03d0eb95a 139 DBG("TCP server local port: %d", tcp_server_local_port);
olympux 5:eea03d0eb95a 140 DBG("UDP server local port: %d", udp_server_local_port);
olympux 1:6bdc99dd8e0a 141 }
olympux 1:6bdc99dd8e0a 142
olympux 1:6bdc99dd8e0a 143
olympux 1:6bdc99dd8e0a 144 /*
olympux 6:241d1539914a 145 * TCP server setting, only when this device in TCP client mode
olympux 1:6bdc99dd8e0a 146 * This device auto transmits data to TCP server
olympux 1:6bdc99dd8e0a 147 */
olympux 1:6bdc99dd8e0a 148 void write_eeprom_tcpserver(char* buf) {
olympux 1:6bdc99dd8e0a 149 // Write network configuration
olympux 2:57d40eaa1b1b 150 // 1-byte Auto transmit flag + 1-byte Auto transmit period + 4-byte TCP server IP address + 2-byte TCP server port (LSB msb)
olympux 1:6bdc99dd8e0a 151
olympux 6:241d1539914a 152 DBG("Saving TCP server settings...");
olympux 1:6bdc99dd8e0a 153
olympux 1:6bdc99dd8e0a 154 // Unlock the Flash Program Erase controller
olympux 1:6bdc99dd8e0a 155 FLASH_Unlock();
olympux 1:6bdc99dd8e0a 156 // EEPROM Init
olympux 1:6bdc99dd8e0a 157 EE_Init();
olympux 1:6bdc99dd8e0a 158
olympux 6:241d1539914a 159 // Auto transmit flag
olympux 5:eea03d0eb95a 160 if (*buf == 'Y') {
olympux 6:241d1539914a 161 EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], DEFAULT_ENABLE_FLAG_VALUE);
olympux 6:241d1539914a 162 //EE_WriteVariable(VirtAddVarTab[ENABLE_TCP_CLIENT], DEFAULT_ENABLE_FLAG_VALUE); // enable TCP client
olympux 6:241d1539914a 163 //EE_WriteVariable(VirtAddVarTab[ENABLE_TCP_SERVER], DEFAULT_DISABLE_FLAG_VALUE); // disable TCP server
olympux 5:eea03d0eb95a 164 }
olympux 5:eea03d0eb95a 165 else {
olympux 6:241d1539914a 166 EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], DEFAULT_DISABLE_FLAG_VALUE);
olympux 6:241d1539914a 167 //EE_WriteVariable(VirtAddVarTab[ENABLE_TCP_CLIENT], DEFAULT_DISABLE_FLAG_VALUE); // disable TCP client
olympux 6:241d1539914a 168 //EE_WriteVariable(VirtAddVarTab[ENABLE_TCP_SERVER], DEFAULT_ENABLE_FLAG_VALUE); // enable TCP server
olympux 5:eea03d0eb95a 169 }
olympux 3:69e1c4ed69e1 170 buf++;
olympux 6:241d1539914a 171 // Auto transmit period
olympux 1:6bdc99dd8e0a 172 EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_TIME_PERIOD_POS], *buf++);
olympux 1:6bdc99dd8e0a 173 // IP address
olympux 1:6bdc99dd8e0a 174 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 175 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 176 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 177 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+3], *buf++);
olympux 1:6bdc99dd8e0a 178 // TCP server port
olympux 2:57d40eaa1b1b 179 uint16_t port;
olympux 2:57d40eaa1b1b 180 memcpy(&port, buf, 2);
olympux 2:57d40eaa1b1b 181 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], port);
olympux 1:6bdc99dd8e0a 182
olympux 1:6bdc99dd8e0a 183 FLASH_Lock();
olympux 1:6bdc99dd8e0a 184
olympux 6:241d1539914a 185 DBG("Successful");
olympux 1:6bdc99dd8e0a 186 }
olympux 1:6bdc99dd8e0a 187
olympux 1:6bdc99dd8e0a 188 void load_eeprom_tcpserver(void) {
olympux 5:eea03d0eb95a 189 DBG("Checking auto update mode...");
olympux 1:6bdc99dd8e0a 190
olympux 1:6bdc99dd8e0a 191 EE_Init();
olympux 1:6bdc99dd8e0a 192
olympux 1:6bdc99dd8e0a 193 // check if 1st run
olympux 1:6bdc99dd8e0a 194 EE_ReadVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], &auto_transmit_flag);
olympux 1:6bdc99dd8e0a 195 // if not auto transmit, exit
olympux 6:241d1539914a 196 if (auto_transmit_flag == DEFAULT_ENABLE_FLAG_VALUE) {
olympux 1:6bdc99dd8e0a 197 // Time period for transmitting to server
olympux 1:6bdc99dd8e0a 198 EE_ReadVariable(VirtAddVarTab[AUTO_TRANSMIT_TIME_PERIOD_POS], &transmit_time_period);
olympux 6:241d1539914a 199 // TCP server/client enable flags, not in used
olympux 6:241d1539914a 200 //EE_ReadVariable(VirtAddVarTab[ENABLE_TCP_CLIENT], &u16enable_tcp_client);
olympux 6:241d1539914a 201 //EE_ReadVariable(VirtAddVarTab[ENABLE_TCP_SERVER], &u16enable_tcp_server);
olympux 1:6bdc99dd8e0a 202 // IP address
olympux 1:6bdc99dd8e0a 203 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+0], &u16server_ip_addr[0]);
olympux 1:6bdc99dd8e0a 204 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+1], &u16server_ip_addr[1]);
olympux 1:6bdc99dd8e0a 205 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+2], &u16server_ip_addr[2]);
olympux 1:6bdc99dd8e0a 206 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+3], &u16server_ip_addr[3]);
olympux 1:6bdc99dd8e0a 207 u8server_ip_addr[0] = (uint8_t)(u16server_ip_addr[0] & 0x00FF);
olympux 1:6bdc99dd8e0a 208 u8server_ip_addr[1] = (uint8_t)(u16server_ip_addr[1] & 0x00FF);
olympux 1:6bdc99dd8e0a 209 u8server_ip_addr[2] = (uint8_t)(u16server_ip_addr[2] & 0x00FF);
olympux 1:6bdc99dd8e0a 210 u8server_ip_addr[3] = (uint8_t)(u16server_ip_addr[3] & 0x00FF);
olympux 1:6bdc99dd8e0a 211 // TCP server port
olympux 1:6bdc99dd8e0a 212 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], &u16tcp_server_port);
olympux 1:6bdc99dd8e0a 213
olympux 1:6bdc99dd8e0a 214 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]);
olympux 6:241d1539914a 215 DBG("Enabled auto update, module is a TCP client");
olympux 5:eea03d0eb95a 216 DBG("Update every %ds to TCP server %s on port %d", transmit_time_period, str_server_ip_addr, u16tcp_server_port);
olympux 1:6bdc99dd8e0a 217 }
olympux 1:6bdc99dd8e0a 218 // if 1st run, use default addresses
olympux 1:6bdc99dd8e0a 219 else {
olympux 5:eea03d0eb95a 220 DBG("No auto update");
olympux 6:241d1539914a 221 DBG("Module is not a TCP client");
olympux 6:241d1539914a 222 //u16enable_tcp_client = 0xAAAA; // disable TCP client
olympux 6:241d1539914a 223 //u16enable_tcp_server = 0xA5A5; // enable TCP server
olympux 1:6bdc99dd8e0a 224 }
olympux 1:6bdc99dd8e0a 225 }