Used with eeprom_flash to write network configuration to STM32F103 flash
Fork of my_eeprom_funcs by
my_eeprom_funcs.cpp
- Committer:
- olympux
- Date:
- 2014-10-04
- Revision:
- 4:944a4646b825
- Parent:
- 3:69e1c4ed69e1
- Child:
- 5:eea03d0eb95a
File content as of revision 4:944a4646b825:
#include "mbed.h" #include "my_eeprom_funcs.h" //Debug is disabled by default #if 1 //Enable debug #include <cstdio> #define DBG(x, ...) std::printf("[eeprom : DBG]"x"\r\n", ##__VA_ARGS__); #define WARN(x, ...) std::printf("[eeprom : WARN]"x"\r\n", ##__VA_ARGS__); #define ERR(x, ...) std::printf("[eeprom : ERR]"x"\r\n", ##__VA_ARGS__); #else //Disable debug #define DBG(x, ...) #define WARN(x, ...) #define ERR(x, ...) #endif /* * EEPROM functions */ void write_eeprom_network(char *buf) { // Write network configuration // 4-byte IP address + 4-byte subnet + 4-byte gateway + 3-byte MAC DBG("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(); DBG("Success\r\n"); } void load_eeprom_network(void) { mbed_mac_address((char *)u8mac); DBG("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) { DBG("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_local_port); //// UDP server port //EE_ReadVariable(VirtAddVarTab[UDP_SERVER_LOCAL_PORT_POS], &udp_server_local_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 { DBG("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); } DBG("Success\r\n"); DBG("IP: %s\r\n", str_ip_addr); DBG("MASK: %s\r\n", str_ip_subnet); DBG("GW: %s\r\n", str_ip_gateway); DBG("TCP server local port: %d\r\n", tcp_server_local_port); DBG("UDP server local port: %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 // 1-byte Auto transmit flag + 1-byte Auto transmit period + 4-byte TCP server IP address + 2-byte TCP server port (LSB msb) DBG("Saving TCP server info\r\n"); // Unlock the Flash Program Erase controller FLASH_Unlock(); // EEPROM Init EE_Init(); // Auto transmit if (*buf == 'Y') EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], 0xA5A5); else EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], 0xAAAA); 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 uint16_t port; memcpy(&port, buf, 2); EE_WriteVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], port); FLASH_Lock(); DBG("Success\r\n"); } void load_eeprom_tcpserver(void) { DBG("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 { DBG("No tcp server required\r\n"); } DBG("Update every %ds to TCP server %s on port %d\r\n", transmit_time_period, str_server_ip_addr, u16tcp_server_port); }