diff --git a/Makefile b/Makefile index 2aef96b8b25cc361a0faa761004b3dd138c45b44..5933af0bc649d05ee2b5115417a501e47bffdca5 100755 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ TARGET_FILES=src/bioloid_stm32.c TARGET_FILES+=src/system_stm32f4xx.c TARGET_FILES+=src/stm32f4xx_hal_msp.c TARGET_FILES+=src/gpio.c +TARGET_FILES+=src/bioloid_time.c TARGET_PROCESSOR=STM32F407VG HAL_PATH=../../STM32_processor/hal/f4 diff --git a/include/bioloid_time.h b/include/bioloid_time.h new file mode 100755 index 0000000000000000000000000000000000000000..13ba01bbe4fd47210059324744657d0fd5f9314f --- /dev/null +++ b/include/bioloid_time.h @@ -0,0 +1,18 @@ +#ifndef _BIOLOID_TIME_H +#define _BIOLOID_TIME_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stm32f4xx_hal.h" + +void bioloid_time_init(void); +unsigned long long int bioloid_time_get_counts(void); +inline unsigned int bioloid_time_get_counts_per_us(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/stm32_time.h b/include/stm32_time.h deleted file mode 100755 index 6b47829c0ff8debc66edf1391df3f3729ce898ef..0000000000000000000000000000000000000000 --- a/include/stm32_time.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _STM32_TIME_H -#define _STM32_TIME_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "stm32f4xx.h" -#include "system_stm32f4xx.h" - -void time_init(void); -void delay_ms(__IO uint32_t time); -void delay_us(uint32_t us); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/bioloid_stm32.c b/src/bioloid_stm32.c index 03f4ab761bccbdff692b7ba22a5520c65afba00f..471649eef3dd21ee4388e7a7fd360b72f13be2fb 100644 --- a/src/bioloid_stm32.c +++ b/src/bioloid_stm32.c @@ -1,43 +1,26 @@ #include "stm32f4xx_hal.h" #include "gpio.h" +#include "bioloid_time.h" +#include "stm32_time.h" int32_t main(void) { -// uint16_t eeprom_data,period; + TTime timer; + int i; - /* initialize EEPROM */ -// EE_Init(); - // initialize the Dynamixel RAM memory space -// ram_init(); - /* initialize the 1ms system timer */ -// time_init(); + HAL_Init(); /* initialize the gpio */ gpio_init(); - /* initialize the dynamixel master interface */ -// dyn_master_init(); -// dyn_master_set_timeout(20); -// /* initialize the dynamixel slave interface*/ -// dyn_slave_init(); -// EE_ReadVariable(DEVICE_ID_OFFSET,&eeprom_data); -// dyn_slave_set_address((uint8_t)eeprom_data); -// EE_ReadVariable(RETURN_DELAY_OFFSET,&eeprom_data); -// dyn_slave_set_return_delay((uint8_t)eeprom_data); -// EE_ReadVariable(RETURN_LEVEL_OFFSET,&eeprom_data); -// dyn_slave_set_return_level((uint8_t)eeprom_data); - /* initialize the IMU */ -// imu_init(); - // initialize the Analog to digital converter -// adc_init(); - // initialize motion manager -// EE_ReadVariable(MM_PERIOD_OFFSET,&eeprom_data); -// period=eeprom_data&0x00FF; -// EE_ReadVariable(MM_PERIOD_OFFSET+1,&eeprom_data); -// period+=((eeprom_data&0x00FF)<<8); -// manager_init(period); - /* initialize communications module */ -// comm_init(); -// comm_start(); + /* initialize the time module */ + bioloid_time_init(); - while(1); + time_init(&timer, bioloid_time_get_counts_per_us(), bioloid_time_get_counts); + + while(1) + { + for(i=0;i<10000;i++) + time_delay_us(&timer,100); + gpio_toggle_led(USER1_LED); + } } diff --git a/src/bioloid_time.c b/src/bioloid_time.c new file mode 100644 index 0000000000000000000000000000000000000000..2473255b92b8d4fdb6dc01c087a847f0c59b0a90 --- /dev/null +++ b/src/bioloid_time.c @@ -0,0 +1,62 @@ +#include "bioloid_time.h" + +TIM_HandleTypeDef us_timer_Handle; +unsigned long long int timer_counts; +unsigned short int timer_counts_per_us; + +// interrupt service routines +void SysTick_Handler(void) +{ + HAL_IncTick(); + HAL_SYSTICK_IRQHandler(); +} + +void TIM6_DAC_IRQHandler(void) +{ + /* TIM Update event */ + if(__HAL_TIM_GET_FLAG(&us_timer_Handle, TIM_FLAG_UPDATE) != RESET) + { + if(__HAL_TIM_GET_IT_SOURCE(&us_timer_Handle, TIM_IT_UPDATE) !=RESET) + { + __HAL_TIM_CLEAR_IT(&us_timer_Handle, TIM_IT_UPDATE); + timer_counts++; + } + } +} + +// public functions +void bioloid_time_init(void) +{ + TIM_MasterConfigTypeDef sMasterConfig; + + /* initialize internal variables */ + timer_counts=0; + timer_counts_per_us=(SystemCoreClock/2000000)+1; + + /* configure timer */ + __TIM6_CLK_ENABLE(); + us_timer_Handle.Instance = TIM6; + us_timer_Handle.Init.Prescaler = 0; + us_timer_Handle.Init.CounterMode = TIM_COUNTERMODE_UP; + us_timer_Handle.Init.Period = 0xFFFF; + HAL_TIM_Base_Init(&us_timer_Handle); + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + HAL_TIMEx_MasterConfigSynchronization(&us_timer_Handle, &sMasterConfig); + + /* configure timer interrupts */ + HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); + HAL_TIM_Base_Start_IT(&us_timer_Handle); +} + +unsigned long long int bioloid_time_get_counts(void) +{ + return (timer_counts<<16)+__HAL_TIM_GetCounter(&us_timer_Handle); +} + +inline unsigned int bioloid_time_get_counts_per_us(void) +{ + return timer_counts_per_us; +} diff --git a/src/gpio.c b/src/gpio.c index d5da9fc35178958c4a94afc41e4eb9099ff2efcc..7e541ea51753318c560f464a7117119ad0dca99b 100644 --- a/src/gpio.c +++ b/src/gpio.c @@ -241,7 +241,7 @@ void gpio_init(void) ENABLE_GPO_TIMER_CLK; GPO_TIM_Handle.Instance=GPO_TIMER; - GPO_TIM_Handle.Init.Period = 0xFFFF; + GPO_TIM_Handle.Init.Period = 0xFFFFFFFF; GPO_TIM_Handle.Init.Prescaler = 42000; GPO_TIM_Handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2; GPO_TIM_Handle.Init.CounterMode = TIM_COUNTERMODE_UP; diff --git a/src/stm32_time.c b/src/stm32_time.c deleted file mode 100644 index f2f8044ae17fb7cd4803453dfc07431fdd5c568c..0000000000000000000000000000000000000000 --- a/src/stm32_time.c +++ /dev/null @@ -1,60 +0,0 @@ -#include "stm32_time.h" - -static __IO uint32_t timing_delay; -uint32_t clocks_per_us; - -/******************************************************************************* -* Function Name : SysTickHandler -* Description : This function handles SysTick Handler. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void SysTick_Handler(void) -{ - if(timing_delay!=0) - timing_delay--; -} - -// public functions -void time_init(void) -{ - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; - - // set the time base to 1ms - SysTick_Config(SystemCoreClock / 1000); - NVIC_SetPriority(SysTick_IRQn,0); - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); - - TIM_TimeBaseStructure.TIM_Period = 0xFFFF; - TIM_TimeBaseStructure.TIM_Prescaler = 0; - TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseStructure.TIM_RepetitionCounter=0x0000; - TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); - TIM_SetCounter(TIM1,0); - - clocks_per_us=(SystemCoreClock/1000000)+1; -} - -void delay_ms(__IO uint32_t time) -{ - timing_delay=time; - - while(timing_delay!=0); -} - -void delay_us(uint32_t us) // microseconds -{ - uint32_t clocks,current; - - clocks=clocks_per_us*us; - TIM_SetCounter(TIM1,0); - TIM_Cmd(TIM1, ENABLE); - do{ - current=TIM_GetCounter(TIM1); - }while(current<clocks); - TIM_Cmd(TIM1, DISABLE); -} - diff --git a/src/stm32f4xx_hal_msp.c b/src/stm32f4xx_hal_msp.c index 97d79d839202a0afaa3e6bdad3815a6ab921cfaf..e40b1342b7c2ffdf5a7b7312be1c19fc310ca291 100755 --- a/src/stm32f4xx_hal_msp.c +++ b/src/stm32f4xx_hal_msp.c @@ -98,6 +98,9 @@ void HAL_MspInit(void) RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); + + /* update the SystemCoreClock variable*/ + SystemCoreClockUpdate(); } /** diff --git a/src/system_stm32f4xx.c b/src/system_stm32f4xx.c index 318a217adf28a83a5e60427b9e31da9c0061f43f..45380618e5863c0aa51ba2b7143b6bb1451b9c62 100644 --- a/src/system_stm32f4xx.c +++ b/src/system_stm32f4xx.c @@ -135,7 +135,7 @@ is no need to call the 2 first functions listed above, since SystemCoreClock variable is updated automatically. */ - uint32_t SystemCoreClock = 16000000; + uint32_t SystemCoreClock = 168000000; __IO const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; /**