diff --git a/include/dynamixel_slave_uart_dma.h b/include/dynamixel_slave_uart_dma.h index 706ca3b4bfca758e666044a5834adbc81f2757ee..65454ddbdd1f018750ea88a81cd191267d5f3d2c 100644 --- a/include/dynamixel_slave_uart_dma.h +++ b/include/dynamixel_slave_uart_dma.h @@ -12,5 +12,6 @@ uint8_t dyn_slave_is_packet_ready(void); void dyn_slave_get_inst_packet(uint8_t *packet); void dyn_slave_send_status_packet(uint8_t error,uint8_t length, uint8_t *data); void dyn_slave_resend_status_packet(uint8_t *packet); +void dyn_slave_reset(void); #endif diff --git a/include/ram.h b/include/ram.h index 94a1512006a670f117ab4a0affd0885e03e35615..126d156b410ce24a43dcafe7250b3f3ced400afb 100644 --- a/include/ram.h +++ b/include/ram.h @@ -1,6 +1,10 @@ #ifndef _RAM_H #define _RAM_H -uint8_t ram_data[256]; +#include "stm32f4xx.h" + +extern uint8_t ram_data[256]; + +void ram_init(void); #endif diff --git a/src/adc_dma.c b/src/adc_dma.c index eab7f26df10ad535678cd8d78ad03bd1978ace7d..19a70aaa2a82ab8a8194a83765c07b2e29f8c6bc 100644 --- a/src/adc_dma.c +++ b/src/adc_dma.c @@ -1,4 +1,5 @@ #include "adc_dma.h" +#include "ram.h" #define ADC1_CH1 ADC_Channel_TempSensor #define ADC1_CH2 ADC_Channel_8 @@ -36,7 +37,8 @@ #define ADC_CCR_ADDRESS ((uint32_t)0x40012308) // private variables -uint8_t adc_data[16]; + +// interrupt handlers // public functions void adc_init(void) @@ -55,7 +57,7 @@ void adc_init(void) /* DMA Config */ DMA_InitStructure.DMA_Channel = DMA_Channel_0; - DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)adc_data; + DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ram_data[50]; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_CCR_ADDRESS; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = 4; @@ -87,7 +89,7 @@ void adc_init(void) /* ADC Common Init */ ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult; - ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; + ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_2; ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStructure); @@ -139,8 +141,5 @@ void adc_init(void) uint16_t adc_get_temperature(void) { - uint16_t value; - - value=adc_data[0]+(adc_data[1]<<8); - return value; + return 0x0000; } diff --git a/src/bioloid_stm32.c b/src/bioloid_stm32.c index 4270daee979620d6a44c806741293f78c1193df4..340a044022adaad36d8b269c763fdf033a9ecf5c 100644 --- a/src/bioloid_stm32.c +++ b/src/bioloid_stm32.c @@ -8,6 +8,8 @@ #include "eeprom.h" #include "imu_9dof_dma.h" #include "gpio.h" +#include "ram.h" +#include "adc_dma.h" uint8_t read_operation(uint8_t address, uint8_t length, uint8_t *data) { @@ -27,33 +29,18 @@ uint8_t read_operation(uint8_t address, uint8_t length, uint8_t *data) } else// RAM region { + for(i=0;i<length;i++) + data[i]=ram_data[address+i]; return DYN_NO_ERROR; } } -void test_gpio(void) -{ - gpio_toggle_led(NORTH_LED); -} - int32_t main(void) { uint8_t inst_packet[1024]; uint8_t status_packet[1024]; uint8_t data[1024],error; uint16_t address; - GPIO_InitTypeDef GPIO_InitStructure; - - /* GPIOD Periph clock enable */ - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); - - /* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(GPIOD, &GPIO_InitStructure); /* initialize EEPROM */ EE_Init(); @@ -70,21 +57,10 @@ int32_t main(void) imu_init(); /* initialize the gpio */ gpio_init(); - - if(imu_accel_detect()) - GPIO_SetBits(GPIOD,GPIO_Pin_12); - else - GPIO_ResetBits(GPIOD,GPIO_Pin_12); - if(imu_gyro_detect()) - GPIO_SetBits(GPIOD,GPIO_Pin_13); - else - GPIO_ResetBits(GPIOD,GPIO_Pin_13); - if(imu_compass_detect()) - GPIO_SetBits(GPIOD,GPIO_Pin_14); - else - GPIO_ResetBits(GPIOD,GPIO_Pin_14); - - gpio_set_pushbutton_callback(NORTH_PB,test_gpio); + // initialize the Dynamixel RAM memory space + ram_init(); + // initialize the Analog to digital converter + adc_init(); while(1) /* main function does not return */ { @@ -122,6 +98,8 @@ int32_t main(void) // send the answer back to the computer dyn_slave_resend_status_packet(status_packet); } + else + dyn_slave_reset();// prepare the dynamixel master to accept data } } else diff --git a/src/dynamixel_slave_uart_dma.c b/src/dynamixel_slave_uart_dma.c index 8b981fd6cc025d2d565d429ee2cd0f13649f4e5b..a32011a0d89f180d9b787eca10966963d293aa06 100644 --- a/src/dynamixel_slave_uart_dma.c +++ b/src/dynamixel_slave_uart_dma.c @@ -288,3 +288,16 @@ void dyn_slave_resend_status_packet(uint8_t *packet) USART_DMACmd(DYN_SLAVE, USART_DMAReq_Tx, ENABLE); dyn_slave_sending_packet=0x01; } + +void dyn_slave_reset(void) +{ + dyn_slave_sending_packet=0x00; + // set up the DMA RX transaction + DYN_SLAVE_DMA_RX_InitStructure.DMA_BufferSize = 4; + DYN_SLAVE_DMA_RX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dyn_slave_rx_buffer; + DMA_Init(DYN_SLAVE_RX_DMA_STREAM,&DYN_SLAVE_DMA_RX_InitStructure); + DMA_ITConfig(DYN_SLAVE_RX_DMA_STREAM,DMA_IT_TC,ENABLE); + DMA_Cmd(DYN_SLAVE_RX_DMA_STREAM,ENABLE); + USART_DMACmd(DYN_SLAVE, USART_DMAReq_Rx, ENABLE); + dyn_slave_receiving_header=0x01; +} diff --git a/src/ram.c b/src/ram.c new file mode 100644 index 0000000000000000000000000000000000000000..860bea4738c0c92823b09e262d8fb350fde4bcbe --- /dev/null +++ b/src/ram.c @@ -0,0 +1,8 @@ +#include "ram.h" + +uint8_t ram_data[256]; + +void ram_init(void) +{ + // read contents from EEPROM to RAM +}