diff --git a/include/dynamixel_master_uart_dma.h b/include/dynamixel_master_uart_dma.h deleted file mode 100755 index e07789ed1722735f0f6e2ad4272de497e602df56..0000000000000000000000000000000000000000 --- a/include/dynamixel_master_uart_dma.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef _DYNAMIXEL_MASTER_DMA_H -#define _DYNAMIXEL_MASTER_DMA_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "stm32f4xx.h" -#include "dynamixel.h" -#include "dynamixel2.h" - -// dynamixel master functions -void dyn_master_init(void); -void dyn_master_reset(void); -void dyn_master_set_timeout(uint16_t timeout_ms); -void dyn_master_scan(uint8_t *num,uint8_t *ids); -void dyn2_master_scan(uint8_t *num,uint8_t *ids); -inline void dyn_master_enable_power(void); -inline void dyn_master_disable_power(void); -uint8_t dyn_master_is_power_enabled(void); -uint8_t dyn_master_ping(uint8_t id); -uint8_t dyn2_master_ping(uint8_t id); -uint8_t dyn_master_read_byte(uint8_t id,uint8_t address,uint8_t *data); -uint8_t dyn2_master_read_byte(uint8_t id,uint16_t address,uint8_t *data); -uint8_t dyn_master_read_word(uint8_t id,uint8_t address,uint16_t *data); -uint8_t dyn2_master_read_word(uint8_t id,uint16_t address,uint16_t *data); -uint8_t dyn_master_read_table(uint8_t id,uint8_t address,uint8_t length,uint8_t *data); -uint8_t dyn2_master_read_table(uint8_t id,uint16_t address,uint16_t length,uint8_t *data); -uint8_t dyn_master_write_byte(uint8_t id, uint8_t address, uint8_t data); -uint8_t dyn2_master_write_byte(uint8_t id, uint16_t address, uint8_t data); -uint8_t dyn_master_write_word(uint8_t id, uint8_t address, uint16_t data); -uint8_t dyn2_master_write_word(uint8_t id, uint16_t address, uint16_t data); -uint8_t dyn_master_write_table(uint8_t id, uint8_t address, uint8_t length, uint8_t *data); -uint8_t dyn2_master_write_table(uint8_t id, uint16_t address, uint16_t length, uint8_t *data); -uint8_t dyn_master_reg_write(uint8_t id, uint8_t address, uint8_t length, uint8_t *data); -uint8_t dyn2_master_reg_write(uint8_t id, uint16_t address, uint16_t length, uint8_t *data); -uint8_t dyn_master_action(void); -uint8_t dyn2_master_action(void); -uint8_t dyn_master_sync_write(uint8_t num,uint8_t *ids,uint8_t address, uint8_t length, TWriteData *data); -uint8_t dyn2_master_sync_write(uint8_t num,uint8_t *ids,uint16_t address, uint16_t length, TWriteData *data); -uint8_t dyn_master_bulk_read(uint8_t num,uint8_t *ids,uint8_t *address, uint8_t *length, TWriteData *data); -// repeater functions -uint8_t dyn_master_resend_inst_packet(uint8_t *inst_packet, uint8_t *status_packet); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/dynamixel_slave_uart_dma.h b/include/dynamixel_slave_uart_dma.h deleted file mode 100644 index 65cb4be5fb5ccfe4893d169a872259a830292d0e..0000000000000000000000000000000000000000 --- a/include/dynamixel_slave_uart_dma.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef _DYNAMIXEL_SLAVE_UART_DMA_H -#define _DYNAXIXEL_SLAVE_UART_DMA_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "dynamixel.h" -#include "dynamixel2.h" -#include "stm32f4xx.h" - -// public functions -void dyn_slave_init(void); -inline void dyn_slave_set_address(uint8_t id); -inline uint8_t dyn_slave_get_address(void); -inline void dyn_slave_set_return_delay(uint8_t delay); -inline void dyn_slave_set_return_level(uint8_t level); -inline uint8_t dyn_slave_get_return_level(void); -uint8_t dyn_slave_is_packet_ready(void); -TDynVersion dyn_slave_get_inst_packet(uint8_t *packet); -void dyn_slave_send_status_packet(uint8_t error,uint16_t length, uint8_t *data); -void dyn_slave_resend_status_packet(uint8_t *packet); -void dyn_slave_reset(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/motion_manager.h b/include/motion_manager.h index 53867960691ae5878f479b8aab349b44fddb64e6..24441227d7f133f7cadb49a9356d8acbaeb9c736 100644 --- a/include/motion_manager.h +++ b/include/motion_manager.h @@ -7,13 +7,20 @@ extern "C" { #include "stm32f4xx_hal.h" -#define MANAGER_MAX_NUM_SERVOS 31 - typedef enum{MM_NONE = 0, MM_ACTION = 1, MM_WALKING = 2, MM_JOINTS = 3} TModules; +typedef struct +{ + void (*process_fnct)(void); + void (*init_fnct)(void); + uint8_t name[16]; +}TMotionModule; + +#define MAX_MOTION_MODULES 8 + // servo information structure typedef struct{ uint8_t id; @@ -32,12 +39,15 @@ typedef struct{ uint8_t dyn_version; }TServoInfo; +#define MANAGER_MAX_NUM_SERVOS 31 + // public variables extern int64_t manager_current_angles[MANAGER_MAX_NUM_SERVOS]; // public functions void manager_init(uint16_t period_us); inline uint16_t manager_get_period(void); +inline uint16_t manager_get_period_us(void); inline void manager_set_period(uint16_t period_us); inline void manager_enable(void); inline void manager_disable(void); @@ -52,6 +62,8 @@ inline void manager_disable_servo(uint8_t servo_id); inline uint8_t manager_is_servo_enabled(uint8_t servo_id); inline int16_t manager_get_cw_angle_limit(uint8_t servo_id); inline int16_t manager_get_ccw_angle_limit(uint8_t servo_id); +// motion modules handling +//void manager_add_module( // operation functions uint8_t manager_in_range(unsigned short int address, unsigned short int length); void manager_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data); diff --git a/src/bioloid_dyn_master_sensors.c b/src/bioloid_dyn_master_sensors.c index 6c0a87e50496688facbc03e05ee497c648530250..afdee1c8d987ba420e1fab456f69e2af438eb718 100755 --- a/src/bioloid_dyn_master_sensors.c +++ b/src/bioloid_dyn_master_sensors.c @@ -72,7 +72,7 @@ void bioloid_dyn_master_sensors_init(void) priorities.dma_tx_subpriority=2; usart2_init(&bioloid_dyn_master_sensors_comm,&Init,&priorities); - dyn_master_init(&bioloid_dyn_master_sensors,&bioloid_dyn_master_sensors_comm); + dyn_master_init(&bioloid_dyn_master_sensors,&bioloid_dyn_master_sensors_comm,DYN_VER1); bioloid_dyn_master_sensors.set_rx_mode=bioloid_dyn_master_sensors_set_rx_mode; bioloid_dyn_master_sensors.set_tx_mode=bioloid_dyn_master_sensors_set_tx_mode; diff --git a/src/bioloid_dyn_master_servos.c b/src/bioloid_dyn_master_servos.c index b4ac7e7c1cf85ce92e139801c2d3d9108b7f40b4..c4c3d4f3800923c595d7e5a75206a98ee247f190 100755 --- a/src/bioloid_dyn_master_servos.c +++ b/src/bioloid_dyn_master_servos.c @@ -83,7 +83,7 @@ void bioloid_dyn_master_servos_init(void) priorities.dma_tx_subpriority=2; usart1_init(&bioloid_dyn_master_servos_comm,&Init,&priorities); - dyn_master_init(&bioloid_dyn_master_servos,&bioloid_dyn_master_servos_comm); + dyn_master_init(&bioloid_dyn_master_servos,&bioloid_dyn_master_servos_comm,DYN_VER1); bioloid_dyn_master_servos.set_rx_mode=bioloid_dyn_master_servos_set_rx_mode; bioloid_dyn_master_servos.set_tx_mode=bioloid_dyn_master_servos_set_tx_mode; diff --git a/src/bioloid_dyn_slave.c b/src/bioloid_dyn_slave.c index 42305946679fd3738154e7f88622b3eede4c5207..d117a2655d1259dd54b17bf820aac020303a5c94 100644 --- a/src/bioloid_dyn_slave.c +++ b/src/bioloid_dyn_slave.c @@ -135,7 +135,7 @@ void bioloid_dyn_slave_init(void) priorities.dma_tx_subpriority=0; usart3_init(&bioloid_dyn_slave_comm,&bioloid_comm_init,&priorities); - dyn_slave_init(&bioloid_dyn_slave,&bioloid_dyn_slave_comm,ram_data[BIOLOID_ID]); + dyn_slave_init(&bioloid_dyn_slave,&bioloid_dyn_slave_comm,ram_data[BIOLOID_ID],DYN_VER1); bioloid_dyn_slave.on_read=bioloid_on_read; bioloid_dyn_slave.on_write=bioloid_on_write; dyn_slave_set_return_delay(&bioloid_dyn_slave,ram_data[BIOLOID_RETURN_DELAY_TIME]); diff --git a/src/dynamixel_master_uart_dma.c b/src/dynamixel_master_uart_dma.c deleted file mode 100755 index a5b515e0225544235f3ea87265bcada689bbfc85..0000000000000000000000000000000000000000 --- a/src/dynamixel_master_uart_dma.c +++ /dev/null @@ -1,979 +0,0 @@ -#include "dynamixel_master_uart_dma.h" -#include "motion_manager.h" -#include "stm32_time.h" - -#define USART USART2 -#define USART_CLK RCC_APB1Periph_USART2 -#define USART_CLK_INIT RCC_APB1PeriphClockCmd -#define USART_IRQn USART2_IRQn -#define USART_IRQHandler USART2_IRQHandler - -#define USART_TX_PIN GPIO_Pin_2 -#define USART_TX_GPIO_PORT GPIOA -#define USART_TX_GPIO_CLK RCC_AHB1Periph_GPIOA -#define USART_TX_SOURCE GPIO_PinSource2 -#define USART_TX_AF GPIO_AF_USART2 - -#define USART_RX_PIN GPIO_Pin_3 -#define USART_RX_GPIO_PORT GPIOA -#define USART_RX_GPIO_CLK RCC_AHB1Periph_GPIOA -#define USART_RX_SOURCE GPIO_PinSource3 -#define USART_RX_AF GPIO_AF_USART2 - -#define USART_TX_EN_PIN GPIO_Pin_1 -#define USART_TX_EN_GPIO_PORT GPIOA -#define USART_TX_EN_GPIO_CLK RCC_AHB1Periph_GPIOA -#define USART_TX_EN_SOURCE GPIO_PinSource1 - -#define USART_RX_EN_PIN GPIO_Pin_0 -#define USART_RX_EN_GPIO_PORT GPIOA -#define USART_RX_EN_GPIO_CLK RCC_AHB1Periph_GPIOA -#define USART_RX_EN_SOURCE GPIO_PinSource0 - -/* DMA configuration */ -#define USART_DR_ADDRESS ((uint32_t)USART2 + 0x04) -#define USART_DMA DMA1 -#define USART_DMA_CLK RCC_AHB1Periph_DMA1 - -#define USART_TX_DMA_CHANNEL DMA_Channel_4 -#define USART_TX_DMA_STREAM DMA1_Stream6 -#define USART_TX_DMA_FLAG_FEIF DMA_FLAG_FEIF6 -#define USART_TX_DMA_FLAG_DMEIF DMA_FLAG_DMEIF6 -#define USART_TX_DMA_FLAG_TEIF DMA_FLAG_TEIF6 -#define USART_TX_DMA_FLAG_HTIF DMA_FLAG_HTIF6 -#define USART_TX_DMA_FLAG_TCIF DMA_FLAG_TCIF6 - -#define USART_RX_DMA_CHANNEL DMA_Channel_4 -#define USART_RX_DMA_STREAM DMA1_Stream5 -#define USART_RX_DMA_FLAG_FEIF DMA_FLAG_FEIF5 -#define USART_RX_DMA_FLAG_DMEIF DMA_FLAG_DMEIF5 -#define USART_RX_DMA_FLAG_TEIF DMA_FLAG_TEIF5 -#define USART_RX_DMA_FLAG_HTIF DMA_FLAG_HTIF5 -#define USART_RX_DMA_FLAG_TCIF DMA_FLAG_TCIF5 - -#define USART_DMA_TX_IRQn DMA1_Stream6_IRQn -#define USART_DMA_RX_IRQn DMA1_Stream5_IRQn -#define USART_DMA_TX_IRQHandler DMA1_Stream6_IRQHandler -#define USART_DMA_RX_IRQHandler DMA1_Stream5_IRQHandler - -#define POWER_GPIO_CLK RCC_AHB1Periph_GPIOB -#define POWER_PIN GPIO_Pin_2 -#define POWER_GPIO_PORT GPIOB -#define POWER_SOURCE GPIO_PinSource2 - - -#define MAX_BUFFER_LEN 1024 - -// private variables -uint8_t dyn_master_version; -uint16_t dyn_master_timeout;// answer reception timeout -// input buffer -uint8_t dyn_master_rx_buffer[MAX_BUFFER_LEN]; -// output buffer -uint8_t dyn_master_tx_buffer[MAX_BUFFER_LEN]; -// instruction packet ready flag -volatile uint8_t dyn_master_packet_ready; -// sending status packet flag -volatile uint8_t dyn_master_sending_packet; -// no answer for sync write operation -uint8_t dyn_master_no_answer; -// power enabled variable -uint8_t dyn_master_power_enabled; -// number of packets to receive -uint8_t dyn_master_num_read_packets; -uint8_t dyn_master_packet_length; -// DMA initialization data structures -DMA_InitTypeDef DMA_TX_InitStructure; -DMA_InitTypeDef DMA_RX_InitStructure; - -// private functions -void dyn_master_reset(void) -{ - /* Reset reception */ - USART_DMACmd(USART, USART_DMAReq_Rx, DISABLE); - DMA_Cmd(USART_RX_DMA_STREAM,DISABLE); - /* wait until the transaction ends */ - DMA_ClearFlag(USART_RX_DMA_STREAM,USART_RX_DMA_FLAG_TCIF); - DMA_ClearITPendingBit(USART_RX_DMA_STREAM,USART_RX_DMA_FLAG_TCIF); - /* clear any pending data */ - USART_ReceiveData(USART); - /* Reset transmission */ - USART_DMACmd(USART, USART_DMAReq_Tx, DISABLE); - DMA_Cmd(USART_TX_DMA_STREAM,DISABLE); - DMA_ClearFlag(USART_TX_DMA_STREAM,USART_TX_DMA_FLAG_TCIF); - DMA_ClearITPendingBit(USART_TX_DMA_STREAM,USART_TX_DMA_FLAG_TCIF); - USART_ITConfig(USART, USART_IT_TC, DISABLE); - /* Reset variables */ - dyn_master_packet_ready=0x00; - dyn_master_sending_packet=0x00; -} - -uint8_t dyn_master_wait_sending(void) -{ - uint16_t timeout_left=dyn_master_timeout*1000; - - while(dyn_master_sending_packet) - { - delay_us(100); - timeout_left-=100; - if(timeout_left<=0) - { - dyn_master_reset(); - return DYN_TIMEOUT; - } - } - - return DYN_SUCCESS; -} - -uint8_t dyn_master_send(void) -{ - uint8_t error; - - dyn_master_version=1; - // wait until any previous transmission ends - if((error=dyn_master_wait_sending())!=DYN_SUCCESS) - return error; - // set the DMA transfer - DMA_SetCurrDataCounter(USART_TX_DMA_STREAM,dyn_get_length(dyn_master_tx_buffer)+4); - DMA_Cmd(USART_TX_DMA_STREAM,ENABLE); - USART_ClearFlag(USART,USART_FLAG_TC); - USART_ClearITPendingBit(USART,USART_FLAG_TC); - USART_DMACmd(USART, USART_DMAReq_Tx, ENABLE); - dyn_master_sending_packet=0x01; - return error; - -} - -uint8_t dyn2_master_send(void) -{ - uint8_t error; - - dyn_master_version=2; - // wait until any previous transmission ends - if((error=dyn_master_wait_sending())!=DYN_SUCCESS) - return error; - // set the DMA transfer - DMA_SetCurrDataCounter(USART_TX_DMA_STREAM,dyn2_get_length(dyn_master_tx_buffer)+7); - DMA_Cmd(USART_TX_DMA_STREAM,ENABLE); - USART_ClearFlag(USART,USART_FLAG_TC); - USART_ClearITPendingBit(USART,USART_FLAG_TC); - USART_DMACmd(USART, USART_DMAReq_Tx, ENABLE); - dyn_master_sending_packet=0x01; - return error; -} - -uint8_t dyn_master_receive(void) -{ - uint16_t timeout_left=dyn_master_timeout*1000; - - // wait for the status packet - while(!dyn_master_packet_ready) - { - delay_us(100); - timeout_left-=100; - if(timeout_left<=0) - { - dyn_master_reset(); - return DYN_TIMEOUT; - } - } - dyn_master_packet_ready=0x00; - // check the input packet checksum - if(dyn_check_checksum(dyn_master_rx_buffer)==0xFF) - return dyn_get_status_error(dyn_master_rx_buffer); - else - { - dyn_master_reset(); - return DYN_CHECKSUM_ERROR; - } -} - -uint8_t dyn2_master_receive(void) -{ - uint16_t timeout_left=dyn_master_timeout*1000; - - // wait for the status packet - while(!dyn_master_packet_ready) - { - delay_us(100); - timeout_left-=100; - if(timeout_left<=0) - { - dyn_master_reset(); - return DYN_TIMEOUT; - } - } - dyn_master_packet_ready=0x00; - // check the input packet checksum - if(dyn2_check_checksum(dyn_master_rx_buffer)==0x01) - return dyn2_get_status_error(dyn_master_rx_buffer); - else - { - dyn_master_reset(); - return DYN_CHECKSUM_ERROR; - } -} - -void dyn_master_enable_tx(void) -{ - GPIO_ResetBits(USART_RX_EN_GPIO_PORT, USART_RX_EN_PIN); - GPIO_SetBits(USART_TX_EN_GPIO_PORT, USART_TX_EN_PIN); -} - -void dyn_master_enable_rx(void) -{ - GPIO_ResetBits(USART_TX_EN_GPIO_PORT, USART_TX_EN_PIN); - GPIO_SetBits(USART_RX_EN_GPIO_PORT, USART_RX_EN_PIN); -} - -uint8_t dyn_master_read(uint8_t id,uint8_t address,uint8_t length,uint8_t *data) -{ - uint8_t error; - - /* generate the read packet */ - dyn_init_read_packet(dyn_master_tx_buffer,id,address,length); - dyn_master_num_read_packets=0x01; - // enable transmission - dyn_master_enable_tx(); - // send the data - if((error=dyn_master_send())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - // wait for the transmission to end - if((error=dyn_master_wait_sending())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - dyn_master_enable_rx(); - // wait for the replay within the given timeout - error=dyn_master_receive(); - if(error==DYN_NO_ERROR) - dyn_get_read_status_data(dyn_master_rx_buffer,data);// read the data from the status packet - else - dyn_master_reset(); - return error; -} - -uint8_t dyn2_master_read(uint8_t id,uint16_t address,uint16_t length,uint8_t *data) -{ - uint8_t error; - - /* generate the read packet */ - dyn2_init_read_packet(dyn_master_tx_buffer,id,address,length); - dyn_master_num_read_packets=0x01; - // enable transmission - dyn_master_enable_tx(); - // send the data - if((error=dyn2_master_send())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - // wait for the transmission to end - if((error=dyn_master_wait_sending())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - dyn_master_enable_rx(); - // wait for the replay within the given timeout - error=dyn2_master_receive(); - if(error==DYN_NO_ERROR) - dyn2_get_read_status_data(dyn_master_rx_buffer,data);// read the data from the status packet - else - dyn_master_reset(); - return error; -} - -uint8_t dyn_master_write(uint8_t id, uint8_t address, uint8_t length, uint8_t *data) -{ - uint8_t error; - - // generate the read packet for the desired device - dyn_init_write_packet(dyn_master_tx_buffer,id,address,length,data); - dyn_master_num_read_packets=0x01; - // enable transmission - dyn_master_enable_tx(); - // send the data - if((error=dyn_master_send())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - // wait for the transmission to end - if((error=dyn_master_wait_sending())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - dyn_master_enable_rx(); - // wait for the replay within the given timeout - error=dyn_master_receive(); - if(error!=DYN_NO_ERROR) - dyn_master_reset(); - return error; -} - -uint8_t dyn2_master_write(uint8_t id, uint16_t address, uint16_t length, uint8_t *data) -{ - uint8_t error; - - // generate the read packet for the desired device - dyn2_init_write_packet(dyn_master_tx_buffer,id,address,length,data); - dyn_master_num_read_packets=0x01; - // enable transmission - dyn_master_enable_tx(); - // send the data - if((error=dyn2_master_send())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - // wait for the transmission to end - if((error=dyn_master_wait_sending())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - dyn_master_enable_rx(); - // wait for the replay within the given timeout - error=dyn2_master_receive(); - if(error!=DYN_NO_ERROR) - dyn_master_reset(); - return error; -} - -// interrupt handlers -void USART_IRQHandler(void) -{ - static uint8_t num_bytes=0; - uint8_t data; - - if(USART_GetITStatus(USART, USART_IT_RXNE) != RESET) - { - USART_ClearFlag(USART,USART_FLAG_RXNE); - data=USART_ReceiveData(USART); - switch(num_bytes) - { - case 0: if(data==0xFF) - { - dyn_master_rx_buffer[num_bytes]=data; - num_bytes++; - } - break; - case 1: if(data==0xFF) - { - dyn_master_rx_buffer[num_bytes]=data; - num_bytes++; - } - else num_bytes--; - break; - case 2: if(data!=0xFF) - { - dyn_master_rx_buffer[num_bytes]=data; - num_bytes++; - } - break; - case 3: dyn_master_rx_buffer[num_bytes]=data; - num_bytes=0; - /* disable USART RX interrupts */ - USART_ITConfig(USART,USART_IT_RXNE,DISABLE); - /* enable DMA RX */ - DMA_RX_InitStructure.DMA_BufferSize = data; - DMA_RX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&dyn_master_rx_buffer[dyn_master_packet_length+4]; - dyn_master_packet_length+=data+4; - DMA_Init(USART_RX_DMA_STREAM,&DMA_RX_InitStructure); - DMA_Cmd(USART_RX_DMA_STREAM,ENABLE); - USART_DMACmd(USART, USART_DMAReq_Rx, ENABLE); - break; - default: break; - } - } - else if(USART_GetITStatus(USART, USART_IT_TC) != RESET) - { - USART_ClearFlag(USART,USART_FLAG_TC); - USART_ITConfig(USART, USART_IT_TC, DISABLE); - dyn_master_sending_packet=0x00; - if(dyn_master_no_answer) - dyn_master_no_answer=0x00; - else - { - /* enable RX interrupts */ - USART_ITConfig(USART, USART_IT_RXNE, ENABLE); - } - } -} - -void USART_DMA_TX_IRQHandler(void) -{ - DMA_Cmd(USART_TX_DMA_STREAM,DISABLE); - DMA_ClearFlag(USART_TX_DMA_STREAM,USART_TX_DMA_FLAG_TCIF); - DMA_ClearITPendingBit(USART_TX_DMA_STREAM,USART_TX_DMA_FLAG_TCIF); - USART_DMACmd(USART, USART_DMAReq_Tx, DISABLE); - USART_ITConfig(USART, USART_IT_TC, ENABLE); -} - -void USART_DMA_RX_IRQHandler(void) -{ - DMA_Cmd(USART_RX_DMA_STREAM,DISABLE); - DMA_ClearFlag(USART_RX_DMA_STREAM,USART_RX_DMA_FLAG_TCIF); - DMA_ClearITPendingBit(USART_RX_DMA_STREAM,USART_RX_DMA_FLAG_TCIF); - USART_DMACmd(USART, USART_DMAReq_Rx, DISABLE); - dyn_master_num_read_packets--; - if(dyn_master_num_read_packets==0x00) - { - dyn_master_packet_length=0x00; - dyn_master_packet_ready=0x01; - } - else - { - /* enable RX interrupts */ - USART_ITConfig(USART, USART_IT_RXNE, ENABLE); - } -} - -// dynamixel master functions -void dyn_master_init(void) -{ - uint16_t i; - GPIO_InitTypeDef GPIO_InitStructure; - NVIC_InitTypeDef NVIC_InitStructure; - USART_InitTypeDef USART_InitStructure; - - /* Enable GPIO clock */ - USART_CLK_INIT(USART_CLK, ENABLE); - RCC_AHB1PeriphClockCmd(USART_TX_GPIO_CLK | USART_RX_GPIO_CLK | USART_TX_EN_GPIO_CLK | USART_RX_EN_GPIO_CLK, ENABLE); - RCC_AHB1PeriphClockCmd(POWER_GPIO_CLK, ENABLE); - // configure the GPIO pins - - /* Connect USART pins to AF7 */ - GPIO_PinAFConfig(USART_TX_GPIO_PORT, USART_TX_SOURCE, USART_TX_AF); - GPIO_PinAFConfig(USART_RX_GPIO_PORT, USART_RX_SOURCE, USART_RX_AF); - - /* Configure USART Tx and Rx as alternate function push-pull */ - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Pin = USART_TX_PIN; - GPIO_Init(USART_TX_GPIO_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = USART_RX_PIN; - GPIO_Init(USART_RX_GPIO_PORT, &GPIO_InitStructure); - - /* configure the control pins */ - GPIO_InitStructure.GPIO_Pin = USART_TX_EN_PIN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_Init(USART_TX_EN_GPIO_PORT, &GPIO_InitStructure); - GPIO_InitStructure.GPIO_Pin = USART_RX_EN_PIN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_Init(USART_RX_EN_GPIO_PORT, &GPIO_InitStructure); - - dyn_master_enable_rx(); - - dyn_master_timeout=0x00; - // initialize the buffers - for(i=0;i<MAX_BUFFER_LEN;i++) - { - dyn_master_rx_buffer[i]=0x00; - dyn_master_tx_buffer[i]=0x00; - } - // initialize the flags - dyn_master_packet_ready=0x00; - dyn_master_sending_packet=0x00; - dyn_master_no_answer=0x00; - dyn_master_num_read_packets=0x00; - dyn_master_packet_length=0x00; - dyn_master_version=1; - - USART_DeInit(USART); - USART_StructInit(&USART_InitStructure); - // configure the serial port - USART_InitStructure.USART_BaudRate = 1000000; - USART_InitStructure.USART_WordLength = USART_WordLength_8b; - USART_InitStructure.USART_StopBits = USART_StopBits_1; - USART_InitStructure.USART_Parity = USART_Parity_No; - USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - USART_Init(USART, &USART_InitStructure); - NVIC_InitStructure.NVIC_IRQChannel = USART_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - USART_ITConfig(USART, USART_IT_RXNE | - USART_IT_ORE | - USART_IT_TXE | - USART_IT_CTS | - USART_IT_LBD | - USART_IT_IDLE | - USART_IT_PE | - USART_IT_ERR | - USART_IT_TC, DISABLE); - - /* Clear all USART interrupt flags */ - USART_ClearFlag(USART,USART_FLAG_RXNE | - USART_FLAG_ORE | - USART_FLAG_TXE | - USART_FLAG_CTS | - USART_FLAG_LBD | - USART_FLAG_IDLE | - USART_FLAG_PE | - USART_FLAG_TC); - - /* Clear all USART interrupt pending bits */ - USART_ClearITPendingBit(USART, USART_FLAG_RXNE | - USART_FLAG_ORE | - USART_FLAG_TXE | - USART_FLAG_CTS | - USART_FLAG_LBD | - USART_FLAG_IDLE | - USART_FLAG_PE | - USART_FLAG_TC); - - // configure the DMA channels - /* Configure TX DMA */ - RCC_AHB1PeriphClockCmd(USART_DMA_CLK, ENABLE); - DMA_DeInit(USART_TX_DMA_STREAM); - DMA_TX_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; - DMA_TX_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; - DMA_TX_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; - DMA_TX_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; - DMA_TX_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - DMA_TX_InitStructure.DMA_Mode = DMA_Mode_Normal; - DMA_TX_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) (&(USART->DR)); - DMA_TX_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; - DMA_TX_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; - DMA_TX_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - DMA_TX_InitStructure.DMA_Priority = DMA_Priority_High; - DMA_TX_InitStructure.DMA_Channel = USART_TX_DMA_CHANNEL; - DMA_TX_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; - DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dyn_master_tx_buffer; - DMA_Init(USART_TX_DMA_STREAM,&DMA_TX_InitStructure); - /* initialize DMA interrupts */ - NVIC_InitStructure.NVIC_IRQChannel = USART_DMA_TX_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - DMA_ITConfig(USART_TX_DMA_STREAM,DMA_IT_TC,ENABLE); - DMA_ITConfig(USART_TX_DMA_STREAM,DMA_IT_HT | DMA_IT_TE | DMA_IT_FE | DMA_IT_DME,DISABLE); - - /* Configure RX DMA */ - DMA_DeInit(USART_RX_DMA_STREAM); - DMA_RX_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; - DMA_RX_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; - DMA_RX_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; - DMA_RX_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; - DMA_RX_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - DMA_RX_InitStructure.DMA_Mode = DMA_Mode_Normal; - DMA_RX_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) (&(USART->DR)); - DMA_RX_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; - DMA_RX_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; - DMA_RX_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - DMA_RX_InitStructure.DMA_Priority = DMA_Priority_High; - DMA_RX_InitStructure.DMA_Channel = USART_RX_DMA_CHANNEL; - DMA_RX_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; - DMA_RX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&dyn_master_rx_buffer[4]; - DMA_Init(USART_RX_DMA_STREAM,&DMA_RX_InitStructure); - /* initialize DMA interrupts */ - NVIC_InitStructure.NVIC_IRQChannel = USART_DMA_RX_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - DMA_ITConfig(USART_RX_DMA_STREAM,DMA_IT_TC,ENABLE); - DMA_ITConfig(USART_RX_DMA_STREAM,DMA_IT_HT | DMA_IT_TE | DMA_IT_FE | DMA_IT_DME,DISABLE); - - /* Enable the USART2 */ - USART_Cmd(USART, ENABLE); - - // initialize the power enable gpio - GPIO_InitStructure.GPIO_Pin = POWER_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(POWER_GPIO_PORT, &GPIO_InitStructure); - - dyn_master_disable_power(); -} - -void dyn_master_set_timeout(uint16_t timeout_ms) -{ - // save the desired timeout value - dyn_master_timeout=timeout_ms; -} - -void dyn_master_scan(uint8_t *num,uint8_t *ids) -{ - uint8_t i; - - for(i=0;i<MANAGER_MAX_NUM_SERVOS;i++) - ids[0]=0; - *num=0; - for(i=0;i<254;i++) - { - if(dyn_master_ping(i)==DYN_NO_ERROR)// the device exists - { - ids[*num]=i; - (*num)++; - } - } -} - -void dyn2_master_scan(uint8_t *num,uint8_t *ids) -{ - uint8_t i; - - for(i=0;i<MANAGER_MAX_NUM_SERVOS;i++) - ids[0]=0; - *num=0; - for(i=0;i<254;i++) - { - if(dyn2_master_ping(i)==DYN_NO_ERROR)// the device exists - { - ids[*num]=i; - (*num)++; - } - } -} - -inline void dyn_master_enable_power(void) -{ - GPIO_SetBits(POWER_GPIO_PORT,POWER_PIN); - dyn_master_power_enabled=0x01; -} - -inline void dyn_master_disable_power(void) -{ - GPIO_ResetBits(POWER_GPIO_PORT,POWER_PIN); - dyn_master_power_enabled=0x00; -} - -uint8_t dyn_master_is_power_enabled(void) -{ - return dyn_master_power_enabled; -} - -uint8_t dyn_master_ping(uint8_t id) -{ - uint8_t error; - - // generate the ping packet for the desired device - dyn_init_ping_packet(dyn_master_tx_buffer,id); - dyn_master_num_read_packets=0x01; - // enable transmission - dyn_master_enable_tx(); - // send the data - if((error=dyn_master_send())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - // wait for the transmission to end - if((error=dyn_master_wait_sending())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - dyn_master_enable_rx(); - // wait for the replay within the given timeout - error=dyn_master_receive(); - return error; -} - -uint8_t dyn2_master_ping(uint8_t id) -{ - uint8_t error; - - // generate the ping packet for the desired device - dyn2_init_ping_packet(dyn_master_tx_buffer,id); - dyn_master_num_read_packets=0x01; - // enable transmission - dyn_master_enable_tx(); - // send the data - if((error=dyn2_master_send())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - // wait for the transmission to end - if((error=dyn_master_wait_sending())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - dyn_master_enable_rx(); - // wait for the replay within the given timeout - error=dyn2_master_receive(); - return error; -} - -uint8_t dyn_master_read_byte(uint8_t id,uint8_t address,uint8_t *data) -{ - return dyn_master_read(id,address,1,data); -} - -uint8_t dyn2_master_read_byte(uint8_t id,uint16_t address,uint8_t *data) -{ - return dyn2_master_read(id,address,1,data); -} - -uint8_t dyn_master_read_word(uint8_t id,uint8_t address,uint16_t *data) -{ - uint8_t value[2]; - uint8_t error; - - error=dyn_master_read(id,address,2,value); - if(error==DYN_NO_ERROR) - (*data)=value[0]+value[1]*256; - - return error; -} - -uint8_t dyn2_master_read_word(uint8_t id,uint16_t address,uint16_t *data) -{ - uint8_t value[2]; - uint8_t error; - - error=dyn2_master_read(id,address,2,value); - if(error==DYN_NO_ERROR) - (*data)=value[0]+value[1]*256; - - return error; -} - -uint8_t dyn_master_read_table(uint8_t id,uint8_t address,uint8_t length,uint8_t *data) -{ - return dyn_master_read(id,address,length,data); -} - -uint8_t dyn2_master_read_table(uint8_t id,uint16_t address,uint16_t length,uint8_t *data) -{ - return dyn2_master_read(id,address,length,data); -} - -uint8_t dyn_master_write_byte(uint8_t id, uint8_t address, uint8_t data) -{ - return dyn_master_write(id,address,1,&data); -} - -uint8_t dyn2_master_write_byte(uint8_t id, uint16_t address, uint8_t data) -{ - return dyn2_master_write(id,address,1,&data); -} - -uint8_t dyn_master_write_word(uint8_t id, uint8_t address, uint16_t data) -{ - uint8_t value[2]; - - value[0]=data%256; - value[1]=data/256; - return dyn_master_write(id,address,2,value); -} - -uint8_t dyn2_master_write_word(uint8_t id, uint16_t address, uint16_t data) -{ - uint8_t value[2]; - - value[0]=data%256; - value[1]=data/256; - return dyn2_master_write(id,address,2,value); -} - -uint8_t dyn_master_write_table(uint8_t id, uint8_t address, uint8_t length, uint8_t *data) -{ - return dyn_master_write(id,address,length,data); -} - -uint8_t dyn2_master_write_table(uint8_t id, uint16_t address, uint16_t length, uint8_t *data) -{ - return dyn2_master_write(id,address,length,data); -} - -uint8_t dyn_master_reg_write(uint8_t id, uint8_t address, uint8_t length, uint8_t *data) -{ - uint8_t error; - - // generate the ping packet for the desired device - dyn_init_reg_write_packet(dyn_master_tx_buffer,id,address,length,data); - dyn_master_num_read_packets=0x01; - // enable transmission - dyn_master_enable_tx(); - // send the data - if((error=dyn_master_send())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - // wait for the transmission to end - if((error=dyn_master_wait_sending())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - dyn_master_enable_rx(); - // wait for the replay within the given timeout - error=dyn_master_receive(); - return error; -} - -uint8_t dyn2_master_reg_write(uint8_t id, uint16_t address, uint16_t length, uint8_t *data) -{ - uint8_t error; - - // generate the ping packet for the desired device - dyn2_init_reg_write_packet(dyn_master_tx_buffer,id,address,length,data); - dyn_master_num_read_packets=0x01; - // enable transmission - dyn_master_enable_tx(); - // send the data - if((error=dyn2_master_send())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - // wait for the transmission to end - if((error=dyn_master_wait_sending())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - dyn_master_enable_rx(); - // wait for the replay within the given timeout - error=dyn2_master_receive(); - return error; -} - -uint8_t dyn_master_action(void) -{ - dyn_master_no_answer=0x01; - // generate the ping packet for the desired device - dyn_init_action_packet(dyn_master_tx_buffer); - // enable transmission - dyn_master_enable_tx(); - // send the data - return dyn_master_send(); -} - -uint8_t dyn2_master_action(void) -{ - dyn_master_no_answer=0x01; - // generate the ping packet for the desired device - dyn2_init_action_packet(dyn_master_tx_buffer); - // enable transmission - dyn_master_enable_tx(); - // send the data - return dyn2_master_send(); -} - -uint8_t dyn_master_sync_write(uint8_t num,uint8_t *ids,uint8_t address, uint8_t length, TWriteData *data) -{ - dyn_master_no_answer=0x01; - // generate the sync write packet - dyn_init_sync_write_packet(dyn_master_tx_buffer,num,ids,address,length,data); - // enable transmission - dyn_master_enable_tx(); - // send the data - return dyn_master_send(); -} - -uint8_t dyn2_master_sync_write(uint8_t num,uint8_t *ids,uint16_t address, uint16_t length, TWriteData *data) -{ - dyn_master_no_answer=0x01; - // generate the sync write packet - dyn2_init_sync_write_packet(dyn_master_tx_buffer,num,ids,address,length,data); - // enable transmission - dyn_master_enable_tx(); - // send the data - return dyn2_master_send(); -} - -// repeater functions -uint8_t dyn_master_resend_inst_packet(uint8_t *inst_packet, uint8_t *status_packet) -{ - uint8_t error; - - // copy the contents of the instruction packet to the output buffer - dyn_copy_packet(inst_packet,dyn_master_tx_buffer); - dyn_master_num_read_packets=0x01; - // enable transmission - dyn_master_enable_tx(); - // send the data - if((error=dyn_master_send())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - // wait for the transmission to end - if((error=dyn_master_wait_sending())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - dyn_master_enable_rx(); - // wait for the replay within the given timeout - error=dyn_master_receive(); - if(error!=DYN_TIMEOUT) - { - // copy the contents of the status of the packet to the output buffer - dyn_copy_packet(dyn_master_rx_buffer,status_packet); - } - - return error; -} - -uint8_t dyn_master_bulk_read(uint8_t num,uint8_t *ids,uint8_t *address,uint8_t *length,TWriteData *data) -{ - uint16_t offset=0; - uint8_t i,error; - - dyn_master_num_read_packets=num; - // generate the sync write packet - dyn_init_bulk_read_packet(dyn_master_tx_buffer,num,ids,address,length); - // enable transmission - dyn_master_enable_tx(); - // send the data - if((error=dyn_master_send())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - // wait for the transmission to end - if((error=dyn_master_wait_sending())!=DYN_SUCCESS) - { - dyn_master_enable_rx(); - return error; - } - dyn_master_enable_rx(); - // wait for the replay within the given timeout - error=dyn_master_receive(); - if(error!=DYN_NO_ERROR) - { - dyn_master_reset(); - return error; - } - for(i=0;i<num;i++) - { - error=dyn_get_status_error(&dyn_master_rx_buffer[offset]); - if(error!=DYN_NO_ERROR) - return error; - offset+=dyn_get_read_status_data(&dyn_master_rx_buffer[offset],data[i].data_addr)+4; - } - - return DYN_SUCCESS; -} - - diff --git a/src/dynamixel_slave_uart_dma.c b/src/dynamixel_slave_uart_dma.c deleted file mode 100644 index 3fb16778cc9fb565b29d476ed72e241754166ddc..0000000000000000000000000000000000000000 --- a/src/dynamixel_slave_uart_dma.c +++ /dev/null @@ -1,404 +0,0 @@ -#include "dynamixel_slave_uart_dma.h" - -#define DYN_SLAVE USART3 -#define DYN_SLAVE_CLK RCC_APB1Periph_USART3 -#define DYN_SLAVE_CLK_INIT RCC_APB1PeriphClockCmd -#define DYN_SLAVE_IRQn USART3_IRQn -#define DYN_SLAVE_IRQHandler USART3_IRQHandler - -#define DYN_SLAVE_TX_PIN GPIO_Pin_10 -#define DYN_SLAVE_TX_GPIO_PORT GPIOC -#define DYN_SLAVE_TX_GPIO_CLK RCC_AHB1Periph_GPIOC -#define DYN_SLAVE_TX_SOURCE GPIO_PinSource10 -#define DYN_SLAVE_TX_AF GPIO_AF_USART3 - -#define DYN_SLAVE_RX_PIN GPIO_Pin_11 -#define DYN_SLAVE_RX_GPIO_PORT GPIOC -#define DYN_SLAVE_RX_GPIO_CLK RCC_AHB1Periph_GPIOB -#define DYN_SLAVE_RX_SOURCE GPIO_PinSource11 -#define DYN_SLAVE_RX_AF GPIO_AF_USART3 - -/* DMA configuration */ -#define DYN_SLAVE_DR_ADDRESS ((uint32_t)USART3 + 0x04) -#define DYN_SLAVE_DMA DMA1 -#define DYN_SLAVE_DMA_CLK RCC_AHB1Periph_DMA1 - -#define DYN_SLAVE_TX_DMA_CHANNEL DMA_Channel_4 -#define DYN_SLAVE_TX_DMA_STREAM DMA1_Stream3 -#define DYN_SLAVE_TX_DMA_FLAG_FEIF DMA_FLAG_FEIF3 -#define DYN_SLAVE_TX_DMA_FLAG_DMEIF DMA_FLAG_DMEIF3 -#define DYN_SLAVE_TX_DMA_FLAG_TEIF DMA_FLAG_TEIF3 -#define DYN_SLAVE_TX_DMA_FLAG_HTIF DMA_FLAG_HTIF3 -#define DYN_SLAVE_TX_DMA_FLAG_TCIF DMA_FLAG_TCIF3 - -#define DYN_SLAVE_RX_DMA_CHANNEL DMA_Channel_4 -#define DYN_SLAVE_RX_DMA_STREAM DMA1_Stream1 -#define DYN_SLAVE_RX_DMA_FLAG_FEIF DMA_FLAG_FEIF1 -#define DYN_SLAVE_RX_DMA_FLAG_DMEIF DMA_FLAG_DMEIF1 -#define DYN_SLAVE_RX_DMA_FLAG_TEIF DMA_FLAG_TEIF1 -#define DYN_SLAVE_RX_DMA_FLAG_HTIF DMA_FLAG_HTIF1 -#define DYN_SLAVE_RX_DMA_FLAG_TCIF DMA_FLAG_TCIF1 - -#define DYN_SLAVE_DMA_TX_IRQn DMA1_Stream3_IRQn -#define DYN_SLAVE_DMA_RX_IRQn DMA1_Stream1_IRQn -#define DYN_SLAVE_DMA_TX_IRQHandler DMA1_Stream3_IRQHandler -#define DYN_SLAVE_DMA_RX_IRQHandler DMA1_Stream1_IRQHandler - -#define MAX_BUFFER_LEN 1024 -// private variables -uint8_t dyn_slave_address;// this module slave address -uint8_t dyn_slave_return_level;// type of response -uint8_t dyn_slave_return_delay;// delay in the response -TDynVersion dyn_slave_version;// version of the dynamixel packet being received -// input buffer -uint8_t dyn_slave_rx_buffer[MAX_BUFFER_LEN]; -// output buffer -uint8_t dyn_slave_tx_buffer[MAX_BUFFER_LEN]; -// instruction packet ready flag -volatile uint8_t dyn_slave_packet_ready; -// sending status packet flag -volatile uint8_t dyn_slave_sending_packet; -// DMA initialization data structures -DMA_InitTypeDef DYN_SLAVE_DMA_TX_InitStructure; -DMA_InitTypeDef DYN_SLAVE_DMA_RX_InitStructure; - -// private functions - -// interrupt handlers -void DYN_SLAVE_IRQHandler(void) -{ - static uint16_t v2_length=0; - static uint8_t num_bytes=0; - uint8_t data; - - if(USART_GetITStatus(DYN_SLAVE, USART_IT_RXNE) != RESET) - { - USART_ClearFlag(DYN_SLAVE,USART_FLAG_RXNE); - data=USART_ReceiveData(DYN_SLAVE); - switch(num_bytes) - { - case 0: if(data==0xFF) - { - dyn_slave_rx_buffer[num_bytes]=data; - num_bytes++; - } - break; - case 1: if(data==0xFF) - { - dyn_slave_rx_buffer[num_bytes]=data; - num_bytes++; - } - else num_bytes--; - break; - case 2: if(data==0xFD)// version 2 packet - { - dyn_slave_rx_buffer[num_bytes]=data; - dyn_slave_version=DYN_VER2; - num_bytes++; - } - else if(data!=0xFF)// version 1 packet - { - dyn_slave_rx_buffer[num_bytes]=data; - dyn_slave_version=DYN_VER1; - num_bytes++; - } - break; - case 3: dyn_slave_rx_buffer[num_bytes]=data; - if(dyn_slave_version==DYN_VER1) - { - num_bytes=0; - /* disable USART RX interrupts */ - USART_ITConfig(DYN_SLAVE,USART_IT_RXNE,DISABLE); - /* enable DMA RX */ - DYN_SLAVE_DMA_RX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&dyn_slave_rx_buffer[4]; - DYN_SLAVE_DMA_RX_InitStructure.DMA_BufferSize = data; - DMA_Init(DYN_SLAVE_RX_DMA_STREAM,&DYN_SLAVE_DMA_RX_InitStructure); - DMA_Cmd(DYN_SLAVE_RX_DMA_STREAM,ENABLE); - USART_DMACmd(DYN_SLAVE, USART_DMAReq_Rx, ENABLE); - } - else - num_bytes++; - break; - case 4: dyn_slave_rx_buffer[num_bytes]=data; - num_bytes++; - break; - case 5: dyn_slave_rx_buffer[num_bytes]=data; - v2_length=data; - num_bytes++; - break; - case 6: dyn_slave_rx_buffer[num_bytes]=data; - v2_length+=(data<<8); - num_bytes=0; - /* disable USART RX interrupts */ - USART_ITConfig(DYN_SLAVE,USART_IT_RXNE,DISABLE); - /* enable DMA RX */ - DYN_SLAVE_DMA_RX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&dyn_slave_rx_buffer[7]; - DMA_SetCurrDataCounter(DYN_SLAVE_RX_DMA_STREAM,v2_length); - DMA_Cmd(DYN_SLAVE_RX_DMA_STREAM,ENABLE); - USART_DMACmd(DYN_SLAVE, USART_DMAReq_Rx, ENABLE); - break; - default: break; - } - } - else if(USART_GetITStatus(DYN_SLAVE, USART_IT_TC) != RESET) - { - USART_ClearFlag(DYN_SLAVE,USART_FLAG_TC); - USART_ITConfig(DYN_SLAVE, USART_IT_TC, DISABLE); - dyn_slave_sending_packet=0x00; - } -} - -void DYN_SLAVE_DMA_TX_IRQHandler(void) -{ - DMA_Cmd(DYN_SLAVE_TX_DMA_STREAM,DISABLE); - DMA_ClearFlag(DYN_SLAVE_TX_DMA_STREAM,DYN_SLAVE_TX_DMA_FLAG_TCIF); - DMA_ClearITPendingBit(DYN_SLAVE_TX_DMA_STREAM,DYN_SLAVE_TX_DMA_FLAG_TCIF); - USART_ITConfig(DYN_SLAVE, USART_IT_TC, ENABLE); -} - -void DYN_SLAVE_DMA_RX_IRQHandler(void) -{ - DMA_Cmd(DYN_SLAVE_RX_DMA_STREAM,DISABLE); - DMA_ClearFlag(DYN_SLAVE_RX_DMA_STREAM,DYN_SLAVE_RX_DMA_FLAG_TCIF); - DMA_ClearITPendingBit(DYN_SLAVE_RX_DMA_STREAM,DYN_SLAVE_RX_DMA_FLAG_TCIF); - USART_DMACmd(DYN_SLAVE, USART_DMAReq_Rx, DISABLE); - // enable USART RX interrupt - USART_ITConfig(DYN_SLAVE,USART_IT_RXNE,ENABLE); - dyn_slave_packet_ready=0x01; -} - -// public functions -void dyn_slave_init(void) -{ - uint16_t i; - GPIO_InitTypeDef GPIO_InitStructure; - NVIC_InitTypeDef NVIC_InitStructure; - USART_InitTypeDef USART_InitStructure; - - /* Enable GPIO clock */ - DYN_SLAVE_CLK_INIT(DYN_SLAVE_CLK, ENABLE); - RCC_AHB1PeriphClockCmd(DYN_SLAVE_TX_GPIO_CLK | DYN_SLAVE_RX_GPIO_CLK, ENABLE); - // configure the GPIO pins - - /* Connect USART pins to AF7 */ - GPIO_PinAFConfig(DYN_SLAVE_TX_GPIO_PORT, DYN_SLAVE_TX_SOURCE, DYN_SLAVE_TX_AF); - GPIO_PinAFConfig(DYN_SLAVE_RX_GPIO_PORT, DYN_SLAVE_RX_SOURCE, DYN_SLAVE_RX_AF); - - /* Configure USART Tx and Rx as alternate function push-pull */ - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Pin = DYN_SLAVE_TX_PIN; - GPIO_Init(DYN_SLAVE_TX_GPIO_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = DYN_SLAVE_RX_PIN; - GPIO_Init(DYN_SLAVE_RX_GPIO_PORT, &GPIO_InitStructure); - - // initialize the buffers - for(i=0;i<MAX_BUFFER_LEN;i++) - { - dyn_slave_rx_buffer[i]=0x00; - dyn_slave_tx_buffer[i]=0x00; - } - // initialize the flags - dyn_slave_packet_ready=0x00; - dyn_slave_sending_packet=0x00; - dyn_slave_address=0x01;// this module slave address - dyn_slave_return_level=0x00;// type of response - dyn_slave_return_delay=0x00;// delay in the response - dyn_slave_version=DYN_VER1;// version 1 - - USART_DeInit(DYN_SLAVE); - USART_StructInit(&USART_InitStructure); - // configure the serial port - USART_InitStructure.USART_BaudRate = 115200; - USART_InitStructure.USART_WordLength = USART_WordLength_8b; - USART_InitStructure.USART_StopBits = USART_StopBits_1; - USART_InitStructure.USART_Parity = USART_Parity_No; - USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - USART_Init(DYN_SLAVE, &USART_InitStructure); - - NVIC_InitStructure.NVIC_IRQChannel = DYN_SLAVE_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - /* disable all interrupts of the USART */ - USART_ITConfig(DYN_SLAVE, USART_IT_RXNE | - USART_IT_ORE | - USART_IT_TXE | - USART_IT_CTS | - USART_IT_LBD | - USART_IT_IDLE | - USART_IT_PE | - USART_IT_ERR | - USART_IT_TC, DISABLE); - /* Clear all USART interrupt flags */ - USART_ClearFlag(DYN_SLAVE,USART_FLAG_RXNE | - USART_FLAG_ORE | - USART_FLAG_TXE | - USART_FLAG_CTS | - USART_FLAG_LBD | - USART_FLAG_IDLE | - USART_FLAG_PE | - USART_FLAG_TC); - /* Clear all USART interrupt pending bits */ - USART_ClearITPendingBit(DYN_SLAVE, USART_FLAG_RXNE | - USART_FLAG_ORE | - USART_FLAG_TXE | - USART_FLAG_CTS | - USART_FLAG_LBD | - USART_FLAG_IDLE | - USART_FLAG_PE | - USART_FLAG_TC); - /* Enable the DYN_SLAVE3 */ - USART_Cmd(DYN_SLAVE, ENABLE); - - // configure the DMA channels - /* Configure TX DMA */ - RCC_AHB1PeriphClockCmd(DYN_SLAVE_DMA_CLK, ENABLE); - DMA_DeInit(DYN_SLAVE_TX_DMA_STREAM); - DYN_SLAVE_DMA_TX_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; - DYN_SLAVE_DMA_TX_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; - DYN_SLAVE_DMA_TX_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; - DYN_SLAVE_DMA_TX_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; - DYN_SLAVE_DMA_TX_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - DYN_SLAVE_DMA_TX_InitStructure.DMA_Mode = DMA_Mode_Normal; - DYN_SLAVE_DMA_TX_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) (&(DYN_SLAVE->DR)); - DYN_SLAVE_DMA_TX_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; - DYN_SLAVE_DMA_TX_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; - DYN_SLAVE_DMA_TX_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - DYN_SLAVE_DMA_TX_InitStructure.DMA_Priority = DMA_Priority_High; - DYN_SLAVE_DMA_TX_InitStructure.DMA_Channel = DYN_SLAVE_TX_DMA_CHANNEL; - DYN_SLAVE_DMA_TX_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; - DYN_SLAVE_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dyn_slave_tx_buffer; - DMA_Init(DYN_SLAVE_TX_DMA_STREAM,&DYN_SLAVE_DMA_TX_InitStructure); - /* initialize DMA interrupts */ - NVIC_InitStructure.NVIC_IRQChannel = DYN_SLAVE_DMA_TX_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - DMA_ITConfig(DYN_SLAVE_TX_DMA_STREAM,DMA_IT_TC,ENABLE); - DMA_ITConfig(DYN_SLAVE_TX_DMA_STREAM,DMA_IT_HT | DMA_IT_TE | DMA_IT_FE | DMA_IT_DME,DISABLE); - - /* Configure RX DMA */ - DMA_DeInit(DYN_SLAVE_RX_DMA_STREAM); - DYN_SLAVE_DMA_RX_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; - DYN_SLAVE_DMA_RX_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; - DYN_SLAVE_DMA_RX_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; - DYN_SLAVE_DMA_RX_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; - DYN_SLAVE_DMA_RX_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - DYN_SLAVE_DMA_RX_InitStructure.DMA_Mode = DMA_Mode_Normal; - DYN_SLAVE_DMA_RX_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) (&(DYN_SLAVE->DR)); - DYN_SLAVE_DMA_RX_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; - DYN_SLAVE_DMA_RX_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; - DYN_SLAVE_DMA_RX_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - DYN_SLAVE_DMA_RX_InitStructure.DMA_Priority = DMA_Priority_High; - DYN_SLAVE_DMA_RX_InitStructure.DMA_Channel = DYN_SLAVE_RX_DMA_CHANNEL; - DYN_SLAVE_DMA_RX_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; - DYN_SLAVE_DMA_RX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&dyn_slave_rx_buffer[4]; - DMA_Init(DYN_SLAVE_RX_DMA_STREAM,&DYN_SLAVE_DMA_RX_InitStructure); - /* initialize DMA interrupts */ - NVIC_InitStructure.NVIC_IRQChannel = DYN_SLAVE_DMA_RX_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - DMA_ITConfig(DYN_SLAVE_RX_DMA_STREAM,DMA_IT_TC,ENABLE); - DMA_ITConfig(DYN_SLAVE_RX_DMA_STREAM,DMA_IT_HT | DMA_IT_TE | DMA_IT_FE | DMA_IT_DME,DISABLE); - - /* enable USART RX interrupts */ - USART_ITConfig(DYN_SLAVE,USART_IT_RXNE,ENABLE); -} - -inline void dyn_slave_set_address(uint8_t id) -{ - dyn_slave_address=id; -} - -inline uint8_t dyn_slave_get_address(void) -{ - return dyn_slave_address; -} - -inline void dyn_slave_set_return_delay(uint8_t delay) -{ - dyn_slave_return_delay=delay; -} - -inline void dyn_slave_set_return_level(uint8_t level) -{ - dyn_slave_return_level=level; -} - -inline uint8_t dyn_slave_get_return_level(void) -{ - return dyn_slave_return_level; -} - -uint8_t dyn_slave_is_packet_ready(void) -{ - return dyn_slave_packet_ready; -} - -TDynVersion dyn_slave_get_inst_packet(uint8_t *packet) -{ - uint8_t i; - - if(dyn_slave_version==DYN_VER1) - { - for(i=0;i<dyn_get_length(dyn_slave_rx_buffer)+4;i++) - packet[i]=dyn_slave_rx_buffer[i]; - } - else - { - for(i=0;i<dyn2_get_length(dyn_slave_rx_buffer)+7;i++) - packet[i]=dyn_slave_rx_buffer[i]; - } - dyn_slave_packet_ready=0x00; - - return dyn_slave_version; -} - -void dyn_slave_send_status_packet(uint8_t error,uint16_t length, uint8_t *data) -{ - // wait until the previous transmission has ended (if any) - while(dyn_slave_sending_packet==0x01); - if(dyn_slave_version==DYN_VER1) - { - // create the status packet - dyn_init_status_packet(dyn_slave_tx_buffer,dyn_slave_address,error,length,data); - // set the DMA transfer - DMA_SetCurrDataCounter(DYN_SLAVE_TX_DMA_STREAM,dyn_get_length(dyn_slave_tx_buffer)+4); - } - else - { - // create the status packet - dyn2_init_status_packet(dyn_slave_tx_buffer,dyn_slave_address,error,length,data); - // set the DMA transfer - DMA_SetCurrDataCounter(DYN_SLAVE_TX_DMA_STREAM,dyn_get_length(dyn_slave_tx_buffer)+8); - } - DMA_Cmd(DYN_SLAVE_TX_DMA_STREAM,ENABLE); - USART_ClearFlag(DYN_SLAVE,USART_FLAG_TC); - USART_DMACmd(DYN_SLAVE, USART_DMAReq_Tx, ENABLE); - dyn_slave_sending_packet=0x01; -} - -void dyn_slave_resend_status_packet(uint8_t *packet) -{ - // wait until the previous transmission has ended (if any) - while(dyn_slave_sending_packet==0x01); - // create the status packet - dyn_copy_packet(packet,dyn_slave_tx_buffer); - // set the DMA transfer - DMA_SetCurrDataCounter(DYN_SLAVE_TX_DMA_STREAM,dyn_get_length(dyn_slave_tx_buffer)+4); - DMA_Cmd(DYN_SLAVE_TX_DMA_STREAM,ENABLE); - USART_ClearFlag(DYN_SLAVE,USART_FLAG_TC); - USART_DMACmd(DYN_SLAVE, USART_DMAReq_Tx, ENABLE); - dyn_slave_sending_packet=0x01; -} - diff --git a/src/motion_manager.c b/src/motion_manager.c index 869d4d9e96ddf3ddce620461c8925297f82874d4..9f1f39a303bc3391b8480de073a42374aacc23b3 100644 --- a/src/motion_manager.c +++ b/src/motion_manager.c @@ -14,6 +14,7 @@ TIM_HandleTypeDef MANAGER_TIM_Handle; uint16_t manager_motion_period; +uint16_t manager_motion_period_us; uint8_t manager_num_servos; TServoInfo manager_servos[MANAGER_MAX_NUM_SERVOS]; // current angles used for all motion modules @@ -280,6 +281,7 @@ void manager_init(uint16_t period_us) HAL_TIMEx_MasterConfigSynchronization(&MANAGER_TIM_Handle, &sMasterConfig); /* configure ouptut counter channel 4 */ manager_motion_period=(period_us*1000000)>>16; + manager_motion_period_us=period_us; /* initialize balance parameters */ for(i=0;i<MANAGER_MAX_NUM_SERVOS;i++) @@ -297,9 +299,15 @@ uint16_t manager_get_period(void) return manager_motion_period; } +uint16_t manager_get_period_us(void) +{ + return manager_motion_period_us; +} + void manager_set_period(uint16_t period_us) { manager_motion_period=(period_us*1000000)>>16; + manager_motion_period_us=period_us; ram_data[BIOLOID_MM_PERIOD_L]=period_us&0x00FF; ram_data[BIOLOID_MM_PERIOD_H]=(period_us&0xFF00)>>8; }