diff --git a/Makefile b/Makefile index 753d904baabd65d977832f321cc6ef1f80f9cbe2..f643b3f3d573650f3156b898249b8190008cce89 100755 --- a/Makefile +++ b/Makefile @@ -5,8 +5,10 @@ PROJECT_NAME=battery_charger TARGET_FILES=$(wildcard src/*.c) TARGET_PROCESSOR=STM32L051C8 -HAL_PATH=$(HOME)/humanoids/stm32_hal/l0 -STM32_LIB_PATH=$(HOME)/humanoids/stm32_libraries +STM32_HAL_PATH=./stm32_hal +STM32_LIB_PATH=./stm32_libraries + +HAL_PATH=$(STM32_HAL_PATH)/l0 include $(HAL_PATH)/select_processor.mk @@ -16,14 +18,16 @@ BUILD_PATH=build UTILS_PATH=$(STM32_LIB_PATH)/utils COMM_PATH=$(STM32_LIB_PATH)/comm USART_PATH=$(STM32_LIB_PATH)/l0/usart +MEMORY_PATH=$(STM32_LIB_PATH)/memory DYNAMIXEL_PATH=$(STM32_LIB_PATH)/dynamixel_base +SCHEDULER_PATH=$(STM32_LIB_PATH)/scheduler COMPILE_OPTS = -mlittle-endian -mcpu=cortex-m0plus -mthumb -mthumb-interwork -COMPILE_OPTS += -Wall -O2 -fno-common -#COMPILE_OPTS += -Wall -fno-common -COMPILE_OPTS += -ffreestanding -nostdlib -D$(PROCESSOR_MACRO) -INCLUDE_DIRS = -I$(HAL_PATH)/include -I$(HAL_PATH)/include/core -I$(HAL_PATH)/include/devices -I./include -INCLUDE_DIRS += -I$(UTILS_PATH)/include -I$(COMM_PATH)/include -I$(DYNAMIXEL_PATH)/include -I$(USART_PATH)/include +COMPILE_OPTS += -Wall -O2 -fno-common -DUSE_HAL_DRIVER +#COMPILE_OPTS += -Wall -fno-common -DUSE_HAL_DRIVER +COMPILE_OPTS += -ffreestanding -nostdlib -D$(PROCESSOR_MACRO) -DHSE_VALUE=8000000 -imacros ./include/battery_charger_conf.h +INCLUDE_DIRS = -I$(HAL_PATH)/include -I$(HAL_PATH)/include/core -I$(HAL_PATH)/include/devices +INCLUDE_DIRS += -I$(UTILS_PATH)/include -I$(COMM_PATH)/include -I$(MEMORY_PATH)/include -I$(DYNAMIXEL_PATH)/include -I$(USART_PATH)/include -I$(SCHEDULER_PATH)/include -I./include TCHAIN_PREFIX=arm-none-eabi- @@ -35,7 +39,6 @@ ASFLAGS = $(COMPILE_OPTS) -c LD = $(TCHAIN_PREFIX)gcc LDFLAGS = -mthumb -mcpu=cortex-m0plus -Wl,-Map=$@.map,-cref $(INCLUDE_DIRS) -T $(STM32_LINKER_SCRIPTS_PATH)/$(LINKER_SCRIPT_FILE) --specs=nosys.specs -EXT_LIB = $(COMM_PATH)/lib/comm_m0plus.a $(UTILS_PATH)/lib/utils_m0plus.a OBJCP = $(TCHAIN_PREFIX)objcopy OBJCPFLAGS_HEX = -O ihex @@ -67,10 +70,14 @@ TARGET_FILES+=$(HAL_PATH)/src/stm32l0xx_hal_cortex.c TARGET_FILES+=$(USART_PATH)/src/usart1.c -# dynamixel files -TARGET_FILES+=$(DYNAMIXEL_PATH)/src/dynamixel.c -TARGET_FILES+=$(DYNAMIXEL_PATH)/src/dynamixel2.c -TARGET_FILES+=$(DYNAMIXEL_PATH)/src/dynamixel_slave.c +TARGET_FILES+=$(wildcard $(UTILS_PATH)/src/*.c) +TARGET_FILES+=$(wildcard $(COMM_PATH)/src/*.c) +TARGET_FILES+=$(wildcard $(MEMORY_PATH)/src/*.c) +TARGET_FILES+=$(DYNAMIXEL_PATH)/src/dynamixel2.c +TARGET_FILES+=$(DYNAMIXEL_PATH)/src/dynamixel.c +TARGET_FILES+=$(DYNAMIXEL_PATH)/src/dynamixel_slave.c +TARGET_FILES+=$(DYNAMIXEL_PATH)/src/dynamixel_slave_device.c +TARGET_FILES+=$(wildcard $(SCHEDULER_PATH)/src/*.c) BATTERY_OBJS_TMP = $(notdir $(TARGET_FILES:.c=.o)) BATTERY_OBJS = $(patsubst %,$(BUILD_PATH)/%,$(BATTERY_OBJS_TMP)) @@ -88,11 +95,19 @@ $(BUILD_PATH)/%.o: $(HAL_PATH)/src/%.c $(CC) -c $(CFLAGS) -o $@ $< $(BUILD_PATH)/%.o: $(USART_PATH)/src/%.c $(CC) -c $(CFLAGS) -o $@ $< +$(BUILD_PATH)/%.o: $(UTILS_PATH)/src/%.c + $(CC) -c $(CFLAGS) -o $@ $< +$(BUILD_PATH)/%.o: $(COMM_PATH)/src/%.c + $(CC) -c $(CFLAGS) -o $@ $< +$(BUILD_PATH)/%.o: $(MEMORY_PATH)/src/%.c + $(CC) -c $(CFLAGS) -o $@ $< $(BUILD_PATH)/%.o: $(DYNAMIXEL_PATH)/src/%.c $(CC) -c $(CFLAGS) -o $@ $< +$(BUILD_PATH)/%.o: $(SCHEDULER_PATH)/src/%.c + $(CC) -c $(CFLAGS) -o $@ $< $(MAIN_OUT_ELF): mkdir_build $(BATTERY_OBJS) $(BUID_PATH)/$(STARTUP_FILE:.s=.o) - $(LD) $(LDFLAGS) $(BATTERY_OBJS) $(BUILD_PATH)/$(STARTUP_FILE:.s=.o) $(EXT_LIB) --output $@ + $(LD) $(LDFLAGS) $(BATTERY_OBJS) $(BUILD_PATH)/$(STARTUP_FILE:.s=.o) --output $@ $(MAIN_OUT_HEX): $(MAIN_OUT_ELF) $(OBJCP) $(OBJCPFLAGS_HEX) $< $@ diff --git a/include/battery_charger_conf.h b/include/battery_charger_conf.h new file mode 100644 index 0000000000000000000000000000000000000000..ea087add5651b7561447c8b673efe81b62a4446a --- /dev/null +++ b/include/battery_charger_conf.h @@ -0,0 +1,54 @@ +#ifndef _BATTERY_CHARGER_CONF_H +#define _BATTERY_CHARGER_CONF_H + +#define RAM_SIZE 128 +#define EEPROM_SIZE 32 + +/* Dynamixel slave configuration */ +#define EEPROM_DYN_SLAVE_BASE_ADDRESS1 ((unsigned short int)0x0000) +#define EEPROM_DYN_SLAVE_BASE_ADDRESS2 ((unsigned short int)0x0010) + +#define DEFAULT_DEVICE_MODEL 0x8000 +#define DEFAULT_FIRMWARE_VERSION 0x0001 +#define DEFAULT_DEVICE_ID 0x00C0 +#define DEFAULT_BAUDRATE 0x0001 +#define DEFAULT_RETURN_DELAY 0x0000 +#define DEFAULT_RETURN_LEVEL 0x0002 + +#define MAX_DYN_SLAVE_TX_BUFFER_LEN 256 +#define MAX_DYN_SLAVE_RX_BUFFER_LEN 256 +#define MAX_DYN_SLAVE_REG_BUFFER_LEN 256 +#define MAX_NUM_SLAVE_DEVICES 4 + +/* buzzer registers base address */ +#define RAM_BUZZER_BASE_ADDRESS ((unsigned short int)0x0020) +#define EEPROM_BUZZER_BASE_ADDRESS1 ((unsigned short int)0x0006) + +#define DEFAULT_WARNING_TIME_OFFSET 0x01 +#define DEFAULT_WARNING_TIME_HIST_OFFSET 0x01 +#define DEFAULT_WARNING_FREQ_OFFSET 0x01B8 +#define DEFAULT_WARNING_TIME_ON_OFFSET 0x0001 +#define DEFAULT_WARNING_TIME_OFF_OFFSET 0x001E + +#define EEPROM_BUZZER_BASE_ADDRESS2 ((unsigned short int)0x0011) + +#define DEFAULT_ERROR_TIME_OFFSET 0x05 +#define DEFAULT_ERROR_TIME_HIST_OFFSET 0x01 +#define DEFAULT_ERROR_FREQ_OFFSET 0x01B8 +#define DEFAULT_ERROR_TIME_ON_OFFSET 0x0001 +#define DEFAULT_ERROR_TIME_OFF_OFFSET 0x0005 + +/* buzzer registers base address */ +#define RAM_CHARGER_BASE_ADDRESS ((unsigned short int)0x004B) +#define EEPROM_CHARGER_BASE_ADDRESS1 ((unsigned short int)0x000E) + +#define DEFAULT_CHARGER_ADDR 0x12 +#define DEFAULT_FUEL_GAUGE_ADDR 0x16 + +#define EEPROM_CHARGER_BASE_ADDRESS2 ((unsigned short int)0x0019) + +#define DEFAULT_INPUT_MAX_CURRENT_OFFSET 0x1194 +#define DEFAULT_OUTPUT_CURRENT_OFFSET 0x03E8 +#define DEFAULT_OUTPUT_VOLTAGE_OFFSET 0x2EE0 + +#endif diff --git a/include/battery_dyn_slave.h b/include/battery_dyn_slave.h index 3c6c46b51f5d7bdb3a718468daa2442e0b23c1c0..1f196f93f945dab4333eed411a71587cb6b4c702 100644 --- a/include/battery_dyn_slave.h +++ b/include/battery_dyn_slave.h @@ -2,17 +2,13 @@ #define _BATTERY_DYN_SLAVE_H #include "stm32l0xx_hal.h" -#include "stm32_time.h" -#include "comm.h" - -#define MAX_DYN_SLAVE_TX_BUFFER_LEN 256 -#define MAX_DYN_SLAVE_RX_BUFFER_LEN 256 -#define MAX_DYN_SLAVE_REG_BUFFER_LEN 256 - #include "dynamixel_slave.h" +#include "dynamixel_slave_device.h" +#include "scheduler.h" +#include "memory.h" -extern TDynamixelSlave battery_dyn_slave; - -void battery_dyn_slave_init(void); +void battery_dyn_slave_init(TMemory **memory,TScheduler *scheduler); +void battery_dyn_slave_start(void); +void battery_dyn_slave_stop(void); #endif diff --git a/include/buzzer.h b/include/buzzer.h index d9a2ec7bd1338534726a2f58ecb6554010690382..5cb76a8aa07bf30d1b3529fe3e02e04db50ea0a7 100644 --- a/include/buzzer.h +++ b/include/buzzer.h @@ -2,6 +2,7 @@ #define _BUZZER_H #include "stm32l0xx_hal.h" +#include "memory.h" /* musical notes */ typedef enum {NO_NOTE=0, @@ -13,7 +14,23 @@ typedef enum {NO_NOTE=0, LA_NOTE=440, // 440 Hz SI_NOTE=493} note_t; // 493 Hz -void buzzer_init(void); +typedef struct +{ + note_t current_note; + uint16_t current_time_on; + uint32_t time_on_count; + uint16_t current_time_off; + uint32_t time_off_count; + uint8_t active; + uint8_t alarm_enabled; + TMemModule mem_module; + TMemory *memory; + unsigned short int ram_base_address; + unsigned short int eeprom_base_address1; + unsigned short int eeprom_base_address2; +}TBuzzer; + +unsigned char buzzer_init(TMemory *memory,unsigned short int ram_base_address, unsigned short int eeprom_base_address1, unsigned short int eeprom_base_address2); void buzzer_start(void); void buzzer_stop(void); void buzzer_enable_alarm(void); @@ -21,4 +38,20 @@ void buzzer_disable_alarm(void); uint8_t buzzer_is_alarm_enabled(void); uint8_t buzzer_is_active(void); +uint8_t buzzer_get_warning_time(void); +uint8_t buzzer_get_warning_time_hist(void); +uint16_t buzzer_get_warning_freq(void); +uint16_t buzzer_get_warning_time_on(void); +uint16_t buzzer_get_warning_time_off(void); + +uint8_t buzzer_get_error_time(void); +uint8_t buzzer_get_error_time_hist(void); +uint16_t buzzer_get_error_freq(void); +uint16_t buzzer_get_error_time_on(void); +uint16_t buzzer_get_error_time_off(void); + +void buzzer_set_freq(uint16_t freq); +void buzzer_set_time_on(uint16_t time); +void buzzer_set_time_off(uint16_t time); + #endif diff --git a/include/buzzer_registers.h b/include/buzzer_registers.h new file mode 100644 index 0000000000000000000000000000000000000000..15dd150749e95e8d84aaa578bb11d58a9c0cede5 --- /dev/null +++ b/include/buzzer_registers.h @@ -0,0 +1,28 @@ +#ifndef _BUZZER_REGISTERS_H +#define _BUZZER_REGISTERS_H + +#define EEPROM_BUZZER_LENGTH1 8 + +#define BUZZER_WARNING_TIME_OFFSET 0 +#define BUZZER_WARNING_TIME_HIST_OFFSET 1 +#define BUZZER_WARNING_FREQ_OFFSET 2 +#define BUZZER_WARNING_TIME_ON_OFFSET 4 +#define BUZZER_WARNING_TIME_OFF_OFFSET 6 + +#define EEPROM_BUZZER_LENGTH2 8 + +#define BUZZER_ERROR_TIME_OFFSET 0 +#define BUZZER_ERROR_TIME_HIST_OFFSET 1 +#define BUZZER_ERROR_FREQ_OFFSET 2 +#define BUZZER_ERROR_TIME_ON_OFFSET 4 +#define BUZZER_ERROR_TIME_OFF_OFFSET 6 + +#define RAM_BUZZER_LENGTH 8 + +#define BUZZER_CONTROL_OFFSET 0 +#define BUZZER_STATUS_OFFSET 1 +#define BUZZER_FREQ_OFFSET 2 +#define BUZZER_TIME_ON_OFFSET 4 +#define BUZZER_TIME_OFF_OFFSET 6 + +#endif diff --git a/include/charger.h b/include/charger.h index d09f853ad09da12260d2d9976aadb13f71c85406..5258c944ead2a1484668c2cea025ce16c5a91889 100644 --- a/include/charger.h +++ b/include/charger.h @@ -2,13 +2,25 @@ #define _CHARGER_H #include "stm32l0xx_hal.h" +#include "memory.h" typedef enum{batt_not_present, batt_okay, batt_warning, batt_error} batt_state_t; -void charger_init(void); +typedef struct +{ + uint32_t vicm; + batt_state_t battery_state; + TMemModule mem_module; + TMemory *memory; + unsigned short int ram_base_address; + unsigned short int eeprom_base_address1; + unsigned short int eeprom_base_address2; +}TCharger; + +unsigned char charger_init(TMemory *memory,unsigned short int ram_base_address,unsigned short int eeprom_base_address1, unsigned short int eeprom_base_address2); void charger_enable(void); void charger_disable(void); void charger_ckeck_alarm(void); diff --git a/include/charger_registers.h b/include/charger_registers.h new file mode 100644 index 0000000000000000000000000000000000000000..27813827cf89f6e8c4d8bd783dfd2fdcba64b952 --- /dev/null +++ b/include/charger_registers.h @@ -0,0 +1,41 @@ +#ifndef _CHARGER_REGISTERS_H +#define _CHARGER_REGISTERS_H + +#define EEPROM_CHARGER_LENGTH1 2 + +#define CHARGER_CHARGER_ADDR_OFFSET 0 +#define CHARGER_FUEL_GAUGE_ADDR_OFFSET 1 + +#define EEPROM_CHARGER_LENGTH2 6 + +#define CHARGER_INPUT_MAX_CURRENT_OFFSET 0 +#define CHARGER_OUTPUT_CURRENT_OFFSET 2 +#define CHARGER_OUTPUT_VOLTAGE_OFFSET 4 + +#define RAM_CHARGER_LENGTH 43 + +#define CHARGER_STATUS_OFFSET 0 +#define CHARGER_INPUT_CURRENT_OFFSET 1 +#define CHARGER_CHARGE_CURRENT_OFFSET 3 +#define CHARGER_CHARGE_VOLTAGE_OFFSET 5 +#define CHARGER_LIMIT_CURRENT_OFFSET 7 +#define CHARGER_TEMPERATURE_OFFSET 9 +#define CHARGER_VOLTAGE_OFFSET 11 +#define CHARGER_CURRENT_OFFSET 13 +#define CHARGER_AVG_CURRENT_OFFSET 15 +#define CHARGER_RELATIVE_SOC_OFFSET 17 +#define CHARGER_ABSOLUTE_SOC_OFFSET 18 +#define CHARGER_REMAINING_CAP_OFFSET 19 +#define CHARGER_FULL_CHARGE_CAP_OFFSET 21 +#define CHARGER_RUN_TIME_EMPTY_OFFSET 23 +#define CHARGER_AVG_TIME_EMPTY_OFFSET 25 +#define CHARGER_AVG_TIME_FULL_OFFSET 27 +#define CHARGER_BATTERY_STATUS_OFFSET 29 +#define CHARGER_DESIGN_CAP_OFFSET 31 +#define CHARGER_DESIGN_VOLTAGE_OFFSET 33 +#define CHARGER_CELL1_VOLTAGE_OFFSET 35 +#define CHARGER_CELL2_VOLTAGE_OFFSET 37 +#define CHARGER_CELL3_VOLTAGE_OFFSET 39 +#define CHARGER_CELL4_VOLTAGE_OFFSET 41 + +#endif diff --git a/include/dyn_battery.h b/include/dyn_battery.h deleted file mode 100644 index 9387231ebe81e1e65b2a2f50d6df73ea62feb924..0000000000000000000000000000000000000000 --- a/include/dyn_battery.h +++ /dev/null @@ -1,98 +0,0 @@ -#ifndef _DYN_BATTERY_H -#define _DYN_BATTERY_H - -#define RAM_SIZE 82 -#define EEPROM_SIZE 31 - -#define DYN_BATTERY_MODEL 0x8000 -#define DYN_BATTERY_VERSION 0x01 - -/* battery charger memory map */ -/* memory map */ -typedef enum { - BATTERY_MODEL_NUMBER_L = 0x00, - BATTERY_MODEL_NUMBER_H = 0x01, - BATTERY_VERSION = 0x02, - BATTERY_ID = 0x03, - BATTERY_BAUD_RATE = 0x04, - BATTERY_RETURN_DELAY_TIME = 0x05, - BATTERY_WARNING_TIME = 0x06, - BATTERY_WARNING_TIME_HIST = 0x07, - BATTERY_WARNING_FREQ_L = 0x08, - BATTERY_WARNING_FREQ_H = 0x09, - BATTERY_WARNING_TIME_ON_L = 0x0A, - BATTERY_WARNING_TIME_ON_H = 0x0B, - BATTERY_WARNING_TIME_OFF_L = 0x0C, - BATTERY_WARNING_TIME_OFF_H = 0x0D, - BATTERY_CHARGER_ADDR = 0x0E, - BATTERY_FUEL_GAUGE_ADDR = 0x0F, - BATTERY_STATUS_RETURN_LEVEL = 0x10, - BATTERY_ERROR_TIME = 0x11, - BATTERY_ERROR_TIME_HIST = 0x12, - BATTERY_ERROR_FREQ_L = 0x13, - BATTERY_ERROR_FREQ_H = 0x14, - BATTERY_ERROR_TIME_ON_L = 0x15, - BATTERY_ERROR_TIME_ON_H = 0x16, - BATTERY_ERROR_TIME_OFF_L = 0x17, - BATTERY_ERROR_TIME_OFF_H = 0x18, - BATTERY_INPUT_MAX_CURRENT_L = 0x19, - BATTERY_INPUT_MAX_CURRENT_H = 0x1A, - BATTERY_OUTPUT_CURRENT_L = 0x1B, - BATTERY_OUTPUT_CURRENT_H = 0x1C, - BATTERY_OUTPUT_VOLTAGE_L = 0x1D, - BATTERY_OUTPUT_VOLTAGE_H = 0x1E, - /* RAM */ - BATTERY_CHARGER_STATUS = 0x1F, - BATTERY_INPUT_CURRENT_L = 0x20, - BATTERY_INPUT_CURRENT_H = 0x21, - BATTERY_CHARGE_CURRENT_L = 0x22, - BATTERY_CHARGE_CURRENT_H = 0x23, - BATTERY_CHARGE_VOLTAGE_L = 0x24, - BATTERY_CHARGE_VOLTAGE_H = 0x25, - BATTERY_LIMIT_CURRENT_L = 0x26, - BATTERY_LIMIT_CURRENT_H = 0x27, - BATTERY_TEMPERATURE_L = 0x28, - BATTERY_TEMPERATURE_H = 0x29, - BATTERY_VOLTAGE_L = 0x2A, - BATTERY_VOLTAGE_H = 0x2B, - BATTERY_CURRENT_L = 0x2C, - BATTERY_CURRENT_H = 0x2D, - BATTERY_AVG_CURRENT_L = 0x2E, - BATTERY_AVG_CURRENT_H = 0x2F, - BATTERY_RELATIVE_SOC = 0x30, - BATTERY_ABSOLUTE_SOC = 0x31, - BATTERY_REMAINING_CAP_L = 0x32, - BATTERY_REMAINING_CAP_H = 0x33, - BATTERY_FULL_CHARGE_CAP_L = 0x34, - BATTERY_FULL_CHARGE_CAP_H = 0x35, - BATTERY_RUN_TIME_EMPTY_L = 0x36, - BATTERY_RUN_TIME_EMPTY_H = 0x37, - BATTERY_AVG_TIME_EMPTY_L = 0x38, - BATTERY_AVG_TIME_EMPTY_H = 0x39, - BATTERY_AVG_TIME_FULL_L = 0x3A, - BATTERY_AVG_TIME_FULL_H = 0x3B, - BATTERY_STATUS_L = 0x3C, - BATTERY_STATUS_H = 0x3D, - BATTERY_DESIGN_CAP_L = 0x3E, - BATTERY_DESIGN_CAP_H = 0x3F, - BATTERY_DESIGN_VOLTAGE_L = 0x40, - BATTERY_DESIGN_VOLTAGE_H = 0x41, - BATTERY_CELL1_VOLTAGE_L = 0x42, - BATTERY_CELL1_VOLTAGE_H = 0x43, - BATTERY_CELL2_VOLTAGE_L = 0x44, - BATTERY_CELL2_VOLTAGE_H = 0x45, - BATTERY_CELL3_VOLTAGE_L = 0x46, - BATTERY_CELL3_VOLTAGE_H = 0x47, - BATTERY_CELL4_VOLTAGE_L = 0x48, - BATTERY_CELL4_VOLTAGE_H = 0x49, - BATTERY_BUZZER_CONTROL = 0x4A, - BATTERY_BUZZER_STATUS = 0x4B, - BATTERY_BUZZER_FREQ_L = 0x4C, - BATTERY_BUZZER_FREQ_H = 0x4D, - BATTERY_BUZZER_TIME_ON_L = 0x4E, - BATTERY_BUZZER_TIME_ON_H = 0x4F, - BATTERY_BUZZER_TIME_OFF_L = 0x50, - BATTERY_BUZZER_TIME_OFF_H = 0x51 -} battery_registers_t; - -#endif diff --git a/include/eeprom.h b/include/eeprom.h new file mode 100644 index 0000000000000000000000000000000000000000..3d1fd83fe1ced50fd656f745790125f32e72e792 --- /dev/null +++ b/include/eeprom.h @@ -0,0 +1,10 @@ +#ifndef _EEPROM_H +#define _EEPROM_H + +#include "stm32l0xx_hal.h" + +void eeprom_init(void); +uint16_t eeprom_read(unsigned short int address, unsigned short int *data); +uint16_t eeprom_write(unsigned short int address, unsigned short int data); + +#endif diff --git a/include/mem.h b/include/mem.h deleted file mode 100644 index 973794d991f4a857ce722abcec930d0201c60e68..0000000000000000000000000000000000000000 --- a/include/mem.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _MEM_H -#define _MEM_H - -#include "stm32l0xx_hal.h" -#include "dyn_battery.h" - -#define RAM_SUCCESS 0 -#define RAM_BAD_ADDRESS 1 - -#define DEFAULT_CHARGER_ADDR 0x12 -#define DEFAULT_FUEL_GAUGE_ADDR 0x16 - - -extern uint8_t ram_data[RAM_SIZE]; - -void mem_init(void); -uint8_t mem_read(unsigned char address, unsigned char length, unsigned char *data); -uint8_t mem_write(unsigned char address, unsigned char length, unsigned char *data); - -#endif diff --git a/src/battery_charger.c b/src/battery_charger.c index 493e6b794593401dc2c65704309cbad5daebf6d3..d785d50142541ca534b8ee10f694a4224d9c98ec 100644 --- a/src/battery_charger.c +++ b/src/battery_charger.c @@ -2,35 +2,39 @@ #include "gpio.h" #include "buzzer.h" #include "battery_time.h" +#include "battery_sch.h" #include "battery_dyn_slave.h" #include "charger.h" -#include "mem.h" +#include "eeprom.h" -void SysTick_Handler(void) -{ - HAL_IncTick(); -} +TMemory *memory; +TScheduler *scheduler; -int32_t main(void) +int main(void) { /* initialize the HAL module */ HAL_Init(); + /* initialize EEPROM */ + eeprom_init(); + // initialize time module + battery_time_init(); + // initialze the scheduler + scheduler=battery_sch_init(); + // initialize the dynamixel slave interface + battery_dyn_slave_init(&memory,scheduler); // initialize the gpio module gpio_init(); - // initialize memory - mem_init(); // initialize the buzzer module - buzzer_init(); - // initialize the timer module - battery_time_init(); - // initialize the dynamixel interface - battery_dyn_slave_init(); + buzzer_init(memory,RAM_BUZZER_BASE_ADDRESS,EEPROM_BUZZER_BASE_ADDRESS1,EEPROM_BUZZER_BASE_ADDRESS2); // initialize the smbus interface - charger_init(); + charger_init(memory,RAM_CHARGER_BASE_ADDRESS,EEPROM_CHARGER_BASE_ADDRESS1,EEPROM_CHARGER_BASE_ADDRESS2); + // initialize the Dynamixel RAM memory space + ram_init(memory); + + battery_dyn_slave_start(); - while(1) - { - dyn_slave_loop(&battery_dyn_slave); + while(1)/* main function does not return */ + { charger_ckeck_alarm(); } } diff --git a/src/battery_dyn_slave.c b/src/battery_dyn_slave.c index 95cc7b750b4203dadccb517ed43721243458d7bf..dd7c947bed696cfb31fadbb7caa48dfc890144dd 100644 --- a/src/battery_dyn_slave.c +++ b/src/battery_dyn_slave.c @@ -2,7 +2,7 @@ #include "battery_time.h" #include "usart1.h" #include "gpio.h" -#include "mem.h" +#include "eeprom.h" #include "charger.h" #include "buzzer.h" @@ -14,111 +14,51 @@ #define TX_EN_PIN GPIO_PIN_8 #define TX_EN_GPIO_PORT GPIOA +/* private variables */ /* private variables */ TDynamixelSlave battery_dyn_slave; -TTime battery_timer; -TComm battery_comm; +TDynamixelSlaveDevice battery_dyn_slave_device; +TTime battery_dyn_slave_timer; +TComm battery_dyn_slave_comm; +UART_InitTypeDef battery_comm_init; +TScheduler *battery_dyn_slave_sch; + +/* memory module */ +TMemory *battery_dyn_slave_memory; /* private functions */ -void battery_dyn_slave_set_rx_mode(void) +unsigned char battery_on_read(unsigned short int address,unsigned short int length,unsigned char *data) { - HAL_GPIO_WritePin(TX_EN_GPIO_PORT,TX_EN_PIN,GPIO_PIN_SET); - HAL_GPIO_WritePin(RX_EN_GPIO_PORT,RX_EN_PIN,GPIO_PIN_RESET); -} + mem_do_read(battery_dyn_slave_memory,address,length,data); -void battery_dyn_slave_set_tx_mode(void) -{ - HAL_GPIO_WritePin(RX_EN_GPIO_PORT,RX_EN_PIN,GPIO_PIN_SET); - HAL_GPIO_WritePin(TX_EN_GPIO_PORT,TX_EN_PIN,GPIO_PIN_RESET); + return 0x00; } -uint32_t battery_dyn_slave_get_baudrate(void) +unsigned char battery_on_write(unsigned short int address,unsigned short int length,unsigned char *data) { - return 2000000/(ram_data[BATTERY_BAUD_RATE]+1); + mem_do_write(battery_dyn_slave_memory,address,length,data); + + return 0x00; } -void battery_dyn_slave_config_uart(void) +void battery_on_ping(void) { - UART_AdvFeatureInitTypeDef AdvInit; - UART_InitTypeDef Init; - - Init.BaudRate = battery_dyn_slave_get_baudrate(); - Init.WordLength = UART_WORDLENGTH_8B; - Init.StopBits = UART_STOPBITS_1; - Init.Parity = UART_PARITY_NONE; - Init.Mode = UART_MODE_TX_RX; - Init.HwFlowCtl = UART_HWCONTROL_NONE; - Init.OverSampling = UART_OVERSAMPLING_16; - Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED; - AdvInit.AdvFeatureInit = UART_ADVFEATURE_TXINVERT_INIT|UART_ADVFEATURE_RXINVERT_INIT; - AdvInit.TxPinLevelInvert = UART_ADVFEATURE_TXINV_ENABLE; - AdvInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE; - - usart1_config(&battery_comm,&Init,&AdvInit); } -unsigned char battery_on_read(unsigned short int address,unsigned short int length,unsigned char *data) +void battery_dyn_slave_set_rx_mode(void) { - if(mem_read(address,length,data)==RAM_SUCCESS) - return DYN_NO_ERROR; - else - return DYN_INST_ERROR; + HAL_GPIO_WritePin(TX_EN_GPIO_PORT,TX_EN_PIN,GPIO_PIN_SET); + HAL_GPIO_WritePin(RX_EN_GPIO_PORT,RX_EN_PIN,GPIO_PIN_RESET); } -unsigned char battery_on_write(unsigned short int address,unsigned short int length,unsigned char *data) +void battery_dyn_slave_set_tx_mode(void) { - batt_state_t state; - uint16_t i,num=0; - - if(mem_write(address,length,data)==RAM_SUCCESS) - { - for(i=address;i<address+length;i++) - { - if(i==BATTERY_BAUD_RATE) - battery_dyn_slave_config_uart(); - else if(i==BATTERY_ID) - dyn_slave_set_address(&battery_dyn_slave,data[num]); - else if(i==BATTERY_INPUT_MAX_CURRENT_H) - charger_set_limit_curret(); - else if(i==BATTERY_OUTPUT_CURRENT_H) - charger_set_charge_curret(); - else if(i==BATTERY_OUTPUT_VOLTAGE_H) - charger_set_charge_voltage(); - else if(i==BATTERY_BUZZER_CONTROL) - { - if(data[num]&0x01)// enable buzzer alarm - buzzer_enable_alarm(); - else// disable buzzer alarm - buzzer_disable_alarm(); - if(buzzer_is_alarm_enabled()==0x00) - { - if(data[num]&0x02)// start buzzer - buzzer_start(); - else - buzzer_stop(); - } - else - { - state=charger_get_battery_state(); - if(state==batt_not_present || state==batt_okay) - { - if(data[num]&0x02)// start buzzer - buzzer_start(); - else - buzzer_stop(); - } - } - } - num++; - } - return DYN_NO_ERROR; - } - else - return DYN_INST_ERROR; + HAL_GPIO_WritePin(RX_EN_GPIO_PORT,RX_EN_PIN,GPIO_PIN_SET); + HAL_GPIO_WritePin(TX_EN_GPIO_PORT,TX_EN_PIN,GPIO_PIN_RESET); } /* public functions */ -void battery_dyn_slave_init(void) +void battery_dyn_slave_init(TMemory **memory,TScheduler *scheduler) { GPIO_InitTypeDef GPIO_InitStructure; TUSART_IRQ_Priorities priorities; @@ -126,7 +66,7 @@ void battery_dyn_slave_init(void) UART_InitTypeDef Init; // initialize timer structure - time_init(&battery_timer,battery_time_get_counts_per_us(),battery_time_get_counts); + time_init(&battery_dyn_slave_timer,battery_time_get_counts_per_us(),battery_time_get_counts); // initialize GPIO ENABLE_RX_EN_GPIO_CLK; ENABLE_TX_EN_GPIO_CLK; @@ -140,10 +80,9 @@ void battery_dyn_slave_init(void) GPIO_InitStructure.Pin = TX_EN_PIN; HAL_GPIO_Init(TX_EN_GPIO_PORT, &GPIO_InitStructure); - battery_dyn_slave_set_rx_mode(); /* initialize the comm object */ - comm_init(&battery_comm,0x01,&battery_timer); - Init.BaudRate = battery_dyn_slave_get_baudrate(); + comm_init(&battery_dyn_slave_comm,0x01,&battery_dyn_slave_timer); + Init.BaudRate = 2000000/(DEFAULT_BAUDRATE+1); Init.WordLength = UART_WORDLENGTH_8B; Init.StopBits = UART_STOPBITS_1; Init.Parity = UART_PARITY_NONE; @@ -154,16 +93,41 @@ void battery_dyn_slave_init(void) AdvInit.AdvFeatureInit = UART_ADVFEATURE_TXINVERT_INIT|UART_ADVFEATURE_RXINVERT_INIT; AdvInit.TxPinLevelInvert = UART_ADVFEATURE_TXINV_ENABLE; AdvInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE; + priorities.irq_priority=0; priorities.irq_subpriority=0; priorities.dma_priority=0; priorities.dma_subpriority=1; - usart1_init(&battery_comm,&Init,&AdvInit,&priorities); - dyn_slave_init(&battery_dyn_slave,&battery_comm,ram_data[BATTERY_ID],DYN_VER2); - battery_dyn_slave.set_rx_mode=battery_dyn_slave_set_rx_mode; + + usart1_init(&battery_dyn_slave_comm,&Init,&AdvInit,&priorities); + + // initialize slave device + dyn_slave_device_init(&battery_dyn_slave_device,DEFAULT_DEVICE_ID,EEPROM_DYN_SLAVE_BASE_ADDRESS1,EEPROM_DYN_SLAVE_BASE_ADDRESS2); + battery_dyn_slave_device.on_read=battery_on_read; + battery_dyn_slave_device.on_write=battery_on_write; + battery_dyn_slave_device.on_ping=battery_on_ping; + dyn_slave_device_set_return_delay(&battery_dyn_slave_device,DEFAULT_RETURN_DELAY); + dyn_slave_device_set_return_level(&battery_dyn_slave_device,DEFAULT_RETURN_LEVEL); + (*memory)=dyn_slave_device_get_memory(&battery_dyn_slave_device); + /* initialize memory structure */ + battery_dyn_slave_memory=dyn_slave_device_get_memory(&battery_dyn_slave_device); + battery_dyn_slave_memory->eeprom_write_data=eeprom_write; + battery_dyn_slave_memory->eeprom_read_data=eeprom_read; + // initialize slave + dyn_slave_init(&battery_dyn_slave,&battery_dyn_slave_comm,scheduler,SCHED_CH1,DYN_VER1); + battery_dyn_slave.set_baudrate=usart1_set_baudrate; battery_dyn_slave.set_tx_mode=battery_dyn_slave_set_tx_mode; - battery_dyn_slave.on_read=battery_on_read; - battery_dyn_slave.on_write=battery_on_write; - dyn_slave_set_return_delay(&battery_dyn_slave,ram_data[BATTERY_RETURN_DELAY_TIME]); - dyn_slave_set_return_level(&battery_dyn_slave,ram_data[BATTERY_STATUS_RETURN_LEVEL]); + battery_dyn_slave.set_rx_mode=battery_dyn_slave_set_rx_mode; + dyn_slave_add_device(&battery_dyn_slave,&battery_dyn_slave_device); } + +void battery_dyn_slave_start(void) +{ + dyn_slave_start(&battery_dyn_slave); +} + +void battery_dyn_slave_stop(void) +{ + dyn_slave_stop(&battery_dyn_slave); +} + diff --git a/src/battery_time.c b/src/battery_time.c index 08668954d440ca5befddb92870617f54419e6152..55fed6b2992f0ff5c352ee5c59c516e171d33bdd 100644 --- a/src/battery_time.c +++ b/src/battery_time.c @@ -1,7 +1,17 @@ #include "battery_time.h" TIM_HandleTypeDef us_timer_Handle; -unsigned long long int counts; +unsigned long long int timer_counts; +unsigned short int timer_counts_per_us; + +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + /* USER CODE END SysTick_IRQn 1 */ +} void TIM6_IRQHandler(void) { @@ -10,13 +20,17 @@ void TIM6_IRQHandler(void) if(__HAL_TIM_GET_ITSTATUS(&us_timer_Handle, TIM_IT_UPDATE) !=RESET) { __HAL_TIM_CLEAR_IT(&us_timer_Handle, TIM_IT_UPDATE); - counts+=1; + timer_counts+=1; } } } void battery_time_init(void) { + /* initialize internal variables */ + timer_counts=0; + timer_counts_per_us=(SystemCoreClock/1000000)+1; + us_timer_Handle.Instance=TIM6; us_timer_Handle.Init.Period=0xFFFF; us_timer_Handle.Init.Prescaler=0; @@ -30,16 +44,14 @@ void battery_time_init(void) HAL_NVIC_SetPriority(TIM6_IRQn, 2, 0); HAL_NVIC_EnableIRQ(TIM6_IRQn); HAL_TIM_Base_Start_IT(&us_timer_Handle); - - counts=0; } unsigned long long int battery_time_get_counts(void) { - return (counts<<16)+__HAL_TIM_GetCounter(&us_timer_Handle); + return (timer_counts<<16)+__HAL_TIM_GetCounter(&us_timer_Handle); } unsigned int battery_time_get_counts_per_us(void) { - return (SystemCoreClock/1000000)+1; + return timer_counts_per_us; } diff --git a/src/buzzer.c b/src/buzzer.c index 92630f5e00d51dc4c0adaee6f47e8a8ea1b95df5..d456cf73ccbc2ad9921cb1900c3bd8970e04680d 100644 --- a/src/buzzer.c +++ b/src/buzzer.c @@ -1,6 +1,9 @@ #include "buzzer.h" +#include "buzzer_registers.h" +#include "charger.h" #include "gpio.h" -#include "mem.h" +#include "eeprom.h" +#include "ram.h" #define ENABLE_BUZZER_GPIO_CLK __GPIOA_CLK_ENABLE() #define LED_BUZZER_PIN GPIO_PIN_1 @@ -13,39 +16,34 @@ /* private variables */ TIM_HandleTypeDef buzzer_TIMHandler; -note_t buzzer_current_note; -uint16_t buzzer_current_time_on; -uint32_t buzzer_time_on_count; -uint16_t buzzer_current_time_off; -uint32_t buzzer_time_off_count; -uint8_t buzzer_active; -uint8_t buzzer_alarm_enabled; + +TBuzzer buzzer; void BUZZER_TIMER_IRQHandler(void) { TIM_OC_InitTypeDef TIM_OCInitStructure; uint16_t period; - period = 1000000/buzzer_current_note; + period = 1000000/buzzer.current_note; if(__HAL_TIM_GET_FLAG(&buzzer_TIMHandler, TIM_FLAG_CC1) != RESET) { if(__HAL_TIM_GET_ITSTATUS(&buzzer_TIMHandler, TIM_IT_CC1) !=RESET) { __HAL_TIM_CLEAR_IT(&buzzer_TIMHandler, TIM_IT_CC1); - if(buzzer_time_on_count==0) + if(buzzer.time_on_count==0) { - if(buzzer_current_time_off>0) + if(buzzer.current_time_off>0) { /* stop PWM output*/ HAL_TIM_PWM_Stop(&buzzer_TIMHandler, TIM_CHANNEL_2); /* stop time on timer */ HAL_TIM_OC_Stop_IT(&buzzer_TIMHandler,TIM_CHANNEL_1); /* start time off timer */ - buzzer_time_off_count=(((uint32_t)buzzer_current_time_off)*1000000)/period; + buzzer.time_off_count=(((uint32_t)buzzer.current_time_off)*1000000)/period; TIM_OCInitStructure.OCMode = TIM_OCMODE_TIMING; TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH; - if(buzzer_time_off_count==0) - TIM_OCInitStructure.Pulse = (((uint32_t)buzzer_current_time_off)*1000000)%period; + if(buzzer.time_off_count==0) + TIM_OCInitStructure.Pulse = (((uint32_t)buzzer.current_time_off)*1000000)%period; else TIM_OCInitStructure.Pulse = period; HAL_TIM_OC_ConfigChannel(&buzzer_TIMHandler, &TIM_OCInitStructure,TIM_CHANNEL_3); @@ -53,11 +51,11 @@ void BUZZER_TIMER_IRQHandler(void) } else { - buzzer_time_on_count=(((uint32_t)buzzer_current_time_on)*1000000)/period; + buzzer.time_on_count=(((uint32_t)buzzer.current_time_on)*1000000)/period; TIM_OCInitStructure.OCMode = TIM_OCMODE_TIMING; TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH; - if(buzzer_time_on_count==0) - TIM_OCInitStructure.Pulse = (((uint32_t)buzzer_current_time_on)*1000000)%period; + if(buzzer.time_on_count==0) + TIM_OCInitStructure.Pulse = (((uint32_t)buzzer.current_time_on)*1000000)%period; else TIM_OCInitStructure.Pulse = period; HAL_TIM_OC_ConfigChannel(&buzzer_TIMHandler, &TIM_OCInitStructure,TIM_CHANNEL_1); @@ -66,9 +64,9 @@ void BUZZER_TIMER_IRQHandler(void) } else { - buzzer_time_on_count--; - if(buzzer_time_on_count==0) - __HAL_TIM_SetCompare(&buzzer_TIMHandler, TIM_CHANNEL_1, (((uint32_t)buzzer_current_time_on)*1000000)%period); + buzzer.time_on_count--; + if(buzzer.time_on_count==0) + __HAL_TIM_SetCompare(&buzzer_TIMHandler, TIM_CHANNEL_1, (((uint32_t)buzzer.current_time_on)*1000000)%period); } } } @@ -77,18 +75,18 @@ void BUZZER_TIMER_IRQHandler(void) if(__HAL_TIM_GET_ITSTATUS(&buzzer_TIMHandler, TIM_IT_CC3) !=RESET) { __HAL_TIM_CLEAR_IT(&buzzer_TIMHandler, TIM_IT_CC3); - if(buzzer_time_off_count==0) + if(buzzer.time_off_count==0) { /* start PWM output*/ HAL_TIM_PWM_Start(&buzzer_TIMHandler, TIM_CHANNEL_2); /* stop time on timer */ HAL_TIM_OC_Stop_IT(&buzzer_TIMHandler,TIM_CHANNEL_3); /* start time off timer */ - buzzer_time_on_count=(((uint32_t)buzzer_current_time_on)*1000000)/period; + buzzer.time_on_count=(((uint32_t)buzzer.current_time_on)*1000000)/period; TIM_OCInitStructure.OCMode = TIM_OCMODE_TIMING; TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH; - if(buzzer_time_on_count==0) - TIM_OCInitStructure.Pulse = (((uint32_t)buzzer_current_time_on)*1000000)%period; + if(buzzer.time_on_count==0) + TIM_OCInitStructure.Pulse = (((uint32_t)buzzer.current_time_on)*1000000)%period; else TIM_OCInitStructure.Pulse = period; HAL_TIM_OC_ConfigChannel(&buzzer_TIMHandler, &TIM_OCInitStructure,TIM_CHANNEL_1); @@ -96,16 +94,59 @@ void BUZZER_TIMER_IRQHandler(void) } else { - buzzer_time_off_count--; - if(buzzer_time_off_count==0) - __HAL_TIM_SetCompare(&buzzer_TIMHandler, TIM_CHANNEL_3, (((uint32_t)buzzer_current_time_off)*1000000)%period); + buzzer.time_off_count--; + if(buzzer.time_off_count==0) + __HAL_TIM_SetCompare(&buzzer_TIMHandler, TIM_CHANNEL_3, (((uint32_t)buzzer.current_time_off)*1000000)%period); } } } } +void buzzer_write_cmd(void *module,unsigned short int address,unsigned short int length,unsigned char *data) +{ + TBuzzer *buzzer=(TBuzzer *)module; + unsigned short int ram_offset; + batt_state_t state; + + ram_offset=address-buzzer->ram_base_address; + if(ram_in_window(buzzer->ram_base_address+BUZZER_CONTROL_OFFSET,1,address,length)) + { + if(data[BUZZER_CONTROL_OFFSET-ram_offset]&0x01) + buzzer_enable_alarm(); + else + buzzer_disable_alarm(); + if(buzzer_is_alarm_enabled()==0x00) + { + if(data[BUZZER_CONTROL_OFFSET-ram_offset]&0x02)// start buzzer + buzzer_start(); + else + buzzer_stop(); + } + else + { + state=charger_get_battery_state(); + if(state==batt_not_present || state==batt_okay) + { + if(data[BUZZER_CONTROL_OFFSET-ram_offset]&0x02)// start buzzer + buzzer_start(); + else + buzzer_stop(); + } + } + } + ram_write_table(buzzer->memory,address,length,data); +} + +void buzzer_read_cmd(void *module,unsigned short int address,unsigned short int length,unsigned char *data) +{ + TBuzzer *buzzer=(TBuzzer *)module; + + ram_read_table(buzzer->memory,address,length,data); +} + + /* public functions */ -void buzzer_init(void) +unsigned char buzzer_init(TMemory *memory,unsigned short int ram_base_address, unsigned short int eeprom_base_address1, unsigned short int eeprom_base_address2) { GPIO_InitTypeDef GPIO_InitStruct; @@ -127,21 +168,33 @@ void buzzer_init(void) HAL_NVIC_SetPriority(BUZZER_TIMER_IRQn, 3, 0); HAL_NVIC_EnableIRQ(BUZZER_TIMER_IRQn); - ram_data[BATTERY_BUZZER_CONTROL]=0x01; - ram_data[BATTERY_BUZZER_STATUS]=0x00; - buzzer_active=0x00; - buzzer_alarm_enabled=0x01; - ram_data[BATTERY_BUZZER_FREQ_L]=0xB8; - ram_data[BATTERY_BUZZER_FREQ_H]=0x01; - buzzer_current_note=LA_NOTE; - ram_data[BATTERY_BUZZER_TIME_ON_L]=0x01; - ram_data[BATTERY_BUZZER_TIME_ON_H]=0x00; - buzzer_current_time_on=1; - buzzer_time_on_count=0; - ram_data[BATTERY_BUZZER_TIME_OFF_L]=0x01; - ram_data[BATTERY_BUZZER_TIME_OFF_H]=0x00; - buzzer_current_time_off=1; - buzzer_time_off_count=0; + buzzer.active=0x00; + buzzer.alarm_enabled=0x01; + buzzer.current_note=LA_NOTE; + buzzer.current_time_on=1; + buzzer.time_on_count=0; + buzzer.current_time_off=1; + buzzer.time_off_count=0; + + /* initialize memory module */ + mem_module_init(&buzzer.mem_module); + buzzer.mem_module.write_cmd=buzzer_write_cmd; + buzzer.mem_module.read_cmd=buzzer_read_cmd; + if(!mem_module_add_ram_segment(&buzzer.mem_module,ram_base_address,RAM_BUZZER_LENGTH)) + return 0x00; + buzzer.ram_base_address=ram_base_address; + if(!mem_module_add_eeprom_segment(&buzzer.mem_module,eeprom_base_address1,EEPROM_BUZZER_LENGTH1)) + return 0x00; + buzzer.eeprom_base_address1=eeprom_base_address1; + if(!mem_module_add_eeprom_segment(&buzzer.mem_module,eeprom_base_address2,EEPROM_BUZZER_LENGTH2)) + return 0x00; + buzzer.eeprom_base_address2=eeprom_base_address2; + if(!mem_add_module(memory,&buzzer.mem_module)) + return 0x00; + buzzer.memory=memory; + buzzer.mem_module.data=&buzzer; + + return 0x01; } void buzzer_start(void) @@ -149,13 +202,13 @@ void buzzer_start(void) TIM_OC_InitTypeDef TIM_OCInitStructure; uint16_t period; - buzzer_current_note=ram_data[BATTERY_BUZZER_FREQ_L]+(ram_data[BATTERY_BUZZER_FREQ_H]<<8); - period = 1000000/buzzer_current_note; - if(buzzer_current_note!=NO_NOTE && buzzer_active==0x00) + buzzer.current_note=buzzer.memory->data[buzzer.ram_base_address+BUZZER_FREQ_OFFSET]+(buzzer.memory->data[buzzer.ram_base_address+BUZZER_FREQ_OFFSET+1]<<8); + period = 1000000/buzzer.current_note; + if(buzzer.current_note!=NO_NOTE && buzzer.active==0x00) { - buzzer_current_time_on=ram_data[BATTERY_BUZZER_TIME_ON_L]+(ram_data[BATTERY_BUZZER_TIME_ON_H]<<8); - buzzer_current_time_off=ram_data[BATTERY_BUZZER_TIME_OFF_L]+(ram_data[BATTERY_BUZZER_TIME_OFF_H]<<8); - if(buzzer_current_time_on>0) + buzzer.current_time_on=buzzer.memory->data[buzzer.ram_base_address+BUZZER_TIME_ON_OFFSET]+(buzzer.memory->data[buzzer.ram_base_address+BUZZER_TIME_ON_OFFSET+1]<<8); + buzzer.current_time_off=buzzer.memory->data[buzzer.ram_base_address+BUZZER_TIME_OFF_OFFSET]+(buzzer.memory->data[buzzer.ram_base_address+BUZZER_TIME_OFF_OFFSET+1]<<8); + if(buzzer.current_time_on>0) { /* initialize the time base */ buzzer_TIMHandler.Init.Period = period; @@ -170,23 +223,23 @@ void buzzer_start(void) HAL_TIM_PWM_ConfigChannel(&buzzer_TIMHandler, &TIM_OCInitStructure, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&buzzer_TIMHandler, TIM_CHANNEL_2); /* initialize the ouput compare channel for time on*/ - buzzer_time_on_count=(((uint32_t)buzzer_current_time_on)*1000000)/period; + buzzer.time_on_count=(((uint32_t)buzzer.current_time_on)*1000000)/period; TIM_OCInitStructure.OCMode = TIM_OCMODE_TIMING; TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH; - if(buzzer_time_on_count==0) - TIM_OCInitStructure.Pulse = (((uint32_t)buzzer_current_time_on)*1000000)%period; + if(buzzer.time_on_count==0) + TIM_OCInitStructure.Pulse = (((uint32_t)buzzer.current_time_on)*1000000)%period; else TIM_OCInitStructure.Pulse = period; HAL_TIM_OC_ConfigChannel(&buzzer_TIMHandler, &TIM_OCInitStructure,TIM_CHANNEL_1); HAL_TIM_OC_Start_IT(&buzzer_TIMHandler, TIM_CHANNEL_1); /* buzzer active */ - buzzer_active=0x01; - ram_data[BATTERY_BUZZER_STATUS]=0x01; + buzzer.active=0x01; + buzzer.memory->data[buzzer.ram_base_address+BUZZER_STATUS_OFFSET]=0x01; } else { - ram_data[BATTERY_BUZZER_STATUS]=0x00; - ram_data[BATTERY_BUZZER_CONTROL]&=0xFD; + buzzer.memory->data[buzzer.ram_base_address+BUZZER_STATUS_OFFSET]=0x00; + buzzer.memory->data[buzzer.ram_base_address+BUZZER_CONTROL_OFFSET]&=0xFD; } } // else do nothing @@ -194,7 +247,7 @@ void buzzer_start(void) void buzzer_stop(void) { - if(buzzer_active) + if(buzzer.active) { HAL_TIM_PWM_Stop(&buzzer_TIMHandler,TIM_CHANNEL_2); HAL_TIM_PWM_DeInit(&buzzer_TIMHandler); @@ -202,27 +255,96 @@ void buzzer_stop(void) HAL_TIM_OC_Stop_IT(&buzzer_TIMHandler,TIM_CHANNEL_3); HAL_TIM_OC_DeInit(&buzzer_TIMHandler); HAL_TIM_Base_DeInit(&buzzer_TIMHandler); - buzzer_active=0x00; - ram_data[BATTERY_BUZZER_STATUS]=0x00; + buzzer.active=0x00; + buzzer.memory->data[buzzer.ram_base_address+BUZZER_STATUS_OFFSET]=0x00; } } void buzzer_enable_alarm(void) { - buzzer_alarm_enabled=0x01; + buzzer.alarm_enabled=0x01; } void buzzer_disable_alarm(void) { - buzzer_alarm_enabled=0x00; + buzzer.alarm_enabled=0x00; } uint8_t buzzer_is_alarm_enabled(void) { - return buzzer_alarm_enabled; + return buzzer.alarm_enabled; } uint8_t buzzer_is_active(void) { - return buzzer_active; + return buzzer.active; +} + +uint8_t buzzer_get_warning_time(void) +{ + return buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_WARNING_TIME_OFFSET]; +} + +uint8_t buzzer_get_warning_time_hist(void) +{ + return buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_WARNING_TIME_HIST_OFFSET]; +} + +uint16_t buzzer_get_warning_freq(void) +{ + return buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_WARNING_FREQ_OFFSET]+buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_WARNING_FREQ_OFFSET+1]*256; +} + +uint16_t buzzer_get_warning_time_on(void) +{ + return buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_WARNING_TIME_ON_OFFSET]+buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_WARNING_TIME_ON_OFFSET+1]*256; +} + +uint16_t buzzer_get_warning_time_off(void) +{ + return buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_WARNING_TIME_OFF_OFFSET]+buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_WARNING_TIME_OFF_OFFSET+1]*256; +} + +uint8_t buzzer_get_error_time(void) +{ + return buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_ERROR_TIME_OFFSET]; +} + +uint8_t buzzer_get_error_time_hist(void) +{ + return buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_ERROR_TIME_HIST_OFFSET]; +} + +uint16_t buzzer_get_error_freq(void) +{ + return buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_ERROR_FREQ_OFFSET]+buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_WARNING_FREQ_OFFSET+1]*256; } + +uint16_t buzzer_get_error_time_on(void) +{ + return buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_ERROR_TIME_ON_OFFSET]+buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_ERROR_TIME_ON_OFFSET+1]*256; +} + +uint16_t buzzer_get_error_time_off(void) +{ + return buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_ERROR_TIME_OFF_OFFSET]+buzzer.memory->data[buzzer.eeprom_base_address1+BUZZER_ERROR_TIME_OFF_OFFSET+1]*256; +} + +void buzzer_set_freq(uint16_t freq) +{ + buzzer.memory->data[buzzer.ram_base_address+BUZZER_FREQ_OFFSET]=freq&0x00FF; + buzzer.memory->data[buzzer.ram_base_address+BUZZER_FREQ_OFFSET+1]=(freq>>8)&0x00FF; +} + +void buzzer_set_time_on(uint16_t time) +{ + buzzer.memory->data[buzzer.ram_base_address+BUZZER_TIME_ON_OFFSET]=time&0x00FF; + buzzer.memory->data[buzzer.ram_base_address+BUZZER_TIME_ON_OFFSET+1]=(time>>8)&0x00FF; +} + +void buzzer_set_time_off(uint16_t time) +{ + buzzer.memory->data[buzzer.ram_base_address+BUZZER_TIME_OFF_OFFSET]=time&0x00FF; + buzzer.memory->data[buzzer.ram_base_address+BUZZER_TIME_OFF_OFFSET+1]=(time>>8)&0x00FF; +} + diff --git a/src/charger.c b/src/charger.c index 9c44d16683625a7e22ff91f9fa14f3187e787483..09adc2d0ab9256969beaf7ca1220c1819539db6e 100644 --- a/src/charger.c +++ b/src/charger.c @@ -1,7 +1,9 @@ #include "charger.h" +#include "charger_registers.h" #include "gpio.h" -#include "mem.h" +#include "eeprom.h" #include "buzzer.h" +#include "ram.h" /* private variables */ SMBUS_HandleTypeDef SMBusHandle; @@ -9,9 +11,7 @@ ADC_HandleTypeDef ADCHandle; DMA_HandleTypeDef ADC_DMAHandle; TIM_HandleTypeDef Charger_TIMHandle; -uint32_t charger_vicm; - -batt_state_t battery_state; +TCharger charger; #define MAX_NUM_CMD 24 #define CHARGER_CMDS 6 @@ -31,30 +31,30 @@ typedef struct uint8_t mem_address; }TSMBusCmd; -TSMBusCmd commands[MAX_NUM_CMD]={{0x00,DEFAULT_CHARGER_ADDR,CMD_RD,2,0x14,{0x00,0x00},BATTERY_CHARGE_CURRENT_L},// get charge current +TSMBusCmd commands[MAX_NUM_CMD]={{0x00,DEFAULT_CHARGER_ADDR,CMD_RD,2,0x14,{0x00,0x00},CHARGER_CHARGE_CURRENT_OFFSET},// get charge current {0x00,DEFAULT_CHARGER_ADDR,CMD_WR,2,0x14,{0x00,0x00},0x00},// set charge current - {0x00,DEFAULT_CHARGER_ADDR,CMD_RD,2,0x15,{0x00,0x00},BATTERY_CHARGE_VOLTAGE_L},// get charge voltage + {0x00,DEFAULT_CHARGER_ADDR,CMD_RD,2,0x15,{0x00,0x00},CHARGER_CHARGE_VOLTAGE_OFFSET},// get charge voltage {0x00,DEFAULT_CHARGER_ADDR,CMD_WR,2,0x15,{0x00,0x00},0x00},// set charge voltage - {0x00,DEFAULT_CHARGER_ADDR,CMD_RD,2,0x3F,{0x00,0x00},BATTERY_LIMIT_CURRENT_L},// get max input current + {0x00,DEFAULT_CHARGER_ADDR,CMD_RD,2,0x3F,{0x00,0x00},CHARGER_LIMIT_CURRENT_OFFSET},// get max input current {0x00,DEFAULT_CHARGER_ADDR,CMD_WR,2,0x3F,{0x00,0x00},0x00},// set max input current - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x08,{0x00,0x00},BATTERY_TEMPERATURE_L},// get temperature - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x09,{0x00,0x00},BATTERY_VOLTAGE_L},// get battery voltage - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x0A,{0x00,0x00},BATTERY_CURRENT_L},// get battery current - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x0B,{0x00,0x00},BATTERY_AVG_CURRENT_L},// get battery average current - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,1,0x0D,{0x00,0x00},BATTERY_RELATIVE_SOC},// get relative state of charge - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,1,0x0E,{0x00,0x00},BATTERY_ABSOLUTE_SOC},// get absolute state of charge - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x0F,{0x00,0x00},BATTERY_REMAINING_CAP_L},// get remaining capacity - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x10,{0x00,0x00},BATTERY_FULL_CHARGE_CAP_L},// get full charge capacity - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x11,{0x00,0x00},BATTERY_RUN_TIME_EMPTY_L},// get run time to empty - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x12,{0x00,0x00},BATTERY_AVG_TIME_EMPTY_L},// get average time to empty - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x13,{0x00,0x00},BATTERY_AVG_TIME_FULL_L},// get average time to full - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x16,{0x00,0x00},BATTERY_STATUS_L},// get battery status - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x18,{0x00,0x00},BATTERY_DESIGN_CAP_L},// get design capacity - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x19,{0x00,0x00},BATTERY_DESIGN_VOLTAGE_L},// get design voltage - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x3C,{0x00,0x00},BATTERY_CELL1_VOLTAGE_L},// get cell1 voltage - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x3D,{0x00,0x00},BATTERY_CELL2_VOLTAGE_L},// get cell2 voltage - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x3E,{0x00,0x00},BATTERY_CELL3_VOLTAGE_L},// get cell3 voltage - {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x3F,{0x00,0x00},BATTERY_CELL4_VOLTAGE_L}};// get cell4 voltage + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x08,{0x00,0x00},CHARGER_TEMPERATURE_OFFSET},// get temperature + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x09,{0x00,0x00},CHARGER_VOLTAGE_OFFSET},// get battery voltage + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x0A,{0x00,0x00},CHARGER_CURRENT_OFFSET},// get battery current + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x0B,{0x00,0x00},CHARGER_AVG_CURRENT_OFFSET},// get battery average current + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,1,0x0D,{0x00,0x00},CHARGER_RELATIVE_SOC_OFFSET},// get relative state of charge + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,1,0x0E,{0x00,0x00},CHARGER_ABSOLUTE_SOC_OFFSET},// get absolute state of charge + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x0F,{0x00,0x00},CHARGER_REMAINING_CAP_OFFSET},// get remaining capacity + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x10,{0x00,0x00},CHARGER_FULL_CHARGE_CAP_OFFSET},// get full charge capacity + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x11,{0x00,0x00},CHARGER_RUN_TIME_EMPTY_OFFSET},// get run time to empty + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x12,{0x00,0x00},CHARGER_AVG_TIME_EMPTY_OFFSET},// get average time to empty + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x13,{0x00,0x00},CHARGER_AVG_TIME_FULL_OFFSET},// get average time to full + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x16,{0x00,0x00},CHARGER_BATTERY_STATUS_OFFSET},// get battery status + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x18,{0x00,0x00},CHARGER_DESIGN_CAP_OFFSET},// get design capacity + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x19,{0x00,0x00},CHARGER_DESIGN_VOLTAGE_OFFSET},// get design voltage + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x3C,{0x00,0x00},CHARGER_CELL1_VOLTAGE_OFFSET},// get cell1 voltage + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x3D,{0x00,0x00},CHARGER_CELL2_VOLTAGE_OFFSET},// get cell2 voltage + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x3E,{0x00,0x00},CHARGER_CELL3_VOLTAGE_OFFSET},// get cell3 voltage + {0x00,DEFAULT_FUEL_GAUGE_ADDR,CMD_RD,2,0x3F,{0x00,0x00},CHARGER_CELL4_VOLTAGE_OFFSET}};// get cell4 voltage uint8_t current_cmd; uint8_t smbus_error; @@ -194,7 +194,7 @@ void charger_set_commands(void) charger_get_charge_voltage(); charger_get_limit_curret(); /* check wether the battery is present */ - if(ram_data[BATTERY_CHARGER_STATUS]&0x04)// battery present + if(charger.memory->data[charger.ram_base_address+CHARGER_STATUS_OFFSET]&0x04)// battery present { charger_get_temperature(); charger_get_voltage(); @@ -225,8 +225,8 @@ void charger_cancel_fuel_gauge_commands(void) for(i=CHARGER_CMDS;i<MAX_NUM_CMD;i++) commands[i].send=0x00; - for(i=BATTERY_TEMPERATURE_L;i<=BATTERY_CELL4_VOLTAGE_H;i++) - ram_data[i]=0x00; + for(i=CHARGER_TEMPERATURE_OFFSET;i<=CHARGER_CELL4_VOLTAGE_OFFSET+1;i++) + charger.memory->data[charger.ram_base_address+i]=0x00; } void charger_send_next_command(void) @@ -248,11 +248,11 @@ void charger_send_next_command(void) current_cmd++; if(current_cmd==MAX_NUM_CMD) { - if(HAL_SMBUS_IsDeviceReady(&SMBusHandle,ram_data[BATTERY_FUEL_GAUGE_ADDR],1,10)==HAL_OK) + if(HAL_SMBUS_IsDeviceReady(&SMBusHandle,charger.memory->data[charger.eeprom_base_address1+CHARGER_FUEL_GAUGE_ADDR_OFFSET],1,10)==HAL_OK) { - ram_data[BATTERY_CHARGER_STATUS]|=0x04; - if(battery_state==batt_not_present) - battery_state=batt_okay; + charger.memory->data[charger.ram_base_address+CHARGER_STATUS_OFFSET]|=0x04; + if(charger.battery_state==batt_not_present) + charger.battery_state=batt_okay; smbus_attempts=0; } else @@ -260,8 +260,8 @@ void charger_send_next_command(void) smbus_attempts++; if(smbus_attempts>=5) { - ram_data[BATTERY_CHARGER_STATUS]&=0xFB; - battery_state=batt_not_present; + charger.memory->data[charger.ram_base_address+CHARGER_STATUS_OFFSET]&=0xFB; + charger.battery_state=batt_not_present; charger_cancel_fuel_gauge_commands(); smbus_attempts=0; } @@ -300,7 +300,7 @@ void HAL_SMBUS_MasterTxCpltCallback(SMBUS_HandleTypeDef *hsmbus) { /* reception done */ if(commands[current_cmd].operation==CMD_RD)// Read - HAL_SMBUS_Master_Receive_IT(hsmbus,commands[current_cmd].slave_address,&ram_data[commands[current_cmd].mem_address],commands[current_cmd].length,SMBUS_LAST_FRAME_NO_PEC); + HAL_SMBUS_Master_Receive_IT(hsmbus,commands[current_cmd].slave_address,&charger.memory->data[charger.ram_base_address+commands[current_cmd].mem_address],commands[current_cmd].length,SMBUS_LAST_FRAME_NO_PEC); else commands[current_cmd].send=0x00; } @@ -382,9 +382,9 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) uint16_t value; /* transform data to mA input current */ - value=((charger_vicm*4125)>>10); - ram_data[BATTERY_INPUT_CURRENT_L]=(value&0x00FF); - ram_data[BATTERY_INPUT_CURRENT_H]=((value>>8)&0x00FF); + value=((charger.vicm*4125)>>10); + charger.memory->data[charger.ram_base_address+CHARGER_INPUT_CURRENT_OFFSET]=(value&0x00FF); + charger.memory->data[charger.ram_base_address+CHARGER_INPUT_CURRENT_OFFSET+1]=((value>>8)&0x00FF); } void charger_adc_config(void) @@ -447,7 +447,7 @@ void charger_adc_config(void) HAL_NVIC_EnableIRQ(CHARGER_ADC_DMA_IRQn); /* start ADC conversion */ - HAL_ADC_Start_DMA(&ADCHandle, &charger_vicm, 1); + HAL_ADC_Start_DMA(&ADCHandle, &charger.vicm, 1); } /* GPIO functions */ @@ -472,9 +472,9 @@ void CHARGER_GPIO_IRQHandle(void) { __HAL_GPIO_EXTI_CLEAR_IT(AC_OK_PIN); if(HAL_GPIO_ReadPin(AC_OK_GPIO_PORT,AC_OK_PIN)==GPIO_PIN_SET) - ram_data[BATTERY_CHARGER_STATUS]|=0x02; + charger.memory->data[charger.ram_base_address+CHARGER_STATUS_OFFSET]|=0x02; else - ram_data[BATTERY_CHARGER_STATUS]&=0xFD; + charger.memory->data[charger.ram_base_address+CHARGER_STATUS_OFFSET]&=0xFD; } if(__HAL_GPIO_EXTI_GET_IT(ICOUT_PIN) != RESET) { @@ -538,7 +538,7 @@ void CHARGER_TIMER_IRQHandler(void) __HAL_TIM_CLEAR_IT(&Charger_TIMHandle, TIM_IT_CC2); capture = HAL_TIM_ReadCapturedValue(&Charger_TIMHandle, TIM_CHANNEL_2); __HAL_TIM_SetCompare(&Charger_TIMHandle, TIM_CHANNEL_2, (capture + 60000)); - if((ram_data[BATTERY_CHARGER_STATUS]&0x04)==0)// battery not present + if((charger.memory->data[charger.ram_base_address+CHARGER_STATUS_OFFSET]&0x04)==0)// battery not present { // add commands to the command queue charger_set_charge_curret(); @@ -579,8 +579,28 @@ void charger_timer_config(void) HAL_TIM_OC_Start_IT(&Charger_TIMHandle, TIM_CHANNEL_2); } +void charger_write_cmd(void *module,unsigned short int address,unsigned short int length,unsigned char *data) +{ + TCharger *charger=(TCharger *)module; + + ram_write_table(charger->memory,address,length,data); + if(ram_in_window(charger->eeprom_base_address2+CHARGER_INPUT_MAX_CURRENT_OFFSET,2,address,length)) + charger_set_limit_curret(); + else if(ram_in_window(charger->eeprom_base_address2+CHARGER_OUTPUT_CURRENT_OFFSET,2,address,length)) + charger_set_charge_curret(); + else if(ram_in_window(charger->eeprom_base_address2+CHARGER_OUTPUT_VOLTAGE_OFFSET,2,address,length)) + charger_set_charge_voltage(); +} + +void charger_read_cmd(void *module,unsigned short int address,unsigned short int length,unsigned char *data) +{ + TCharger *charger=(TCharger *)module; + + ram_read_table(charger->memory,address,length,data); +} + /* public functions */ -void charger_init(void) +unsigned char charger_init(TMemory *memory,unsigned short int ram_base_address,unsigned short int eeprom_base_address1, unsigned short int eeprom_base_address2) { /* configure smbus */ charger_smbus_config(); @@ -595,15 +615,7 @@ void charger_init(void) charger_enable(); /* initialize internal variables */ - battery_state=batt_not_present; - if(HAL_SMBUS_IsDeviceReady(&SMBusHandle,ram_data[BATTERY_FUEL_GAUGE_ADDR],1,10)!=HAL_OK) - { - ram_data[BATTERY_CHARGER_STATUS]&=0xFB; - charger_set_charge_curret(); - charger_set_charge_voltage(); - } - else - ram_data[BATTERY_CHARGER_STATUS]|=0x04; + charger.battery_state=batt_not_present; charger_set_limit_curret(); charger_set_commands(); smbus_error=0x00; @@ -611,18 +623,38 @@ void charger_init(void) /* configure timer */ charger_timer_config(); + + /* initialize memory module */ + mem_module_init(&charger.mem_module); + charger.mem_module.write_cmd=charger_write_cmd; + charger.mem_module.read_cmd=charger_read_cmd; + if(!mem_module_add_ram_segment(&charger.mem_module,ram_base_address,RAM_CHARGER_LENGTH)) + return 0x00; + charger.ram_base_address=ram_base_address; + if(!mem_module_add_eeprom_segment(&charger.mem_module,eeprom_base_address1,EEPROM_CHARGER_LENGTH1)) + return 0x00; + charger.eeprom_base_address1=eeprom_base_address1; + if(!mem_module_add_eeprom_segment(&charger.mem_module,eeprom_base_address2,EEPROM_CHARGER_LENGTH2)) + return 0x00; + charger.eeprom_base_address2=eeprom_base_address2; + if(!mem_add_module(memory,&charger.mem_module)) + return 0x00; + charger.memory=memory; + charger.mem_module.data=&charger; + + return 0x01; } void charger_enable(void) { HAL_GPIO_WritePin(CHARGER_EN_GPIO_PORT,CHARGER_EN_PIN,GPIO_PIN_SET); - ram_data[BATTERY_CHARGER_STATUS]|=0x01; + charger.memory->data[charger.ram_base_address+CHARGER_STATUS_OFFSET]|=0x01; } void charger_disable(void) { HAL_GPIO_WritePin(CHARGER_EN_GPIO_PORT,CHARGER_EN_PIN,GPIO_PIN_RESET); - ram_data[BATTERY_CHARGER_STATUS]&=0xFE; + charger.memory->data[charger.ram_base_address+CHARGER_STATUS_OFFSET]&=0xFE; } void charger_update_charger_address(void) @@ -630,7 +662,7 @@ void charger_update_charger_address(void) uint8_t i; for(i=0;i<CHARGER_CMDS;i++) - commands[i].slave_address=ram_data[BATTERY_CHARGER_ADDR]; + commands[i].slave_address=charger.memory->data[charger.eeprom_base_address1+CHARGER_CHARGER_ADDR_OFFSET]; } void charger_update_fuel_gauge_address(void) @@ -638,32 +670,32 @@ void charger_update_fuel_gauge_address(void) uint8_t i; for(i=CHARGER_CMDS;i<MAX_NUM_CMD;i++) - commands[i].slave_address=ram_data[BATTERY_FUEL_GAUGE_ADDR]; + commands[i].slave_address=charger.memory->data[charger.eeprom_base_address1+CHARGER_FUEL_GAUGE_ADDR_OFFSET]; } batt_state_t charger_get_battery_state(void) { - return battery_state; + return charger.battery_state; } void charger_set_charge_curret(void) { - commands[1].data[0]=ram_data[BATTERY_OUTPUT_CURRENT_L]; - commands[1].data[1]=ram_data[BATTERY_OUTPUT_CURRENT_H]; + commands[1].data[0]=charger.memory->data[charger.eeprom_base_address2+CHARGER_OUTPUT_CURRENT_OFFSET]; + commands[1].data[1]=charger.memory->data[charger.eeprom_base_address2+CHARGER_OUTPUT_CURRENT_OFFSET+1]; commands[1].send=0x01; } void charger_set_charge_voltage(void) { - commands[3].data[0]=ram_data[BATTERY_OUTPUT_VOLTAGE_L]; - commands[3].data[1]=ram_data[BATTERY_OUTPUT_VOLTAGE_H]; + commands[3].data[0]=charger.memory->data[charger.eeprom_base_address2+CHARGER_OUTPUT_VOLTAGE_OFFSET]; + commands[3].data[1]=charger.memory->data[charger.eeprom_base_address2+CHARGER_OUTPUT_VOLTAGE_OFFSET+1]; commands[3].send=0x01; } void charger_set_limit_curret(void) { - commands[5].data[0]=ram_data[BATTERY_INPUT_MAX_CURRENT_L]; - commands[5].data[1]=ram_data[BATTERY_INPUT_MAX_CURRENT_H]; + commands[5].data[0]=charger.memory->data[charger.eeprom_base_address2+CHARGER_INPUT_MAX_CURRENT_OFFSET]; + commands[5].data[1]=charger.memory->data[charger.eeprom_base_address2+CHARGER_INPUT_MAX_CURRENT_OFFSET+1]; commands[5].send=0x01; } @@ -673,76 +705,64 @@ void charger_ckeck_alarm(void) if(buzzer_is_alarm_enabled()) { - time=ram_data[BATTERY_AVG_TIME_EMPTY_L]+(ram_data[BATTERY_AVG_TIME_EMPTY_H]<<8); - switch(battery_state) + time=charger.memory->data[charger.ram_base_address+CHARGER_AVG_TIME_EMPTY_OFFSET]+(charger.memory->data[charger.ram_base_address+CHARGER_AVG_TIME_EMPTY_OFFSET+1]<<8); + switch(charger.battery_state) { case batt_not_present: if(buzzer_is_active()) buzzer_stop(); break; - case batt_okay: if(time<(ram_data[BATTERY_WARNING_TIME]-ram_data[BATTERY_WARNING_TIME_HIST])) + case batt_okay: if(time<(buzzer_get_warning_time()-buzzer_get_warning_time_hist())) { - if(time<(ram_data[BATTERY_ERROR_TIME]-ram_data[BATTERY_ERROR_TIME_HIST])) + if(time<(buzzer_get_error_time()-buzzer_get_error_time_hist())) { - battery_state=batt_error; - ram_data[BATTERY_BUZZER_FREQ_L]=ram_data[BATTERY_ERROR_FREQ_L]; - ram_data[BATTERY_BUZZER_FREQ_H]=ram_data[BATTERY_ERROR_FREQ_H]; - ram_data[BATTERY_BUZZER_TIME_ON_L]=ram_data[BATTERY_ERROR_TIME_ON_L]; - ram_data[BATTERY_BUZZER_TIME_ON_H]=ram_data[BATTERY_ERROR_TIME_ON_H]; - ram_data[BATTERY_BUZZER_TIME_OFF_L]=ram_data[BATTERY_ERROR_TIME_OFF_L]; - ram_data[BATTERY_BUZZER_TIME_OFF_H]=ram_data[BATTERY_ERROR_TIME_OFF_H]; + charger.battery_state=batt_error; + buzzer_set_freq(buzzer_get_error_freq()); + buzzer_set_time_on(buzzer_get_error_time_on()); + buzzer_set_time_off(buzzer_get_error_time_off()); if(buzzer_is_active()) buzzer_stop(); buzzer_start(); } else { - battery_state=batt_warning; - ram_data[BATTERY_BUZZER_FREQ_L]=ram_data[BATTERY_WARNING_FREQ_L]; - ram_data[BATTERY_BUZZER_FREQ_H]=ram_data[BATTERY_WARNING_FREQ_H]; - ram_data[BATTERY_BUZZER_TIME_ON_L]=ram_data[BATTERY_WARNING_TIME_ON_L]; - ram_data[BATTERY_BUZZER_TIME_ON_H]=ram_data[BATTERY_WARNING_TIME_ON_H]; - ram_data[BATTERY_BUZZER_TIME_OFF_L]=ram_data[BATTERY_WARNING_TIME_OFF_L]; - ram_data[BATTERY_BUZZER_TIME_OFF_H]=ram_data[BATTERY_WARNING_TIME_OFF_H]; + charger.battery_state=batt_warning; + buzzer_set_freq(buzzer_get_warning_freq()); + buzzer_set_time_on(buzzer_get_warning_time_on()); + buzzer_set_time_off(buzzer_get_warning_time_off()); if(buzzer_is_active()) buzzer_stop(); buzzer_start(); } } break; - case batt_warning: if(time<(ram_data[BATTERY_ERROR_TIME]-ram_data[BATTERY_ERROR_TIME_HIST])) + case batt_warning: if(time<(buzzer_get_error_time()-buzzer_get_error_time_hist())) { - battery_state=batt_error; - ram_data[BATTERY_BUZZER_FREQ_L]=ram_data[BATTERY_ERROR_FREQ_L]; - ram_data[BATTERY_BUZZER_FREQ_H]=ram_data[BATTERY_ERROR_FREQ_H]; - ram_data[BATTERY_BUZZER_TIME_ON_L]=ram_data[BATTERY_ERROR_TIME_ON_L]; - ram_data[BATTERY_BUZZER_TIME_ON_H]=ram_data[BATTERY_ERROR_TIME_ON_H]; - ram_data[BATTERY_BUZZER_TIME_OFF_L]=ram_data[BATTERY_ERROR_TIME_OFF_L]; - ram_data[BATTERY_BUZZER_TIME_OFF_H]=ram_data[BATTERY_ERROR_TIME_OFF_H]; + charger.battery_state=batt_error; + buzzer_set_freq(buzzer_get_error_freq()); + buzzer_set_time_on(buzzer_get_error_time_on()); + buzzer_set_time_off(buzzer_get_error_time_off()); buzzer_stop(); buzzer_start(); } - else if(time>(ram_data[BATTERY_WARNING_TIME]+ram_data[BATTERY_WARNING_TIME_HIST])) + else if(time>(buzzer_get_warning_time()-buzzer_get_warning_time_hist())) { buzzer_stop(); - battery_state=batt_okay; + charger.battery_state=batt_okay; } break; - case batt_error: if(time>(ram_data[BATTERY_ERROR_TIME]+ram_data[BATTERY_ERROR_TIME_HIST])) + case batt_error: if(time>(buzzer_get_error_time()-buzzer_get_error_time_hist())) { - if(time>(ram_data[BATTERY_WARNING_TIME]+ram_data[BATTERY_WARNING_TIME_HIST])) + if(time>(buzzer_get_warning_time()-buzzer_get_warning_time_hist())) { buzzer_stop(); - battery_state=batt_okay; + charger.battery_state=batt_okay; } else { - battery_state=batt_warning; - ram_data[BATTERY_BUZZER_FREQ_L]=ram_data[BATTERY_WARNING_FREQ_L]; - ram_data[BATTERY_BUZZER_FREQ_H]=ram_data[BATTERY_WARNING_FREQ_H]; - ram_data[BATTERY_BUZZER_TIME_ON_L]=ram_data[BATTERY_WARNING_TIME_ON_L]; - ram_data[BATTERY_BUZZER_TIME_ON_H]=ram_data[BATTERY_WARNING_TIME_ON_H]; - ram_data[BATTERY_BUZZER_TIME_OFF_L]=ram_data[BATTERY_WARNING_TIME_OFF_L]; - ram_data[BATTERY_BUZZER_TIME_OFF_H]=ram_data[BATTERY_WARNING_TIME_OFF_H]; + charger.battery_state=batt_warning; + buzzer_set_freq(buzzer_get_warning_freq()); + buzzer_set_time_on(buzzer_get_warning_time_on()); + buzzer_set_time_off(buzzer_get_warning_time_off()); buzzer_stop(); buzzer_start(); } diff --git a/src/eeprom.c b/src/eeprom.c new file mode 100644 index 0000000000000000000000000000000000000000..0281093220af8f95df93f1b88dd202303f3423c3 --- /dev/null +++ b/src/eeprom.c @@ -0,0 +1,56 @@ +#include "eeprom.h" + +uint8_t eeprom_data[EEPROM_SIZE] __attribute__ ((section (".eeprom")))={ + DEFAULT_DEVICE_MODEL&0x00FF, + (DEFAULT_DEVICE_MODEL>>8)&0x00FF, + DEFAULT_FIRMWARE_VERSION, + DEFAULT_DEVICE_ID, + DEFAULT_BAUDRATE, + DEFAULT_RETURN_DELAY, + DEFAULT_WARNING_TIME_OFFSET, + DEFAULT_WARNING_TIME_HIST_OFFSET, + DEFAULT_WARNING_FREQ_OFFSET&0x00FF, + (DEFAULT_WARNING_FREQ_OFFSET>>8)&0x00FF, + DEFAULT_WARNING_TIME_ON_OFFSET&0x00FF, + (DEFAULT_WARNING_TIME_ON_OFFSET>>8)&0x00FF, + DEFAULT_WARNING_TIME_OFF_OFFSET&0x00FF, + (DEFAULT_WARNING_TIME_OFF_OFFSET>>8)&0x00FF, + DEFAULT_CHARGER_ADDR, + DEFAULT_FUEL_GAUGE_ADDR, + DEFAULT_RETURN_LEVEL, + DEFAULT_ERROR_TIME_OFFSET, + DEFAULT_ERROR_TIME_HIST_OFFSET, + DEFAULT_ERROR_FREQ_OFFSET&0x00FF, + (DEFAULT_ERROR_FREQ_OFFSET>>8)&0x00FF, + DEFAULT_ERROR_TIME_ON_OFFSET&0x00FF, + (DEFAULT_ERROR_TIME_ON_OFFSET>>8)&0x00FF, + DEFAULT_ERROR_TIME_OFF_OFFSET&0x00FF, + (DEFAULT_ERROR_TIME_OFF_OFFSET>>8)&0x00FF, + DEFAULT_INPUT_MAX_CURRENT_OFFSET&0x00FF, + (DEFAULT_INPUT_MAX_CURRENT_OFFSET>>8)&0x00FF, + DEFAULT_OUTPUT_CURRENT_OFFSET&0x00FF, + (DEFAULT_OUTPUT_CURRENT_OFFSET>>8)&0x00FF, + DEFAULT_OUTPUT_VOLTAGE_OFFSET&0x00FF, + (DEFAULT_OUTPUT_VOLTAGE_OFFSET>>8)&0x00FF}; + +void eeprom_init(void) +{ + /* unblock EEPROM write access */ + HAL_FLASHEx_DATAEEPROM_Unlock(); +} + +uint16_t eeprom_read(unsigned short int address, unsigned short int *data) +{ + if(address<EEPROM_SIZE) + (*data)=eeprom_data[address]; + + return 0; +} + +uint16_t eeprom_write(unsigned short int address, unsigned short int data) +{ + if(address<EEPROM_SIZE) + HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAM_FASTBYTE,(uint32_t)(0x08080000+address),(unsigned char)data); + + return 0; +} diff --git a/src/mem.c b/src/mem.c deleted file mode 100644 index 43e5c452dfa66f7c85aeecd3dffdb609be2abf81..0000000000000000000000000000000000000000 --- a/src/mem.c +++ /dev/null @@ -1,82 +0,0 @@ -#include "mem.h" - -uint8_t ram_data[RAM_SIZE]; -uint8_t eeprom_data[EEPROM_SIZE] __attribute__ ((section (".eeprom")))={ - DYN_BATTERY_MODEL&0x00FF, - (DYN_BATTERY_MODEL>>8)&0x00FF, - DYN_BATTERY_VERSION, - 0xC0, - 0x01, - 0x00, - 0x0A, - 0x01, - 0xB8, - 0x01, - 0x01, - 0x00, - 0x1E, - 0x00, - DEFAULT_CHARGER_ADDR, - DEFAULT_FUEL_GAUGE_ADDR, - 0x02, - 0x05, - 0x01, - 0xB8, - 0x01, - 0x01, - 0x00, - 0x05, - 0x00, - 0x94, - 0x11, - 0xE8, - 0x03, - 0xE0, - 0x2E}; - -void mem_init(void) -{ - uint8_t i; - - /* unblock EEPROM write access */ - HAL_FLASHEx_DATAEEPROM_Unlock(); - - /* read contents from EEPROM */ - for(i=0;i<EEPROM_SIZE;i++) - ram_data[i]=eeprom_data[i]; - /* initialize rest of RAM */ - for(;i<RAM_SIZE;i++) - ram_data[i]=0x00; -} - -uint8_t mem_read(unsigned char address, unsigned char length, unsigned char *data) -{ - uint8_t i; - - if((address+length)>RAM_SIZE) - return RAM_BAD_ADDRESS; - else - { - for(i=0;i<length;i++) - data[i]=ram_data[address+i]; - return RAM_SUCCESS; - } -} - -uint8_t mem_write(unsigned char address, unsigned char length, unsigned char *data) -{ - uint8_t i,num; - - if((address+length)>RAM_SIZE) - return RAM_BAD_ADDRESS; - else - { - for(i=address,num=0;i<(address+length);i++,num++) - { - if(i<EEPROM_SIZE) - HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAM_FASTBYTE,(uint32_t)(i+0x08080000),data[num]); - ram_data[i]=data[num]; - } - return RAM_SUCCESS; - } -} diff --git a/stm32_libraries b/stm32_libraries index 0a4a91c0033ac79c8fd345eab1f9b1bdce10b2dd..c078fa113292454a1005f947cc957e864645c14a 160000 --- a/stm32_libraries +++ b/stm32_libraries @@ -1 +1 @@ -Subproject commit 0a4a91c0033ac79c8fd345eab1f9b1bdce10b2dd +Subproject commit c078fa113292454a1005f947cc957e864645c14a