diff --git a/Makefile b/Makefile index eeb471a7684a62268bfbd0597f4fd42a3fba967b..d9f8ca6f938025b485289b2e98cff5b00d252123 100755 --- a/Makefile +++ b/Makefile @@ -9,10 +9,11 @@ PROJECT_NAME=darwin_firmware TARGET_FILES=src/cm730_fw.c TARGET_FILES+=src/eeprom.c TARGET_FILES+=src/system_stm32f1xx.c -TARGET_FILES+=src/gpio.c +#TARGET_FILES+=src/gpio.c +TARGET_FILES+=src/darwin_sch.c TARGET_FILES+=src/darwin_time.c -TARGET_FILES+=src/adc_dma.c -TARGET_FILES+=src/imu.c +#TARGET_FILES+=src/adc_dma.c +#TARGET_FILES+=src/imu.c TARGET_FILES+=src/darwin_dyn_slave.c #TARGET_FILES+=src/darwin_dyn_master.c #TARGET_FILES+=src/darwin_dyn_master_v2.c @@ -42,13 +43,14 @@ COMM_PATH=$(STM32_LIBRARIES_PATH)/comm MEMORY_PATH=$(STM32_LIBRARIES_PATH)/memory USART_PATH=$(STM32_LIBRARIES_PATH)/f1/usart DYNAMIXEL_PATH=$(STM32_LIBRARIES_PATH)/dynamixel_base +SCHEDULER_PATH=$(STM32_LIBRARIES_PATH)/scheduler BUILD_PATH=build COMPILE_OPTS = -mlittle-endian -mcpu=cortex-m3 -mthumb -mthumb-interwork COMPILE_OPTS += -Wall -O2 -fno-common -msoft-float -DUSE_HAL_DRIVER -COMPILE_OPTS += -ffreestanding -nostdlib -D$(PROCESSOR_MACRO) +COMPILE_OPTS += -ffreestanding -nostdlib -D$(PROCESSOR_MACRO) -DHSE_VALUE=8000000 -imacros ./include/darwin_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./include +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 DOC_DIR = ./doc @@ -98,7 +100,11 @@ TARGET_FILES+=$(USART_PATH)/src/usart1_remap.c TARGET_FILES+=$(wildcard $(UTILS_PATH)/src/*.c) TARGET_FILES+=$(wildcard $(COMM_PATH)/src/*.c) TARGET_FILES+=$(wildcard $(MEMORY_PATH)/src/*.c) -TARGET_FILES+=$(wildcard $(DYNAMIXEL_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) DARWIN_OBJS_TMP = $(notdir $(TARGET_FILES:.c=.o)) DARWIN_OBJS = $(patsubst %,$(BUILD_PATH)/%,$(DARWIN_OBJS_TMP)) @@ -124,6 +130,8 @@ $(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 $(DARWIN_OBJS) $(BUID_PATH)/$(STARTUP_FILE:.s=.o) $(LD) $(LDFLAGS) $(DARWIN_OBJS) $(BUILD_PATH)/$(STARTUP_FILE:.s=.o) $(EXT_LIB) -lm --output $@ diff --git a/include/darwin_conf.h b/include/darwin_conf.h index 577308c12f14edc0828bdca1a295743d07161015..44ebbf8622d2d392c3cfbae49e8ccedf0e091c15 100644 --- a/include/darwin_conf.h +++ b/include/darwin_conf.h @@ -1,23 +1,24 @@ #ifndef _DARWIN_CONF_H #define _DARWIN_CONF_H -#define RAM_SIZE 1024 -#define EEPROM_SIZE 256 +#define RAM_SIZE 1024 +#define EEPROM_SIZE 256 /* 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 0x7300 +#define DEFAULT_DEVICE_MODEL 0x001D #define DEFAULT_FIRMWARE_VERSION 0x0001 -#define DEFAULT_DEVICE_ID 0x0001 -#define DEFAULT_BAUDRATE 0x0010 +#define DEFAULT_DEVICE_ID 0x0003 +#define DEFAULT_BAUDRATE 0x0022 #define DEFAULT_RETURN_DELAY 0x0000 #define DEFAULT_RETURN_LEVEL 0x0002 #define MAX_DYN_SLAVE_TX_BUFFER_LEN 1024 #define MAX_DYN_SLAVE_RX_BUFFER_LEN 1024 #define MAX_DYN_SLAVE_REG_BUFFER_LEN 1024 +#define MAX_NUM_SLAVE_DEVICES 4 /* GPIO configuration */ #define RAM_GPIO_BASE_ADDRESS ((unsigned short int)0x0100) diff --git a/include/darwin_dyn_slave.h b/include/darwin_dyn_slave.h index 49437d6860ecfdfe7e5548e671d0b517c9adf31d..493b39530e1e93df9a0169bae902f329accc9fd5 100644 --- a/include/darwin_dyn_slave.h +++ b/include/darwin_dyn_slave.h @@ -7,10 +7,12 @@ extern "C" { #include "stm32f1xx.h" #include "dynamixel_slave.h" +#include "dynamixel_slave_device.h" #include "dynamixel_slave_registers.h" +#include "scheduler.h" #include "memory.h" -uint8_t darwin_dyn_slave_init(TMemory *memory); +uint8_t darwin_dyn_slave_init(TMemory **memory,TScheduler *scheduler); void darwin_dyn_slave_start(void); void darwin_dyn_slave_stop(void); diff --git a/include/eeprom_init.h b/include/eeprom_init.h index 09eca5c7ead93c546ad246a4cf536853dbc8d9af..0f1baf36750d925815fdc5a6c47f95a76bdfab9f 100644 --- a/include/eeprom_init.h +++ b/include/eeprom_init.h @@ -5,17 +5,11 @@ extern "C" { #endif -#define DEFAULT_DEVICE_MODEL 0x7300 -#define DEFAULT_FIRMWARE_VERSION 0x0001 -#define DEFAULT_DEVICE_ID 0x0002 -#define DEFAULT_BAUDRATE 0x0001 -#define DEFAULT_RETURN_DELAY 0x0000 #define DEFAULT_MM_PERIOD 0x1E78 //7800us #define DEFAULT_BAL_KNEE_GAIN 0x4CCD // 0.3 in fixed point format 0|16 #define DEFAULT_BAL_ANKLE_ROLL_GAIN 0xFFFF // 0.99999 #define DEFAULT_BAL_ANKLE_PITCH_GAIN 0xE666 // 0.9 #define DEFAULT_BAL_HIP_ROLL_GAIN 0x8000 // 0.5 -#define DEFAULT_RETURN_LEVEL 0x0002 #define DEFAULT_SERVO0_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 #define DEFAULT_SERVO1_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 #define DEFAULT_SERVO2_OFFSET 0x0000 // 0 in fixed point format 4 (1+3) | 4 @@ -110,8 +104,6 @@ extern "C" { #define DEFAULT_STAIRS_Y_SPREAD 0x0014 // 20 mm #define DEFAULT_STAIRS_X_SHIFT_BODY 0x0023 // 35 mm -#define EEPROM_SIZE 137 - #ifdef __cplusplus } #endif diff --git a/src/cm730_fw.c b/src/cm730_fw.c index 859d26a6bf135af392808c3fa6e01c928759f95c..326cbe94588553ddb046f74b1512287e9b9d9947 100755 --- a/src/cm730_fw.c +++ b/src/cm730_fw.c @@ -1,43 +1,44 @@ #include "stm32f1xx_hal.h" #include "darwin_conf.h" #include "memory.h" -#include "gpio.h" -#include "eeprom.h" -#include "adc_dma.h" -#include "imu.h" -#include "darwin_time.h" +#include "darwin_sch.h" #include "darwin_dyn_slave.h" -#include "darwin_dyn_master.h" -#include "darwin_dyn_master_v2.h" -#include "motion_manager.h" -#include "action.h" -#include "action_id.h" +#include "darwin_time.h" +#include "eeprom.h" +//#include "gpio.h" +//#include "adc_dma.h" +//#include "imu.h" +//#include "darwin_dyn_master.h" +//#include "darwin_dyn_master_v2.h" +//#include "motion_manager.h" +//#include "action.h" +//#include "action_id.h" -TMemory darwin_memory; +TMemory *darwin_memory; +TScheduler *scheduler; int main(void) { - uint16_t eeprom_data,period; +// uint16_t eeprom_data,period; /* initialize the HAL module */ HAL_Init(); /* initialize EEPROM */ EE_Init(); - /* initialize memory structure */ - mem_init(&darwin_memory); - darwin_memory.eeprom_write_data=EE_WriteVariable; - darwin_memory.eeprom_read_data=EE_ReadVariable; + /* initialize the scheduler */ + scheduler=darwin_sch_init(); /* initialize the GPIO module */ - gpio_init(&darwin_memory); +// gpio_init(&darwin_memory); // initialize adc - adc_init(&darwin_memory); +// adc_init(&darwin_memory); // initialize imu - imu_init(&darwin_memory); +// imu_init(&darwin_memory); // initialize time module -// darwin_time_init(); + darwin_time_init(); /* initialize the dynamixel slave interface */ -// darwin_dyn_slave_init(); -// darwin_dyn_slave_start(); + darwin_dyn_slave_init(&darwin_memory,scheduler); + darwin_memory->eeprom_write_data=EE_WriteVariable; + darwin_memory->eeprom_read_data=EE_ReadVariable; /* initialize motion manager module */ // EE_ReadVariable(MM_PERIOD_OFFSET,&eeprom_data); // period=eeprom_data&0x00FF; @@ -46,7 +47,9 @@ int main(void) // manager_init(period); // gpio_set_led(LED_4); /* initialize the ram module */ - ram_init(&darwin_memory); + ram_init(darwin_memory); + + darwin_dyn_slave_start(); while(1);/* main function does not return */ } diff --git a/src/darwin_dyn_slave.c b/src/darwin_dyn_slave.c index eb680dbfe896a92a801e7f72a136ed8a4553b8d0..09c22bc7de4c1b161e080f2d0b1a01071e5f7ab3 100755 --- a/src/darwin_dyn_slave.c +++ b/src/darwin_dyn_slave.c @@ -3,22 +3,20 @@ #include "usart3.h" #include "ram.h" -/* timer for the execution of the dynamixel slave loop */ -#define DYN_SLAVE_TIMER TIM7 -#define DYN_SLAVE_TIMER_IRQn TIM7_IRQn -#define DYN_SLAVE_TIMER_IRQHandler TIM7_IRQHandler -#define DYN_SLAVE_TIMER_ENABLE_CLK __HAL_RCC_TIM7_CLK_ENABLE() - /* private variables */ TDynamixelSlave darwin_dyn_slave; +TDynamixelSlaveDevice darwin_dyn_slave_device; TTime darwin_dyn_slave_timer; TComm darwin_dyn_slave_comm; UART_InitTypeDef darwin_comm_init; -TIM_HandleTypeDef darwin_dyn_slave_tim_handle; +TScheduler *darwin_dyn_slave_sch; /* memory module */ TMemory *darwin_dyn_slave_memory; +/* eeprom data */ +dyn_slave_control_eeprom_data(darwin_dyn_slave,".eeprom",EEPROM_DYN_SLAVE_BASE_ADDRESS1,EEPROM_DYN_SLAVE_BASE_ADDRESS2); + // private functions unsigned char darwin_on_read(unsigned short int address,unsigned short int length,unsigned char *data) { @@ -38,21 +36,8 @@ void darwin_on_ping(void) { } -/* interrupt service routines */ -void DYN_SLAVE_TIMER_IRQHandler(void) -{ - if(__HAL_TIM_GET_FLAG(&darwin_dyn_slave_tim_handle, TIM_FLAG_UPDATE) != RESET) - { - if(__HAL_TIM_GET_IT_SOURCE(&darwin_dyn_slave_tim_handle, TIM_IT_UPDATE) !=RESET) - { - __HAL_TIM_CLEAR_IT(&darwin_dyn_slave_tim_handle, TIM_IT_UPDATE); - dyn_slave_loop(&darwin_dyn_slave); - } - } -} - // public functions -uint8_t darwin_dyn_slave_init(TMemory *memory) +uint8_t darwin_dyn_slave_init(TMemory **memory,TScheduler *scheduler) { TUSART_IRQ_Priorities priorities; uint8_t status; @@ -62,7 +47,7 @@ uint8_t darwin_dyn_slave_init(TMemory *memory) /* initialize the comm object */ comm_init(&darwin_dyn_slave_comm,0x01,&darwin_dyn_slave_timer); - darwin_comm_init.BaudRate = 2000000/(ram_data[BAUDRATE]+1); + darwin_comm_init.BaudRate = 2000000/(ram_data[DEFAULT_BAUDRATE]+1); darwin_comm_init.WordLength = UART_WORDLENGTH_8B; darwin_comm_init.StopBits = UART_STOPBITS_1; darwin_comm_init.Parity = UART_PARITY_NONE; @@ -78,36 +63,30 @@ uint8_t darwin_dyn_slave_init(TMemory *memory) priorities.dma_tx_subpriority=0; usart3_init(&darwin_dyn_slave_comm,&darwin_comm_init,&priorities); - status=dyn_slave_init(&darwin_dyn_slave,memory,&darwin_dyn_slave_comm,ram_data[DEVICE_ID],DYN_VER2); - darwin_dyn_slave_memory=memory; - darwin_dyn_slave.on_read=darwin_on_read; - darwin_dyn_slave.on_write=darwin_on_write; - darwin_dyn_slave.on_ping=darwin_on_ping; - dyn_slave_set_return_delay(&darwin_dyn_slave,ram_data[RETURN_DELAY]); - dyn_slave_set_return_level(&darwin_dyn_slave,ram_data[RETURN_LEVEL]); - - /* initialize timer for the execution of the dynamixel slave loop */ - DYN_SLAVE_TIMER_ENABLE_CLK; - darwin_dyn_slave_tim_handle.Instance=DYN_SLAVE_TIMER; - darwin_dyn_slave_tim_handle.Init.Period = 1000; - darwin_dyn_slave_tim_handle.Init.Prescaler = 72; - darwin_dyn_slave_tim_handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - darwin_dyn_slave_tim_handle.Init.CounterMode = TIM_COUNTERMODE_UP; - HAL_TIM_Base_Init(&darwin_dyn_slave_tim_handle); - // initialize the timer interrupts - HAL_NVIC_SetPriority(DYN_SLAVE_TIMER_IRQn, 2, 2); - HAL_NVIC_EnableIRQ(DYN_SLAVE_TIMER_IRQn); + // initialize slave device + dyn_slave_device_init(&darwin_dyn_slave_device,DEFAULT_DEVICE_ID,EEPROM_DYN_SLAVE_BASE_ADDRESS1,EEPROM_DYN_SLAVE_BASE_ADDRESS2); + darwin_dyn_slave_device.on_read=darwin_on_read; + darwin_dyn_slave_device.on_write=darwin_on_write; + darwin_dyn_slave_device.on_ping=darwin_on_ping; + dyn_slave_device_set_return_delay(&darwin_dyn_slave_device,DEFAULT_RETURN_DELAY); + dyn_slave_device_set_return_level(&darwin_dyn_slave_device,DEFAULT_RETURN_LEVEL); + (*memory)=dyn_slave_device_get_memory(&darwin_dyn_slave_device); + darwin_dyn_slave_memory=dyn_slave_device_get_memory(&darwin_dyn_slave_device); + + status=dyn_slave_init(&darwin_dyn_slave,&darwin_dyn_slave_comm,scheduler,SCHED_CH1,DYN_VER2); + darwin_dyn_slave.set_baudrate=usart3_set_baudrate; + dyn_slave_add_device(&darwin_dyn_slave,&darwin_dyn_slave_device); return status; } void darwin_dyn_slave_start(void) { - HAL_TIM_Base_Start_IT(&darwin_dyn_slave_tim_handle); + dyn_slave_start(&darwin_dyn_slave); } void darwin_dyn_slave_stop(void) { - HAL_TIM_Base_Stop_IT(&darwin_dyn_slave_tim_handle); + dyn_slave_stop(&darwin_dyn_slave); }