Used with eeprom_flash to write network configuration to STM32F103 flash
Fork of my_eeprom_funcs by
Diff: my_eeprom_funcs.cpp
- 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