ST Expansion SW Team / X_NUCLEO_IHM14A1

Dependencies:   ST_INTERFACES

Dependents:   HelloWorld_IHM14A1

Fork of X_NUCLEO_IHM14A1 by Davide Aliprandi

Files at this revision

API Documentation at this revision

Comitter:
Davidroid
Date:
Thu Sep 27 14:05:44 2018 +0000
Parent:
1:bc265521eb00
Commit message:
Library to handle the X-NUCLEO-IHM14A1 Motor Control Expansion Board based on the STSPIN820 component.

Changed in this revision

Components/Common/motor_def.h Show annotated file Show diff for this revision Revisions of this file
Components/STSPIN820/STSPIN820.cpp Show annotated file Show diff for this revision Revisions of this file
Components/STSPIN820/STSPIN820.h Show annotated file Show diff for this revision Revisions of this file
Components/STSPIN820/STSPIN820_config.h Show annotated file Show diff for this revision Revisions of this file
Components/STSPIN820/STSPIN820_def.h Show annotated file Show diff for this revision Revisions of this file
Components/STSPIN820/platform_dependent.c Show annotated file Show diff for this revision Revisions of this file
--- a/Components/Common/motor_def.h	Fri Apr 27 17:02:08 2018 +0000
+++ b/Components/Common/motor_def.h	Thu Sep 27 14:05:44 2018 +0000
@@ -89,7 +89,7 @@
   * @{
   */
 ///bool Type
-typedef uint8_t bool;
+//typedef uint8_t bool;
 /**
   * @}
   */   
--- a/Components/STSPIN820/STSPIN820.cpp	Fri Apr 27 17:02:08 2018 +0000
+++ b/Components/STSPIN820/STSPIN820.cpp	Thu Sep 27 14:05:44 2018 +0000
@@ -1,40 +1,40 @@
 /**
-  ******************************************************************************
-  * @file    STSPIN820.cpp
-  * @author  STM
-  * @version V1.0.0
-  * @date    August 7th, 2017
-  * @brief   STSPIN820 driver (fully integrated microstepping motor driver)
-  * @note    (C) COPYRIGHT 2017 STMicroelectronics
-  ******************************************************************************
-  * @attention
-  *
-  * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
-  *
-  * Redistribution and use in source and binary forms, with or without modification,
-  * are permitted provided that the following conditions are met:
-  *   1. Redistributions of source code must retain the above copyright notice,
-  *      this list of conditions and the following disclaimer.
-  *   2. Redistributions in binary form must reproduce the above copyright notice,
-  *      this list of conditions and the following disclaimer in the documentation
-  *      and/or other materials provided with the distribution.
-  *   3. Neither the name of STMicroelectronics nor the names of its contributors
-  *      may be used to endorse or promote products derived from this software
-  *      without specific prior written permission.
-  *
-  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-  *
-  ******************************************************************************
-  */
+ *******************************************************************************
+ * @file    STSPIN820.cpp
+ * @author  STM
+ * @version V1.0.0
+ * @date    August 7th, 2017
+ * @brief   STSPIN820 driver (fully integrated microstepping motor driver).
+ * @note    (C) COPYRIGHT 2017 STMicroelectronics
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *   1. Redistributions of source code must retain the above copyright notice,
+ *      this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright notice,
+ *      this list of conditions and the following disclaimer in the documentation
+ *      and/or other materials provided with the distribution.
+ *   3. Neither the name of STMicroelectronics nor the names of its contributors
+ *      may be used to endorse or promote products derived from this software
+ *      without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *******************************************************************************
+ */
 
 
 /* Generated with STM32CubeTOO -----------------------------------------------*/
@@ -53,6 +53,13 @@
 
 #include "STSPIN820.h"
 
+
+/* Variables  ----------------------------------------------------------------*/
+
+/* Number of devices. */
+uint8_t STSPIN820::number_of_devices = 0;
+
+
 /* Private function prototypes -----------------------------------------------*/
 
 /** @defgroup STSPIN820_Private_Functions STSPIN820 Private Functions
@@ -68,33 +75,22 @@
   * @{
   */
 
-/******************************************************//**
- * @brief Return motor handle (pointer to the STSPIN820 motor driver structure)
- * @retval Pointer to the MOTOR_vt_t structure
+/**********************************************************
+ * @brief Starts the STSPIN820 library
+ * @param  init Initialization structure.
+ * @retval COMPONENT_OK in case of success.
  **********************************************************/
-MOTOR_vt_t* STSPIN820::STSPIN820_GetMotorHandle(void)
+status_t STSPIN820::STSPIN820_Init(void *init)
 {
-  return (&STSPIN820_drv);
-}
-
-/******************************************************//**
- * @brief Start the STSPIN820 library
- * @param[in] pInit pointer to the initialization data
- * @retval None
- **********************************************************/
-void STSPIN820::STSPIN820_Init(void* pInit)
-{
-  device_instance++;
-  
   /* Initialise the GPIOs */
-  STSPIN820_Board_GpioInit();
+  STSPIN820_GpioInit();
 
   /* Initialise the timer used for the step clock and ------------------------*/
   /* the PWM for the reference voltage generation ----------------------------*/
-  STSPIN820_Board_TimStckInit();
-  STSPIN820_Board_PwmRefInit();
+  STSPIN820_TimStckInit();
+  STSPIN820_PwmRefInit();
 
-  if (pInit == 0)
+  if (init == 0)
   {
     /* Set all context variables to the predefined values */
     /* from STSPIN820_config.h */
@@ -102,20 +98,25 @@
   }
   else
   {
-    STSPIN820_SetDeviceParamsToGivenValues((STSPIN820_init_t*) pInit);
+    STSPIN820_SetDeviceParamsToGivenValues((STSPIN820_init_t*) init);
   }
+
+  return COMPONENT_OK;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Read id
- * @retval Id of the STSPIN820 Driver Instance
+ * @param id pointer to the identifier to be read.
+ * @retval COMPONENT_OK in case of success.
  **********************************************************/
-uint16_t STSPIN820::STSPIN820_ReadId(void)
+status_t STSPIN820::STSPIN820_ReadId(uint8_t *id)
 {
-  return (device_instance);
+  *id = device_instance;
+
+  return COMPONENT_OK;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Attach a user callback to the error Handler.
  * The call back will be then called each time the library 
  * detects an error
@@ -128,7 +129,7 @@
   error_handler_callback = (void (*)(uint16_t error))callback;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Attach a user callback to the flag Interrupt
  * The call back will be then called each time the status 
  * flag pin will be pulled down due to the occurrence of 
@@ -143,13 +144,13 @@
   flag_interrupt_callback = (void (*)(void))callback;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Check if STSPIN820 has a fault by reading EN pin position.
  * @retval One if STSPIN820 has EN pin down, otherwise zero
  **********************************************************/
 uint8_t STSPIN820::STSPIN820_CheckStatusHw(void)
 {
-    if(!STSPIN820_Board_EN_AND_FAULT_PIN_GetState())
+  if(!STSPIN820_EN_FAULT_PIN_GetState())
   {
     return 0x01;
   }
@@ -159,27 +160,25 @@
   }
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Disable the power bridges (leave the output bridges HiZ)
- * @param[in] deviceId Unused parameter
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_Disable(uint8_t deviceId)
+void STSPIN820::STSPIN820_Disable(void)
 {
-  STSPIN820_Board_Disable();
+  STSPIN820_Disable_Power_Bridges();
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Enable the power bridges
- * @param[in] deviceId Unused parameter
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_Enable(uint8_t deviceId)
+void STSPIN820::STSPIN820_Enable(void)
 {
-  STSPIN820_Board_Enable();
+  STSPIN820_Enable_Power_Bridges();
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Error handler which calls the user callback (if defined)
  * @param[in] error Number of the error
  * @retval None
@@ -199,30 +198,29 @@
   }
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Exit STSPIN820 device from standby (low power consumption)
- * @param[in] deviceId Unused parameter
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_ExitDeviceFromStandby(uint8_t deviceId)
+void STSPIN820::STSPIN820_ExitDeviceFromStandby(void)
 {
   uint32_t sequencerPosition = device_prm.sequencerPosition;
   
   /* Exit standby and set step mode */
   /* Disable step clock */
-  if (STSPIN820_Board_TimStckStop(&toggle_odd) == 0)
+  if (STSPIN820_TimStckStop(&toggle_odd) == 0)
   {
     STSPIN820_ErrorHandler(STSPIN820_ERROR_STEP_CLOCK);
   }
 
   /* Let the PWM REF and bridges enabled at least for DISABLE_DELAY time */
   /* after the last step clock rising edge triggering the last step */
-  STSPIN820_Board_Delay(DISABLE_DELAY);
+  STSPIN820_Delay(DISABLE_DELAY);
     /* Set reference voltage to 0 */
-  STSPIN820_SetTorque(0, CURRENT_TORQUE, 0);
+  STSPIN820_SetTorque( CURRENT_TORQUE, 0);
 
   /* Disable power bridges */
-  STSPIN820_Board_Disable();
+  STSPIN820_Disable_Power_Bridges();
   
   device_prm.commandExecuted = NO_CMD;
   device_prm.stepsToTake = 0;  
@@ -235,27 +233,27 @@
   device_prm.currentPosition = 0; 
   device_prm.markPosition = 0;
   
-  STSPIN820_SetStepMode(deviceId, device_prm.stepMode);
-  STSPIN820_Board_ReleaseReset();
-  STSPIN820_Board_Delay(AFTER_STANDBY_EXIT_DEAD_TIME);
+  STSPIN820_SetStepMode(device_prm.stepMode);
+  STSPIN820_ReleaseReset();
+  STSPIN820_Delay(AFTER_STANDBY_EXIT_DEAD_TIME);
   
-  STSPIN820_SetHome(deviceId);
-  STSPIN820_SetMark(deviceId);
+  STSPIN820_SetHome();
+  STSPIN820_SetMark();
   
   if (device_prm.sequencerPosition != 0)
   {
     /* Set direction to FORWARD to ensure the HW sequencer is increased at */
     /* each step clock rising edge */
-    STSPIN820_SetDirection(0, FORWARD);
+    STSPIN820_SetDirection(FORWARD);
     /* Going out of standby */
     device_prm.motionState = STANDBYTOINACTIVE;
     /* Initialize the step clock timer */
-    STSPIN820_Board_TimStckInit();
+    STSPIN820_TimStckInit();
     /* Program the step clock */    
-    STSPIN820_Board_TimStckCompareInit();
-    STSPIN820_Board_TimStckSetFreq(STSPIN820_MAX_STCK_FREQ);
+    STSPIN820_TimStckCompareInit();
+    STSPIN820_TimStckSetFreq(STSPIN820_MAX_STCK_FREQ);
     toggle_odd = 0;
-    STSPIN820_Board_TimStckStart();
+    STSPIN820_TimStckStart();
     while (device_prm.sequencerPosition != 0);
     while (toggle_odd!=0);
     device_prm.sequencerPosition = sequencerPosition;    
@@ -264,35 +262,32 @@
   device_prm.motionState = INACTIVE;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Return the acceleration of the specified device
- * @param[in] deviceId Unused parameter
  * @retval Acceleration in pps^2
  **********************************************************/
-uint16_t STSPIN820::STSPIN820_GetAcceleration(int8_t deviceId)
+uint16_t STSPIN820::STSPIN820_GetAcceleration(void)
 {
   return (device_prm.acceleration);
 }            
 
-/******************************************************//**
+/**********************************************************
  * @brief Return the current speed of the specified device
- * @param[in] deviceId Unused parameter
  * @retval Speed in pps
  **********************************************************/
-uint16_t STSPIN820::STSPIN820_GetCurrentSpeed(int8_t deviceId)
+uint16_t STSPIN820::STSPIN820_GetCurrentSpeed(void)
 {
   return device_prm.speed;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Return the decay mode of the specified device
- * @param[in] deviceId Unused parameter
  * @retval Decay Mode State (SLOW or MIXED)
  **********************************************************/
-motor_decay_mode_t STSPIN820::STSPIN820_GetDecayMode(uint8_t deviceId)
+motor_decay_mode_t STSPIN820::STSPIN820_GetDecayMode(void)
 {
   motor_decay_mode_t status;
-  if (STSPIN820_Board_GetDecayGpio() != 0) 
+  if (STSPIN820_GetDecayGpio() != 0) 
   {
     status = SLOW_DECAY;
   }
@@ -304,37 +299,34 @@
   return status;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Return the deceleration of the specified device
- * @param[in] deviceId Unused parameter
  * @retval Deceleration in pps^2
  **********************************************************/
-uint16_t STSPIN820::STSPIN820_GetDeceleration(uint8_t deviceId)
+uint16_t STSPIN820::STSPIN820_GetDeceleration(void)
 {
   return (device_prm.deceleration);
 }          
 
-/******************************************************//**
+/**********************************************************
  * @brief Return the device state
- * @param[in] deviceId Unused parameter
  * @retval State (ACCELERATING, DECELERATING, STEADY or INACTIVE)
  **********************************************************/
-motor_state_t STSPIN820::STSPIN820_GetDeviceState(uint8_t deviceId)
+motor_state_t STSPIN820::STSPIN820_GetDeviceState(void)
 {
   return device_prm.motionState;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Get the motor current direction
- * @param[in] deviceId Unused parameter
  * @retval direction
  **********************************************************/
-motor_direction_t STSPIN820::STSPIN820_GetDirection(uint8_t deviceId)
+motor_direction_t STSPIN820::STSPIN820_GetDirection(void)
 {
   return device_prm.direction;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Return the FW version of the library
  * @retval Stspin220_FW_VERSION
  **********************************************************/
@@ -343,37 +335,34 @@
   return (STSPIN820_FW_VERSION);
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Return the mark position of the specified device
- * @param[in] deviceId Unused parameter
  * @retval mark position value
  **********************************************************/
-int32_t STSPIN820::STSPIN820_GetMark(uint8_t deviceId)
+int32_t STSPIN820::STSPIN820_GetMark(void)
 {
   return device_prm.markPosition;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Return the max speed of the specified device
- * @param[in] deviceId Unused parameter
  * @retval maxSpeed in pps
  **********************************************************/
-uint16_t STSPIN820::STSPIN820_GetMaxSpeed(uint8_t deviceId)
+uint16_t STSPIN820::STSPIN820_GetMaxSpeed(void)
 {
   return (device_prm.maxSpeed);
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Return the min speed of the specified device
- * @param[in] deviceId Unused parameter
  * @retval minSpeed in pps
  **********************************************************/
-uint16_t STSPIN820::STSPIN820_GetMinSpeed(uint8_t deviceId)
+uint16_t STSPIN820::STSPIN820_GetMinSpeed(void)
 {
   return (device_prm.minSpeed);
 }                                                     
 
-/******************************************************//**
+/**********************************************************
  * @brief  Returns the number of devices
  * @retval number of devices
  **********************************************************/
@@ -382,44 +371,40 @@
   return (number_of_devices);
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Return the current position value of the specified device
- * @param[in] deviceId Unused parameter
  * @retval current position value
  **********************************************************/
-int32_t STSPIN820::STSPIN820_GetPosition(uint8_t deviceId)
+int32_t STSPIN820::STSPIN820_GetPosition(void)
 {
   return device_prm.currentPosition;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Get the motor step mode
- * @param[in] deviceId Unused parameter
  * @retval step mode
  **********************************************************/
-motor_step_mode_t STSPIN820::STSPIN820_GetStepMode(uint8_t deviceId)
+motor_step_mode_t STSPIN820::STSPIN820_GetStepMode(void)
 {
   return device_prm.stepMode;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Get the selected stop mode
- * @param[in] deviceId Unused parameter
  * @retval the selected stop mode
  **********************************************************/
-motor_stop_mode_t STSPIN820::STSPIN820_GetStopMode(uint8_t deviceId)
+motor_stop_mode_t STSPIN820::STSPIN820_GetStopMode(void)
 {
   return device_prm.stopMode;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Get the torque of the specified device
- * @param[in] deviceId Unused parameter
  * @param[in] torqueMode torque mode
  * @retval the torqueValue in % (from 0 to 100)
  * @note
  **********************************************************/
-uint8_t STSPIN820::STSPIN820_GetTorque(uint8_t deviceId, motor_torque_mode_t torqueMode)
+uint8_t STSPIN820::STSPIN820_GetTorque(motor_torque_mode_t torqueMode)
 {
   uint8_t torqueValue = 0;
   switch(torqueMode)
@@ -445,54 +430,46 @@
   return torqueValue;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Get the torque boost feature status
- * @param[in] deviceId Unused parameter
  * @retval TRUE if enabled, FALSE if disabled
  **********************************************************/
-bool STSPIN820::STSPIN820_GetTorqueBoostEnable(uint8_t deviceId)
+bool STSPIN820::STSPIN820_GetTorqueBoostEnable(void)
 {
   return device_prm.torqueBoostEnable;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Get the torque boost threshold
- * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1)
+ * @param[in]  (from 0 to MAX_NUMBER_OF_DEVICES - 1)
  * @retval the torque boost threshold above which the step mode is
  * changed to full step
  **********************************************************/
-uint16_t STSPIN820::STSPIN820_GetTorqueBoostThreshold(uint8_t deviceId)
+uint16_t STSPIN820::STSPIN820_GetTorqueBoostThreshold(void)
 {
   return device_prm.torqueBoostSpeedThreshold;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Request the motor to move to the home position (ABS_POSITION = 0)
- * @param[in] deviceId Unused parameter
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_GoHome(uint8_t deviceId)
+void STSPIN820::STSPIN820_GoHome(void)
 {
-  deviceId = 0;
-  
-  STSPIN820_GoTo(deviceId, 0);
+  STSPIN820_GoTo(0);
 } 
   
-/******************************************************//**
+/**********************************************************
  * @brief Request the motor to move to the mark position 
- * @param[in] deviceId Unused parameter
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_GoMark(uint8_t deviceId)
+void STSPIN820::STSPIN820_GoMark(void)
 {
-  deviceId = 0;
-  
-    STSPIN820_GoTo(deviceId, device_prm.markPosition);
+    STSPIN820_GoTo(device_prm.markPosition);
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Request the motor to move to the specified position 
- * @param[in] deviceId Unused parameter
  * @param[in] targetPosition absolute position in steps
  * @retval None 
  * @note The position is at the resolution corresponding to the
@@ -507,20 +484,19 @@
  * STEP_MODE_1_256                  : 1/256 step
  * @note The 1/64 step mode is not allowed
  **********************************************************/
-void STSPIN820::STSPIN820_GoTo(uint8_t deviceId, int32_t targetPosition)
+void STSPIN820::STSPIN820_GoTo(int32_t targetPosition)
 {
   motor_direction_t direction;
-  deviceId = 0;
   
   /* Exit from standby if needed */
   if (device_prm.motionState == STANDBY)
   {
-    STSPIN820_ExitDeviceFromStandby(deviceId);
+    STSPIN820_ExitDeviceFromStandby();
   }
   /* Deactivate motor if needed */
   else if (device_prm.motionState != INACTIVE)
   { 
-    STSPIN820_HardHiZ(deviceId);
+    STSPIN820_HardHiZ();
   }
   
   if (targetPosition > device_prm.currentPosition)
@@ -559,18 +535,17 @@
     device_prm.commandExecuted = MOVE_CMD;
     
     /* Direction setup */
-    STSPIN820_SetDirection(deviceId, direction);
+    STSPIN820_SetDirection(direction);
     
-    STSPIN820_ComputeSpeedProfile(deviceId, device_prm.stepsToTake);
+    STSPIN820_ComputeSpeedProfile(device_prm.stepsToTake);
     
     /* Motor activation */
-    STSPIN820_StartMovement(deviceId);
+    STSPIN820_StartMovement();
   }
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Move the motor to the absolute position
- * @param[in] deviceId Unused parameter
  * @param[in] direction FORWARD or BACKWARD
  * @param[in] targetPosition 32 bit signed value position
  * @retval None
@@ -586,19 +561,17 @@
  * STEP_MODE_1_256                  : 1/256 step
  * @note The 1/64 step mode is not allowed
  **********************************************************/
-void STSPIN820::STSPIN820_GoToDir(uint8_t deviceId, motor_direction_t direction, int32_t targetPosition)
+void STSPIN820::STSPIN820_GoToDir(motor_direction_t direction, int32_t targetPosition)
 {
-  deviceId = 0;
-  
   /* Exit from standby if needed */
   if (device_prm.motionState == STANDBY)
   {
-    STSPIN820_ExitDeviceFromStandby(deviceId);
+    STSPIN820_ExitDeviceFromStandby();
   }
   /* Deactivate motor if needed */
   else if (device_prm.motionState != INACTIVE)
   { 
-    STSPIN820_HardHiZ(deviceId);
+    STSPIN820_HardHiZ();
   }
   
   if (direction != BACKWARD)
@@ -635,46 +608,45 @@
     device_prm.commandExecuted = MOVE_CMD;
     
     /* Direction setup */
-    STSPIN820_SetDirection(deviceId, direction);
+    STSPIN820_SetDirection(direction);
     
-    STSPIN820_ComputeSpeedProfile(deviceId, device_prm.stepsToTake);
+    STSPIN820_ComputeSpeedProfile(device_prm.stepsToTake);
     
     /* Motor activation */
-    STSPIN820_StartMovement(deviceId);
+    STSPIN820_StartMovement();
   }  
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Immediatly stop the motor and disable the power bridge
- * @param[in] deviceId Unused parameter
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_HardHiZ(uint8_t deviceId) 
+void STSPIN820::STSPIN820_HardHiZ(void) 
 {
   /* Set inactive state */
   device_prm.motionState = INACTIVE;
   
   /* Disable step clock */
-  if (STSPIN820_Board_TimStckStop(handle &toggle_odd) == 0)
+  if (STSPIN820_TimStckStop(&toggle_odd) == 0)
   {
     STSPIN820_ErrorHandler(STSPIN820_ERROR_STEP_CLOCK);
   }
 
   /* Let the PWM REF and bridges enabled at least for DISABLE_DELAY time */
   /* after the last step clock rising edge triggering the last step */
-  STSPIN820_Board_Delay(DISABLE_DELAY);
+  STSPIN820_Delay(DISABLE_DELAY);
   
   /* Set reference voltage to 0 */
-  STSPIN820_SetTorque(0, CURRENT_TORQUE, 0);
+  STSPIN820_SetTorque(CURRENT_TORQUE, 0);
 
   /* Disable power bridges */
-  STSPIN820_Board_Disable();
+  STSPIN820_Disable_Power_Bridges();
   
   /* Comeback to nominal step mode */
   if (device_prm.stepModeLatched != device_prm.stepMode)
   {
     motor_step_mode_t StepMode = device_prm.stepModeLatched;
-    STSPIN820_SetStepMode(0, StepMode);
+    STSPIN820_SetStepMode(StepMode);
     device_prm.stepMode = device_prm.stepModeLatched;
   }
 
@@ -683,37 +655,34 @@
   device_prm.speed = 0;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Immediatly stop the motor
  * and either set holding torque when stop mode is HOLD_MODE,
  * or call STSPIN820_HardHiz function when stop mode is HIZ_MODE,
  * or call STSPIN820_PutDeviceInStandby function when stop mode is STANDBY_MODE
- * @param[in] deviceId Unused parameter
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_HardStop(uint8_t deviceId) 
+void STSPIN820::STSPIN820_HardStop(void) 
 {
-  deviceId = 0;
-  
   if (device_prm.stopMode == HOLD_MODE)
   {
     /* Set inactive state */
     device_prm.motionState = INACTIVE;
 
     /* Disable step clock */
-    if (STSPIN820_Board_TimStckStop(&toggle_odd) == 0)
+    if (STSPIN820_TimStckStop(&toggle_odd) == 0)
     {
       STSPIN820_ErrorHandler(STSPIN820_ERROR_STEP_CLOCK);
     }
     
     /* Set holding torque */
-    STSPIN820_ApplyTorque(deviceId, HOLD_TORQUE);
+    STSPIN820_ApplyTorque(HOLD_TORQUE);
  
     /* Comeback to nominal step mode */
     if (device_prm.stepModeLatched != device_prm.stepMode)
     {
       motor_step_mode_t StepMode = device_prm.stepModeLatched;
-      STSPIN820_SetStepMode(0, StepMode);
+      STSPIN820_SetStepMode(StepMode);
       device_prm.stepMode = device_prm.stepModeLatched;
     }    
     
@@ -723,34 +692,31 @@
   }
   else if (device_prm.stopMode == HIZ_MODE)
   {
-    STSPIN820_HardHiZ(deviceId);
+    STSPIN820_HardHiZ();
   }
   else if (device_prm.stopMode == STANDBY_MODE)
   {
-    STSPIN820_PutDeviceInStandby(deviceId);
+    STSPIN820_PutDeviceInStandby();
   }
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Moves the motor of the specified number of steps
- * @param[in] deviceId Unused parameter
  * @param[in] direction FORWARD or BACKWARD
  * @param[in] stepCount Number of steps to perform
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_Move(uint8_t deviceId, motor_direction_t direction, uint32_t stepCount)
+void STSPIN820::STSPIN820_Move(motor_direction_t direction, uint32_t stepCount)
 {
-  deviceId = 0;
-  
   /* Exit from standby if needed */
   if (device_prm.motionState == STANDBY)
   {
-    STSPIN820_ExitDeviceFromStandby(deviceId);
+    STSPIN820_ExitDeviceFromStandby();
   }
   /* Deactivate motor if needed */
   else if (device_prm.motionState != INACTIVE)
   {
-    STSPIN820_HardHiZ(deviceId);
+    STSPIN820_HardHiZ();
   }
   
   if (stepCount != 0) 
@@ -759,67 +725,64 @@
     device_prm.commandExecuted = MOVE_CMD;
     
     /* Direction setup */
-    STSPIN820_SetDirection(deviceId, direction);
+    STSPIN820_SetDirection(direction);
     
-    STSPIN820_ComputeSpeedProfile(deviceId, stepCount);
+    STSPIN820_ComputeSpeedProfile(stepCount);
     
     /* Motor activation */
-    STSPIN820_StartMovement(deviceId);
+    STSPIN820_StartMovement();
   }  
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Put STSPIN820 device in standby (low power consumption)
- * @param[in] deviceId Unused parameter
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_PutDeviceInStandby(uint8_t deviceId)
+void STSPIN820::STSPIN820_PutDeviceInStandby(void)
 {
   /* Stop movement */
-  STSPIN820_HardHiZ(deviceId);
+  STSPIN820_HardHiZ();
   
   /* Enter standby */
-    STSPIN820_Board_Reset();
+    STSPIN820_Reset();
   
   device_prm.motionState = STANDBY;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Runs the motor. It will accelerate from the min 
  * speed up to the max speed by using the device acceleration.
- * @param[in] deviceId Unused parameter
  * @param[in] direction FORWARD or BACKWARD
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_Run(uint8_t deviceId, motor_direction_t direction)
+void STSPIN820::STSPIN820_Run(motor_direction_t direction)
 {
   /* Exit from standby if needed */
   if (device_prm.motionState == STANDBY)
   {
-    STSPIN820_ExitDeviceFromStandby(deviceId);
+    STSPIN820_ExitDeviceFromStandby();
   }
   /* Deactivate motor if needed */
   else if (device_prm.motionState != INACTIVE)
   {
-    STSPIN820_HardHiZ(deviceId);
+    STSPIN820_HardHiZ();
   }
   
     /* Direction setup */
-    STSPIN820_SetDirection(deviceId,direction);
+    STSPIN820_SetDirection(direction);
     device_prm.commandExecuted = RUN_CMD;
     /* Motor activation */
-    STSPIN820_StartMovement(deviceId); 
+    STSPIN820_StartMovement(); 
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Changes the acceleration of the specified device
- * @param[in] deviceId Unused parameter
  * @param[in] newAcc New acceleration to apply in pps^2
  * @retval true if the command is successfully executed, else false
  * @note The command is not performed if the device is executing 
  * a MOVE or GOTO command (but it can be used during a RUN command)
  **********************************************************/
-bool STSPIN820::STSPIN820_SetAcceleration(uint8_t deviceId, uint16_t newAcc)
+bool STSPIN820::STSPIN820_SetAcceleration(uint16_t newAcc)
 {
   bool cmdExecuted = FALSE;
   if ((newAcc != 0)&&
@@ -832,33 +795,31 @@
   return cmdExecuted;
 }            
 
-/******************************************************//**
+/**********************************************************
  * @brief  Specifies the decay mode 
- * @param[in] deviceId Unused parameter
  * @param[in] decay SLOW_DECAY or MIXED_DECAY
  * @retval true if the command is successfully executed, else false
  **********************************************************/
-void STSPIN820::STSPIN820_SetDecayMode(uint8_t deviceId, motor_decay_mode_t decay)
+void STSPIN820::STSPIN820_SetDecayMode(motor_decay_mode_t decay)
 { 
   if (decay == SLOW_DECAY)
   {
-    STSPIN820_Board_SetDecayGpio(1);
+    STSPIN820_SetDecayGpio(1);
   }
   else if (decay == MIXED_DECAY)
   {
-    STSPIN820_Board_SetDecayGpio(0);
+    STSPIN820_SetDecayGpio(0);
   }
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Changes the deceleration of the specified device
- * @param[in] deviceId Unused parameter
  * @param[in] newDec New deceleration to apply in pps^2
  * @retval true if the command is successfully executed, else false
  * @note The command is not performed if the device is executing 
  * a MOVE or GOTO command (but it can be used during a RUN command)
  **********************************************************/
-bool STSPIN820::STSPIN820_SetDeceleration(uint8_t deviceId, uint16_t newDec)
+bool STSPIN820::STSPIN820_SetDeceleration(uint16_t newDec)
 {
   bool cmdExecuted = FALSE;
   if ((newDec != 0)&& 
@@ -871,65 +832,61 @@
   return cmdExecuted;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Specifies the direction 
- * @param[in] deviceId Unused parameter
  * @param[in] dir FORWARD or BACKWARD
  * @note The direction change is applied if the device 
  * is in INACTIVE or STANDBY state or if the device is 
  * executing a run command
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_SetDirection(uint8_t deviceId, motor_direction_t dir)
+void STSPIN820::STSPIN820_SetDirection(motor_direction_t dir)
 {
   if ((device_prm.motionState == INACTIVE)||\
       (device_prm.motionState == STANDBY))
   {
     device_prm.direction = dir;
-    STSPIN820_Board_SetDirectionGpio(dir);
+    STSPIN820_SetDirectionGpio(dir);
   }
   else if ((device_prm.commandExecuted&RUN_CMD)!=0)
   {
-    device_prm.commandExecuted|=STSPIN820_DIR_CHANGE_BIT_MASK;
+    device_prm.commandExecuted = (device_command_t) (device_prm.commandExecuted | STSPIN820_DIR_CHANGE_BIT_MASK);
   }
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Set current position to be the Home position
  * (current position set to 0)
- * @param[in] deviceId Unused parameter
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_SetHome(uint8_t deviceId)
+void STSPIN820::STSPIN820_SetHome(void)
 {
   device_prm.currentPosition = 0;
 }
  
-/******************************************************//**
+/**********************************************************
  * @brief  Set current position to be the Mark position 
- * @param[in] deviceId Unused parameter
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_SetMark(uint8_t deviceId)
+void STSPIN820::STSPIN820_SetMark(void)
 {
   device_prm.markPosition = device_prm.currentPosition;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Changes the max speed of the specified device
- * @param[in] deviceId Unused parameter
  * @param[in] newMaxSpeed New max speed  to apply in pps
  * @retval true if the command is successfully executed, else false
  * @note The command is not performed is the device is executing 
  * a MOVE or GOTO command (but it can be used during a RUN command).
  **********************************************************/
-bool STSPIN820::STSPIN820_SetMaxSpeed(uint8_t deviceId, uint16_t newMaxSpeed)
+bool STSPIN820::STSPIN820_SetMaxSpeed(uint16_t newMaxSpeed)
 {
   bool cmdExecuted = FALSE;
   if ((newMaxSpeed >= STSPIN820_MIN_STCK_FREQ)&&\
       ((newMaxSpeed <= STSPIN820_MAX_STCK_FREQ)||\
        ((device_prm.torqueBoostEnable != FALSE)&&\
-        ((newMaxSpeed>>STSPIN820_GetStepMode(deviceId))<= STSPIN820_MAX_STCK_FREQ)))&&\
+        ((newMaxSpeed>>STSPIN820_GetStepMode())<= STSPIN820_MAX_STCK_FREQ)))&&\
       (device_prm.minSpeed <= newMaxSpeed) &&\
       (((device_prm.motionState & INACTIVE) == INACTIVE)||\
       (device_prm.commandExecuted == RUN_CMD)))
@@ -940,15 +897,14 @@
   return cmdExecuted;
 }                                                     
 
-/******************************************************//**
+/**********************************************************
  * @brief  Changes the min speed of the specified device
- * @param[in] deviceId Unused parameter
  * @param[in] newMinSpeed New min speed  to apply in pps
  * @retval true if the command is successfully executed, else false
  * @note The command is not performed is the device is executing 
  * a MOVE or GOTO command (but it can be used during a RUN command).
  **********************************************************/
-bool STSPIN820::STSPIN820_SetMinSpeed(uint8_t deviceId, uint16_t newMinSpeed)
+bool STSPIN820::STSPIN820_SetMinSpeed(uint16_t newMinSpeed)
 {
   bool cmdExecuted = FALSE;
   if ((newMinSpeed >= STSPIN820_MIN_STCK_FREQ)&&
@@ -963,7 +919,7 @@
   return cmdExecuted;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Sets the number of devices to be used 
  * @param[in] nbDevices (from 1 to MAX_NUMBER_OF_DEVICES)
  * @retval TRUE if successfull, FALSE if failure, attempt to set a number of 
@@ -982,15 +938,14 @@
   }
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Set the stepping mode 
- * @param[in] deviceId Unused parameter
  * @param[in] stepMode from full step to 1/256 microstep
  * as specified in enum motor_step_mode_t
  * 1/64 microstep mode not supported by STSPIN820
  * @retval true if the command is successfully executed, else false
  **********************************************************/
-bool STSPIN820::STSPIN820_SetStepMode(uint8_t deviceId, motor_step_mode_t stepMode)
+bool STSPIN820::STSPIN820_SetStepMode(motor_step_mode_t stepMode)
 {
   /* Store step mode */
   device_prm.stepMode = stepMode;
@@ -1000,28 +955,28 @@
   switch (stepMode)
   {
     case STEP_MODE_FULL:
-      STSPIN820_Board_SetFullStep();
+      STSPIN820_SetFullStep();
       break;
     case STEP_MODE_HALF:
-      STSPIN820_Board_SetModePins(1, 0, 0);
+      STSPIN820_SetModePins(1, 0, 0);
       break;    
     case STEP_MODE_1_4:
-      STSPIN820_Board_SetModePins(0, 1, 0);
+      STSPIN820_SetModePins(0, 1, 0);
       break;        
     case STEP_MODE_1_8:
-      STSPIN820_Board_SetModePins(1, 1, 0);
+      STSPIN820_SetModePins(1, 1, 0);
       break;
     case STEP_MODE_1_16:
-      STSPIN820_Board_SetModePins(0, 0, 1);
+      STSPIN820_SetModePins(0, 0, 1);
       break;   
     case STEP_MODE_1_32:
-      STSPIN820_Board_SetModePins(1, 0, 1);
+      STSPIN820_SetModePins(1, 0, 1);
       break;   
     case STEP_MODE_1_128:
-      STSPIN820_Board_SetModePins(0, 1, 1);
+      STSPIN820_SetModePins(0, 1, 1);
       break;  
     case STEP_MODE_1_256:
-      STSPIN820_Board_SetModePins(1, 1, 1);
+      STSPIN820_SetModePins(1, 1, 1);
       break;
     default:
       return FALSE;
@@ -1031,26 +986,24 @@
   
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Select the mode to stop the motor.
- * @param[in] deviceId Unused parameter
  * @param[in] stopMode HOLD_MODE to let power bridge enabled
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_SetStopMode(uint8_t deviceId, motor_stop_mode_t stopMode)
+void STSPIN820::STSPIN820_SetStopMode(motor_stop_mode_t stopMode)
 {
   device_prm.stopMode = stopMode;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Set the torque of the specified device
- * @param[in] deviceId Unused parameter
  * @param[in] torqueMode Torque mode as specified in enum motor_torque_mode_t
  * @param[in] torqueValue in % (from 0 to 100)
  * @retval None
  * @note
  **********************************************************/
-void STSPIN820::STSPIN820_SetTorque(uint8_t deviceId, motor_torque_mode_t torqueMode, uint8_t torqueValue)
+void STSPIN820::STSPIN820_SetTorque(motor_torque_mode_t torqueMode, uint8_t torqueValue)
 {
   device_prm.updateTorque = TRUE;
   if (torqueValue>100)
@@ -1076,97 +1029,91 @@
       }
     case CURRENT_TORQUE:
       device_prm.currentTorque = torqueValue;
-      STSPIN820_Board_PwmRefSetFreqAndDutyCycle(device_prm.refPwmFreq,torqueValue);
+      STSPIN820_PwmRefSetFreqAndDutyCycle(device_prm.refPwmFreq,torqueValue);
     default:
       device_prm.updateTorque = FALSE;
       break; //ignore error
   }
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Enable or disable the torque boost feature
- * @param[in] deviceId Unused parameter
  * @param[in] enable true to enable torque boost, false to disable
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_SetTorqueBoostEnable(uint8_t deviceId, bool enable)
+void STSPIN820::STSPIN820_SetTorqueBoostEnable(bool enable)
 {
   device_prm.torqueBoostEnable = enable;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Set the torque boost threshold
- * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1)
+ * @param[in]  (from 0 to MAX_NUMBER_OF_DEVICES - 1)
  * @param[in] speedThreshold speed threshold above which the step mode is
  * changed to full step
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_SetTorqueBoostThreshold(uint8_t deviceId, uint16_t speedThreshold)
+void STSPIN820::STSPIN820_SetTorqueBoostThreshold(uint16_t speedThreshold)
 {
   device_prm.torqueBoostSpeedThreshold = speedThreshold;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Stops the motor by using the device deceleration
- * @param[in] deviceId Unused parameter
  * @retval true if the command is successfully executed, else false
  * @note The command is not performed if the device is in INACTIVE,
  * STANDBYTOINACTIVE or STANDBY state.
  **********************************************************/
-bool STSPIN820::STSPIN820_SoftStop(uint8_t deviceId)
+bool STSPIN820::STSPIN820_SoftStop(void)
 {
   bool cmdExecuted = FALSE;
   if ((device_prm.motionState & INACTIVE) != INACTIVE)
   {
-    device_prm.commandExecuted |= STSPIN820_SOFT_STOP_BIT_MASK;
+    device_prm.commandExecuted = (device_command_t) (device_prm.commandExecuted | STSPIN820_SOFT_STOP_BIT_MASK);
     cmdExecuted = TRUE;
   }
   return (cmdExecuted);
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Get the frequency of REF PWM of the specified device
- * @param[in] deviceId Unused parameter
  * @retval the frequency of REF PWM in Hz
  * @note
  **********************************************************/
-uint32_t STSPIN820::STSPIN820_VrefPwmGetFreq(uint8_t deviceId)
+uint32_t STSPIN820::STSPIN820_VrefPwmGetFreq(void)
 {
   return device_prm.refPwmFreq;
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Set the frequency of REF PWM of the specified device
- * @param[in] deviceId Unused parameter
  * @param[in] newFreq in Hz
  * @retval None
  * @note
  **********************************************************/
-void STSPIN820::STSPIN820_VrefPwmSetFreq(uint8_t deviceId, uint32_t newFreq)
+void STSPIN820::STSPIN820_VrefPwmSetFreq(uint32_t newFreq)
 {
   device_prm.refPwmFreq = newFreq;
-  STSPIN820_Board_PwmRefSetFreqAndDutyCycle(newFreq,device_prm.currentTorque);
+  STSPIN820_PwmRefSetFreqAndDutyCycle(newFreq,device_prm.currentTorque);
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Locks until the device state becomes Inactive
- * @param[in] deviceId Unused parameter
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_WaitWhileActive(uint8_t deviceId)
+void STSPIN820::STSPIN820_WaitWhileActive(void)
 {
   /* Wait while motor is running */
-  while (((STSPIN820_GetDeviceState(deviceId)&INACTIVE)!=INACTIVE)||\
-   (((STSPIN820_GetDeviceState(deviceId)&INACTIVE)==INACTIVE)&&(toggle_odd!=0)));
+  while (((STSPIN820_GetDeviceState()&INACTIVE)!=INACTIVE)||\
+   (((STSPIN820_GetDeviceState()&INACTIVE)==INACTIVE)&&(toggle_odd!=0)));
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Updates the current speed of the device
- * @param[in] deviceId Unused parameter
  * @param[in] newSpeed in pps
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_ApplySpeed(uint8_t deviceId, uint16_t newSpeed)
+void STSPIN820::STSPIN820_ApplySpeed(uint16_t newSpeed)
 {
   if (device_prm.torqueBoostEnable != FALSE)
   {
@@ -1184,8 +1131,8 @@
       {         
         if ((device_prm.sequencerPosition & 0xFF) == 0x80)
        {
-          STSPIN820_Board_SetFullStep();
-          device_prm.stepMode = STEP_MODE_FULL;
+          STSPIN820_SetFullStep();
+          device_prm.stepMode = (motor_step_mode_t) STEP_MODE_FULL;
           device_prm.accu >>= device_prm.stepModeLatched;
           newSpeed >>= device_prm.stepModeLatched;
        }
@@ -1197,7 +1144,7 @@
                ((device_prm.stepsToTake-device_prm.relativePos)<=\
                 (1<<device_prm.stepModeLatched))))
     {
-      STSPIN820_SetStepMode(0, device_prm.stepModeLatched);
+      STSPIN820_SetStepMode(device_prm.stepModeLatched);
       device_prm.stepMode = device_prm.stepModeLatched;
       device_prm.accu <<= device_prm.stepModeLatched;
       newSpeed <<= device_prm.stepModeLatched;
@@ -1206,7 +1153,7 @@
   else if (device_prm.stepMode != device_prm.stepModeLatched)
   {
     //torqueBoostEnable has just been disabled
-    STSPIN820_SetStepMode(0, device_prm.stepModeLatched);
+    STSPIN820_SetStepMode(device_prm.stepModeLatched);
     device_prm.stepMode = device_prm.stepModeLatched;
     device_prm.accu <<= device_prm.stepModeLatched;
     newSpeed <<= device_prm.stepModeLatched;
@@ -1222,18 +1169,17 @@
   }
   
   device_prm.speed = newSpeed;
-  STSPIN820_Board_TimStckSetFreq(newSpeed);
+  STSPIN820_TimStckSetFreq(newSpeed);
 
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Apply the set torque to the specified device
- * @param[in] deviceId Unused parameter
  * @param[in] torqueMode torque mode
  * @retval None
  * @note
  **********************************************************/
-void STSPIN820::STSPIN820_ApplyTorque(uint8_t deviceId, motor_torque_mode_t torqueMode)
+void STSPIN820::STSPIN820_ApplyTorque(motor_torque_mode_t torqueMode)
 {
   uint8_t torqueValue = 0;
   device_prm.updateTorque = FALSE;
@@ -1257,12 +1203,11 @@
       return; //ignore error
   }
   torqueValue = device_prm.currentTorque;
-  STSPIN820_Board_PwmRefSetFreqAndDutyCycle(device_prm.refPwmFreq,torqueValue);
+  STSPIN820_PwmRefSetFreqAndDutyCycle(device_prm.refPwmFreq,torqueValue);
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Computes the speed profile according to the number of steps to move
- * @param[in] deviceId Unused parameter
  * @param[in] nbSteps number of steps to perform
  * @retval None
  * @note Using the acceleration and deceleration of the device,
@@ -1274,7 +1219,7 @@
  * Else, a triangular move is performed (no steady phase: the maximum speed is never
  * reached.
  **********************************************************/
-void STSPIN820::STSPIN820_ComputeSpeedProfile(uint8_t deviceId, uint32_t nbSteps)
+void STSPIN820::STSPIN820_ComputeSpeedProfile(uint32_t nbSteps)
 {
   uint32_t reqAccSteps; 
     uint32_t reqDecSteps;
@@ -1325,7 +1270,7 @@
     }
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Handlers of the flag interrupt which calls the user callback (if defined)
  * @retval None
  **********************************************************/
@@ -1337,7 +1282,7 @@
   }
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Set the parameters of the device whose values are not defined in
  * STSPIN820_config.h
  * @retval None
@@ -1366,7 +1311,7 @@
   }
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Set the parameters of the device to values of initDevicePrm structure
  * @param pInitDevicePrm structure containing values to initialize the device 
  * parameters
@@ -1374,45 +1319,50 @@
  **********************************************************/
 void STSPIN820::STSPIN820_SetDeviceParamsToGivenValues(STSPIN820_init_t* pInitDevicePrm)
 {
+  int i = 100;
+  printf("%d\r\n", i++);
   device_prm.motionState = STANDBY;;
 
-  if (STSPIN820_SetAcceleration(0,pInitDevicePrm->acceleration)==FALSE)
+  if (STSPIN820_SetAcceleration(pInitDevicePrm->acceleration)==FALSE)
   {
     STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_ACCELERATION);
   }
-  if (STSPIN820_SetDeceleration(0,pInitDevicePrm->deceleration)==FALSE)
+  printf("%d\r\n", i++);
+  if (STSPIN820_SetDeceleration(pInitDevicePrm->deceleration)==FALSE)
   {
     STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_DECELERATION);
   }
-  if (STSPIN820_SetMaxSpeed(0,pInitDevicePrm->maxSpeed)==FALSE)
+  printf("%d\r\n", i++);
+  if (STSPIN820_SetMaxSpeed(pInitDevicePrm->maxSpeed)==FALSE)
   {
     STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_MAX_SPEED);
   }
-  if (STSPIN820_SetMinSpeed(0,pInitDevicePrm->minSpeed)==FALSE)
+  printf("%d\r\n", i++);
+  if (STSPIN820_SetMinSpeed(pInitDevicePrm->minSpeed)==FALSE)
   {
     STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_MIN_SPEED);
   }
- 
-  STSPIN820_VrefPwmSetFreq(0,pInitDevicePrm->vrefPwmFreq);
-  STSPIN820_SetTorque(0,ACC_TORQUE,pInitDevicePrm->accelTorque);
-  STSPIN820_SetTorque(0,DEC_TORQUE,pInitDevicePrm->decelTorque);
-  STSPIN820_SetTorque(0,RUN_TORQUE,pInitDevicePrm->runTorque);
-  STSPIN820_SetTorque(0,HOLD_TORQUE,pInitDevicePrm->holdTorque);
+  printf("%d\r\n", i++);
+  STSPIN820_VrefPwmSetFreq(pInitDevicePrm->vrefPwmFreq);
+  STSPIN820_SetTorque(ACC_TORQUE,pInitDevicePrm->accelTorque);
+  STSPIN820_SetTorque(DEC_TORQUE,pInitDevicePrm->decelTorque);
+  STSPIN820_SetTorque(RUN_TORQUE,pInitDevicePrm->runTorque);
+  STSPIN820_SetTorque(HOLD_TORQUE,pInitDevicePrm->holdTorque);
   device_prm.torqueBoostEnable = pInitDevicePrm->torqueBoostEnable;
   device_prm.torqueBoostSpeedThreshold = pInitDevicePrm->torqueBoostSpeedThreshold;
-  STSPIN820_SetStopMode(0,pInitDevicePrm->stopMode);
-
+  STSPIN820_SetStopMode(pInitDevicePrm->stopMode);
+  printf("%d\r\n", i++);
   STSPIN820_SetDeviceParamsOtherValues();
-  
+  printf("%d\r\n", i++);
   /* Eventually deactivate motor */
   if ((device_prm.motionState != INACTIVE)&&\
       (device_prm.motionState != STANDBY))
   {
-    STSPIN820_HardHiZ(0);
+    STSPIN820_HardHiZ();
   }
 
   /* Enter standby */
-  STSPIN820_Board_Reset();
+  STSPIN820_Reset();
   
   /* Reset the microstepping sequencer position */
   device_prm.sequencerPosition = 0;
@@ -1422,20 +1372,20 @@
   device_prm.markPosition = 0;
   
   /* Set predefined step mode */
-  STSPIN820_SetStepMode(0, pInitDevicePrm->stepMode);
+  STSPIN820_SetStepMode(pInitDevicePrm->stepMode);
   
   /* Wait */
-  STSPIN820_Board_Delay(SELECT_STEP_MODE_DELAY);
+  STSPIN820_Delay(SELECT_STEP_MODE_DELAY);
   
   /* Exit standby */
-  STSPIN820_Board_ReleaseReset();
+  STSPIN820_ReleaseReset();
   
     /* Let a delay after reset release*/
-  STSPIN820_Board_Delay(AFTER_STANDBY_EXIT_DEAD_TIME);
+  STSPIN820_Delay(AFTER_STANDBY_EXIT_DEAD_TIME);
   
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Sets the parameters of the device to predefined values
  * from STSPIN820_config.h
  * @retval None
@@ -1444,31 +1394,31 @@
 {
   device_prm.motionState = STANDBY;
 
-  if (STSPIN820_SetAcceleration(0,STSPIN820_CONF_PARAM_ACC)==FALSE)
+  if (STSPIN820_SetAcceleration(STSPIN820_CONF_PARAM_ACC)==FALSE)
   {
     STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_ACCELERATION);
   }
-  if (STSPIN820_SetDeceleration(0,STSPIN820_CONF_PARAM_DEC)==FALSE)
+  if (STSPIN820_SetDeceleration(STSPIN820_CONF_PARAM_DEC)==FALSE)
   {
     STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_DECELERATION);
   }
-  if (STSPIN820_SetMaxSpeed(0,STSPIN820_CONF_PARAM_RUNNING_SPEED)==FALSE)
+  if (STSPIN820_SetMaxSpeed(STSPIN820_CONF_PARAM_RUNNING_SPEED)==FALSE)
   {
     STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_MAX_SPEED);
   }
-  if (STSPIN820_SetMinSpeed(0,STSPIN820_CONF_PARAM_MIN_SPEED)==FALSE)
+  if (STSPIN820_SetMinSpeed(STSPIN820_CONF_PARAM_MIN_SPEED)==FALSE)
   {
     STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_MIN_SPEED);
   }
 
-  STSPIN820_VrefPwmSetFreq(0,STSPIN820_CONF_PARAM_REF_PWM_FREQUENCY);
-  STSPIN820_SetTorque(0,ACC_TORQUE,STSPIN820_CONF_PARAM_ACC_TORQUE);
-  STSPIN820_SetTorque(0,DEC_TORQUE,STSPIN820_CONF_PARAM_DEC_TORQUE);
-  STSPIN820_SetTorque(0,RUN_TORQUE,STSPIN820_CONF_PARAM_RUNNING_TORQUE);
-  STSPIN820_SetTorque(0,HOLD_TORQUE,STSPIN820_CONF_PARAM_HOLDING_TORQUE);
+  STSPIN820_VrefPwmSetFreq(STSPIN820_CONF_PARAM_REF_PWM_FREQUENCY);
+  STSPIN820_SetTorque(ACC_TORQUE,STSPIN820_CONF_PARAM_ACC_TORQUE);
+  STSPIN820_SetTorque(DEC_TORQUE,STSPIN820_CONF_PARAM_DEC_TORQUE);
+  STSPIN820_SetTorque(RUN_TORQUE,STSPIN820_CONF_PARAM_RUNNING_TORQUE);
+  STSPIN820_SetTorque(HOLD_TORQUE,STSPIN820_CONF_PARAM_HOLDING_TORQUE);
   device_prm.torqueBoostEnable = STSPIN820_CONF_PARAM_TORQUE_BOOST_EN;
   device_prm.torqueBoostSpeedThreshold = STSPIN820_CONF_PARAM_TORQUE_BOOST_TH;
-  STSPIN820_SetStopMode(0,STSPIN820_CONF_PARAM_AUTO_HIZ_STOP);
+  STSPIN820_SetStopMode(STSPIN820_CONF_PARAM_AUTO_HIZ_STOP);
 
   STSPIN820_SetDeviceParamsOtherValues();
   
@@ -1476,11 +1426,11 @@
   if ((device_prm.motionState != INACTIVE)&&\
       (device_prm.motionState != STANDBY))
   {
-    STSPIN820_HardHiZ(0);
+    STSPIN820_HardHiZ();
   }
 
   /* Enter standby */
-  STSPIN820_Board_Reset();
+  STSPIN820_Reset();
   
   /* Reset the microstepping sequencer position */
   device_prm.sequencerPosition = 0;
@@ -1490,30 +1440,27 @@
   device_prm.markPosition = 0;
   
   /* Set predefined step mode */
-  STSPIN820_SetStepMode(0, STSPIN820_CONF_PARAM_STEP_MODE);
+  STSPIN820_SetStepMode((motor_step_mode_t) STSPIN820_CONF_PARAM_STEP_MODE);
     
   /* Wait */
-  STSPIN820_Board_Delay(SELECT_STEP_MODE_DELAY);
+  STSPIN820_Delay(SELECT_STEP_MODE_DELAY);
   
   /* Exit standby */
-  STSPIN820_Board_ReleaseReset();
+  STSPIN820_ReleaseReset();
   
   /* Let a delay after reset release*/
-  STSPIN820_Board_Delay(AFTER_STANDBY_EXIT_DEAD_TIME);
+  STSPIN820_Delay(AFTER_STANDBY_EXIT_DEAD_TIME);
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief Initialises the bridge parameters to start the movement
  * and enable the power bridge
- * @param[in] deviceId Unused parameter
  * @retval None
  **********************************************************/
-void STSPIN820::STSPIN820_StartMovement(uint8_t deviceId)  
+void STSPIN820::STSPIN820_StartMovement(void)  
 {
-  deviceId = 0;
-  
   /* Enable STSPIN820 powerstage */
-  STSPIN820_Enable(deviceId);
+  STSPIN820_Enable();
   toggle_odd = 0;
   device_prm.accu = 0;
   device_prm.relativePos = 0;  
@@ -1521,34 +1468,32 @@
       (device_prm.commandExecuted != RUN_CMD))
   {
     device_prm.motionState = DECELERATING;
-    STSPIN820_ApplyTorque(deviceId, DEC_TORQUE);
+    STSPIN820_ApplyTorque(DEC_TORQUE);
   }
   else
   {
     device_prm.motionState = ACCELERATING;
-    STSPIN820_ApplyTorque(deviceId, ACC_TORQUE);
+    STSPIN820_ApplyTorque(ACC_TORQUE);
   }
-  STSPIN820_Board_PwmRefStart();
+  STSPIN820_PwmRefStart();
   /* Initialize the step clock timer */
-  STSPIN820_Board_TimStckInit();
+  STSPIN820_TimStckInit();
   /* Program the step clock */
-  STSPIN820_Board_TimStckCompareInit();
-  STSPIN820_ApplySpeed(deviceId, device_prm.minSpeed);
-  STSPIN820_Board_TimStckStart();
+  STSPIN820_TimStckCompareInit();
+  STSPIN820_ApplySpeed(device_prm.minSpeed);
+  STSPIN820_TimStckStart();
 }
 
-/******************************************************//**
+/**********************************************************
  * @brief  Handles the device state machine at each pulse
- * @param[in] deviceId Unused parameter
  * @retval None
  * @note Must only be called by the timer ISR
  **********************************************************/
-void STSPIN820::STSPIN820_StepClockHandler(uint8_t deviceId)
+void STSPIN820::STSPIN820_StepClockHandler(void)
 {
   uint32_t stepModeShift = device_prm.stepModeLatched - device_prm.stepMode;
   uint16_t tmp;
-  deviceId = 0;
-  
+
   if (device_prm.motionState == STANDBYTOINACTIVE)
   {
     if (toggle_odd != 0)
@@ -1556,7 +1501,7 @@
       toggle_odd = 0;
       if (device_prm.sequencerPosition == 0)
       {
-        if (STSPIN820_Board_TimStckStop(&toggle_odd) == 0)
+        if (STSPIN820_TimStckStop(&toggle_odd) == 0)
         {
           STSPIN820_ErrorHandler(STSPIN820_ERROR_STEP_CLOCK);
         }
@@ -1569,7 +1514,7 @@
       tmp = (1 << (STEP_MODE_1_256-device_prm.stepMode));
       device_prm.sequencerPosition -= tmp;
     }
-    STSPIN820_Board_TimStckSetFreq(STSPIN820_MAX_STCK_FREQ);
+    STSPIN820_TimStckSetFreq(STSPIN820_MAX_STCK_FREQ);
     return;
   }  
   
@@ -1620,14 +1565,14 @@
             device_prm.motionState = DECELERATING;
             device_prm.accu = 0;
             /* Apply decelerating torque */
-            STSPIN820_ApplyTorque(deviceId, DEC_TORQUE);
+            STSPIN820_ApplyTorque(DEC_TORQUE);
           }
           else if ((speed>=(device_prm.maxSpeed>>stepModeShift))||\
                    ((device_prm.commandExecuted==MOVE_CMD)&&(relPos >= endAccPos)))
           {
             device_prm.motionState = STEADY;
             /* Apply running torque */
-            STSPIN820_ApplyTorque(deviceId, RUN_TORQUE);
+            STSPIN820_ApplyTorque(RUN_TORQUE);
           }
           else
           {
@@ -1657,7 +1602,7 @@
             if (device_prm.updateTorque!=FALSE)
             {
               /* Apply accelerating torque */
-              STSPIN820_ApplyTorque(deviceId, ACC_TORQUE);              
+              STSPIN820_ApplyTorque(ACC_TORQUE);              
             }
           }
           break;
@@ -1669,7 +1614,7 @@
         if (device_prm.updateTorque!=FALSE)
         {
           /* Apply accelerating torque */
-          STSPIN820_ApplyTorque(deviceId, RUN_TORQUE);
+          STSPIN820_ApplyTorque(RUN_TORQUE);
         }
         if  (((device_prm.commandExecuted&(STSPIN820_SOFT_STOP_BIT_MASK|STSPIN820_DIR_CHANGE_BIT_MASK))!=0)||\
              ((device_prm.commandExecuted==MOVE_CMD)&&\
@@ -1680,14 +1625,14 @@
           device_prm.motionState = DECELERATING;
           device_prm.accu = 0;
           /* Apply decelerating torque */
-          STSPIN820_ApplyTorque(deviceId, DEC_TORQUE);
+          STSPIN820_ApplyTorque(DEC_TORQUE);
         }
         else if ((device_prm.commandExecuted==RUN_CMD)&&(device_prm.speed<maxSpeed))
         {
           device_prm.motionState = ACCELERATING;
           device_prm.accu = 0;
           /* Apply accelerating torque */
-          STSPIN820_ApplyTorque(deviceId, ACC_TORQUE);
+          STSPIN820_ApplyTorque(ACC_TORQUE);
         }
         break;
       }
@@ -1703,33 +1648,33 @@
           /* Motion process complete */
           if ((device_prm.commandExecuted&STSPIN820_DIR_CHANGE_BIT_MASK)!=0)
           {
-            device_prm.commandExecuted&=~STSPIN820_DIR_CHANGE_BIT_MASK;
+            device_prm.commandExecuted = (device_command_t) (device_prm.commandExecuted & ~STSPIN820_DIR_CHANGE_BIT_MASK);
             if (device_prm.direction==BACKWARD)
             {
               device_prm.direction=FORWARD;
             }
             else device_prm.direction=BACKWARD;
-            STSPIN820_Board_SetDirectionGpio(device_prm.direction);
+            STSPIN820_SetDirectionGpio(device_prm.direction);
             if ((device_prm.commandExecuted&STSPIN820_SOFT_STOP_BIT_MASK)==0)
             {
               device_prm.motionState = ACCELERATING;
               device_prm.accu = 0;
               /* Apply accelerating torque */
-              STSPIN820_ApplyTorque(deviceId, ACC_TORQUE);
+              STSPIN820_ApplyTorque(ACC_TORQUE);
               break;
             }
           }
           if (device_prm.stopMode==HOLD_MODE)
           {
-            STSPIN820_HardStop(deviceId);
+            STSPIN820_HardStop();
           }
           else if (device_prm.stopMode==STANDBY_MODE)
           {
-            STSPIN820_PutDeviceInStandby(deviceId);
+            STSPIN820_PutDeviceInStandby();
           }
           else
           {
-            STSPIN820_HardHiZ(deviceId);
+            STSPIN820_HardHiZ();
           }
         }
         else if ((device_prm.commandExecuted==RUN_CMD)&&
@@ -1737,7 +1682,7 @@
         {
           device_prm.motionState = STEADY;
           /* Apply running torque */
-          STSPIN820_ApplyTorque(deviceId, RUN_TORQUE);
+          STSPIN820_ApplyTorque(RUN_TORQUE);
         }
         else
         {
@@ -1772,7 +1717,7 @@
             if (device_prm.updateTorque!=FALSE)
             {
               /* Apply decelerating torque */
-              STSPIN820_ApplyTorque(deviceId, DEC_TORQUE);
+              STSPIN820_ApplyTorque(DEC_TORQUE);
             }
           }
         }
@@ -1786,14 +1731,15 @@
   }
   if ((device_prm.motionState & INACTIVE) != INACTIVE)
   {
-    STSPIN820_ApplySpeed(deviceId, device_prm.speed);
+    STSPIN820_ApplySpeed(device_prm.speed);
   }
   else
   {
-    if (STSPIN820_Board_TimStckStop(&toggle_odd) == 0)
+    if (STSPIN820_TimStckStop(&toggle_odd) == 0)
     {
       STSPIN820_ErrorHandler(STSPIN820_ERROR_STEP_CLOCK);
     }
   }
 }
+
 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- a/Components/STSPIN820/STSPIN820.h	Fri Apr 27 17:02:08 2018 +0000
+++ b/Components/STSPIN820/STSPIN820.h	Thu Sep 27 14:05:44 2018 +0000
@@ -1,40 +1,41 @@
 /**
-  ******************************************************************************
-  * @file    STSPIN820.h
-  * @author  STM
-  * @version V1.0.0
-  * @date    August 7th, 2017
-  * @brief   STSPIN820 driver (fully integrated microstepping motor driver)
-  * @note    (C) COPYRIGHT 2017 STMicroelectronics
-  ******************************************************************************
-  * @attention
-  *
-  * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
-  *
-  * Redistribution and use in source and binary forms, with or without modification,
-  * are permitted provided that the following conditions are met:
-  *   1. Redistributions of source code must retain the above copyright notice,
-  *      this list of conditions and the following disclaimer.
-  *   2. Redistributions in binary form must reproduce the above copyright notice,
-  *      this list of conditions and the following disclaimer in the documentation
-  *      and/or other materials provided with the distribution.
-  *   3. Neither the name of STMicroelectronics nor the names of its contributors
-  *      may be used to endorse or promote products derived from this software
-  *      without specific prior written permission.
-  *
-  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-  *
-  ******************************************************************************
-  */
+ *******************************************************************************
+ * @file    STSPIN820.h
+ * @author  Davide Aliprandi, STMicroelectronics
+ * @version V1.0.0
+ * @date    May 3rd, 2018
+ * @brief   This file contains the class definition of an STSPIN820 Motor
+ *          Control component.
+ * @note    (C) COPYRIGHT 2018 STMicroelectronics
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2018 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *   1. Redistributions of source code must retain the above copyright notice,
+ *      this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright notice,
+ *      this list of conditions and the following disclaimer in the documentation
+ *      and/or other materials provided with the distribution.
+ *   3. Neither the name of STMicroelectronics nor the names of its contributors
+ *      may be used to endorse or promote products derived from this software
+ *      without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *******************************************************************************
+ */
 
 
 /* Generated with STM32CubeTOO -----------------------------------------------*/
@@ -61,7 +62,6 @@
  * Include here platform specific header files.                               *
  *----------------------------------------------------------------------------*/        
 #include "mbed.h"
-#include "DevSPI.h"
 /* ACTION 2 ------------------------------------------------------------------*
  * Include here component specific header files.                              *
  *----------------------------------------------------------------------------*/        
@@ -70,18 +70,18 @@
  * Include here interface specific header files.                              *
  *                                                                            *
  * Example:                                                                   *
- *   #include "../Interfaces/Humidity.h"                                *
- *   #include "../Interfaces/Temperature.h"                             *
+ *   #include "../Interfaces/Humidity.h"                                      *
+ *   #include "../Interfaces/Temperature.h"                                   *
  *----------------------------------------------------------------------------*/
-#include "../Interfaces/Motor.h"
+#include "StepperMotor.h"
 
 
 /* Classes -------------------------------------------------------------------*/
 
 /**
- * @brief Class representing a STSPIN820 component.
+ * @brief Class representing an STSPIN820 component.
  */
-class STSPIN820 : public Motor
+class STSPIN820 : public StepperMotor
 {
 public:
 
@@ -89,11 +89,35 @@
 
     /**
      * @brief Constructor.
-     * @param ssel pin name of the SSEL pin of the SPI device to be used for communication.
-     * @param spi  SPI device to be used for communication.
+     * @param en_fault_irq  pin name of the EN_FAULT pin of the component.
+     * @param standby_reset pin name of the STBY\RST pin of the component.
+     * @param direction     pin name of the DIR pin of the component.
+     * @param ref_pwm       pin name of the REF_PWM pin of the component.
+     * @param decay         pin name of the DECAY pin of the component.
+     * @param step_clock    pin name of the STCK pin of the component.
+     * @param mode1         pin name of the MODE1 pin of the component.
+     * @param mode2         pin name of the MODE2 pin of the component.
+     * @param mode3         pin name of the MODE3 pin of the component.
      */
-    STSPIN820(PinName ssel, DevSPI &spi) : Motor(), ssel(ssel), dev_spi(spi)
+    STSPIN820(PinName en_fault_irq, PinName standby_reset, PinName direction,
+              PinName ref_pwm, PinName decay, PinName step_clock,
+              PinName mode1, PinName mode2, PinName mode3) :
+              StepperMotor(),
+              en_fault_irq(en_fault_irq),
+              standby_reset(standby_reset),
+              direction(direction),
+              ref_pwm(ref_pwm),
+              decay(decay),
+              step_clock(step_clock),
+              mode1(mode1),
+              mode2(mode2),
+              mode3(mode3)
     {
+        /* Checking stackability. */
+        if (!(number_of_devices < MAX_NUMBER_OF_DEVICES)) {
+            error("Instantiation of the STSPIN820 component failed: it can be stacked up to %d times.\r\n", MAX_NUMBER_OF_DEVICES);
+        }
+
         /* ACTION 4 ----------------------------------------------------------*
          * Initialize here the component's member variables, one variable per *
          * line.                                                              *
@@ -105,9 +129,9 @@
         flag_interrupt_callback = 0;
         error_handler_callback = 0;
         toggle_odd = 0;
-        device_prm = 0;
-        number_of_devices = 0;
-        device_instance = 0;
+        pwm_period = 1;
+        pwm_duty_cycle = 0;
+        device_instance = number_of_devices++;
     }
     
     /**
@@ -163,24 +187,24 @@
         STSPIN820_FlagInterruptHandler();
     }
 
-    virtual uint16_t get_acceleration(uint8_t deviceId)
+    virtual unsigned int get_acceleration(void)
     {
-        return (uint16_t) STSPIN820_GetAcceleration((uint8_t) deviceId);
+        return (unsigned int) STSPIN820_GetAcceleration();
     }
 
-    virtual uint16_t get_current_speed(uint8_t deviceId)
+    virtual unsigned int get_speed(void)
     {
-        return (uint16_t) STSPIN820_GetCurrentSpeed((uint8_t) deviceId);
+        return (unsigned int) STSPIN820_GetCurrentSpeed();
     }
 
-    virtual uint16_t get_deceleration(uint8_t deviceId)
+    virtual unsigned int get_deceleration(void)
     {
-        return (uint16_t) STSPIN820_GetDeceleration((uint8_t) deviceId);
+        return (unsigned int) STSPIN820_GetDeceleration();
     }
 
-    virtual motor_state_t get_device_state(uint8_t deviceId)
+    virtual motor_state_t get_device_state(void)
     {
-        return (motor_state_t) STSPIN820_GetDeviceState((uint8_t) deviceId);
+        return (motor_state_t) STSPIN820_GetDeviceState();
     }
 
     virtual uint32_t get_fw_version(void)
@@ -188,134 +212,156 @@
         return (uint32_t) STSPIN820_GetFwVersion();
     }
 
-    virtual int32_t get_mark(uint8_t deviceId)
+    virtual signed int get_mark(void)
     {
-        return (int32_t) STSPIN820_GetMark((uint8_t) deviceId);
+        return (signed int) STSPIN820_GetMark();
     }
 
-    virtual uint16_t get_max_speed(uint8_t deviceId)
+    virtual unsigned int get_max_speed(void)
     {
-        return (uint16_t) STSPIN820_GetMaxSpeed((uint8_t) deviceId);
+        return (unsigned int) STSPIN820_GetMaxSpeed();
+    }
+
+    virtual unsigned int get_min_speed(void)
+    {
+        return (unsigned int) STSPIN820_GetMinSpeed();
     }
 
-    virtual uint16_t get_min_speed(uint8_t deviceId)
+    virtual signed int get_position(void)
     {
-        return (uint16_t) STSPIN820_GetMinSpeed((uint8_t) deviceId);
+        return (signed int) STSPIN820_GetPosition();
     }
 
-    virtual int32_t get_position(uint8_t deviceId)
+    virtual void go_home(void)
     {
-        return (int32_t) STSPIN820_GetPosition((uint8_t) deviceId);
+        STSPIN820_GoHome();
     }
 
-    virtual void go_home(uint8_t deviceId)
+    virtual void go_mark(void)
     {
-        STSPIN820_GoHome((uint8_t) deviceId);
+        STSPIN820_GoMark();
+    }
+
+    virtual void go_to(signed int position)
+    {
+        STSPIN820_GoTo((signed int) position);
     }
 
-    virtual void go_mark(uint8_t deviceId)
-    {
-        STSPIN820_GoMark((uint8_t) deviceId);
-    }
-
-    virtual void go_to(uint8_t deviceId, int32_t targetPosition)
+    /**
+     * @brief  Stopping the motor through an immediate deceleration up to zero speed.
+     * @param  None.
+     * @retval None.
+     */
+    virtual void soft_stop(void)
     {
-        STSPIN820_GoTo((uint8_t) deviceId, (int32_t) targetPosition);
-    }
-
-    virtual void hard_stop(uint8_t deviceId)
-    {
-        STSPIN820_HardStop((uint8_t) deviceId);
+        STSPIN820_SoftStop();
     }
 
-    virtual void move(uint8_t deviceId, motor_direction_t direction, uint32_t stepCount)
+    /**
+     * @brief  Stopping the motor through an immediate infinite deceleration.
+     * @param  None.
+     * @retval None.
+     */
+    virtual void hard_stop(void)
     {
-        STSPIN820_Move((uint8_t) deviceId, (motor_direction_t) direction, (uint32_t) stepCount);
+        STSPIN820_HardStop();
     }
 
-    virtual void run(uint8_t deviceId, motor_direction_t direction)
-    {
-        STSPIN820_Run((uint8_t) deviceId, (motor_direction_t) direction);
-    }
+    /**
+     * @brief  Disabling the power bridge after performing a deceleration to zero.
+     * @param  None.
+     * @retval None.
+     */
+    virtual void soft_hiz(void) {}
 
-    virtual bool set_acceleration(uint8_t deviceId, uint16_t newAcc)
+    /**
+     * @brief  Disabling the power bridge immediately.
+     * @param  None.
+     * @retval None.
+     */
+    virtual void hard_hiz(void)
     {
-        return (bool) STSPIN820_SetAcceleration((uint8_t) deviceId, (uint16_t) newAcc);
-    }
-
-    virtual bool set_deceleration(uint8_t deviceId, uint16_t newDec)
-    {
-        return (bool) STSPIN820_SetDeceleration((uint8_t) deviceId, (uint16_t) newDec);
+        STSPIN820_HardHiZ();
     }
 
-    virtual void set_home(uint8_t deviceId)
+    virtual void move(direction_t direction, unsigned int steps)
     {
-        STSPIN820_SetHome((uint8_t) deviceId);
+        STSPIN820_Move((motor_direction_t) (direction == StepperMotor::FWD ? FORWARD : BACKWARD), (unsigned int) steps);
     }
 
-    virtual void set_mark(uint8_t deviceId)
+    virtual void run(direction_t direction)
     {
-        STSPIN820_SetMark((uint8_t) deviceId);
+        STSPIN820_Run((motor_direction_t) direction);
+    }
+
+    virtual bool set_acceleration(unsigned int acceleration)
+    {
+        return (bool) STSPIN820_SetAcceleration((unsigned int) acceleration);
     }
 
-    virtual bool set_max_speed(uint8_t deviceId, uint16_t newMaxSpeed)
+    virtual bool set_deceleration(unsigned int deceleration)
     {
-        return (bool) STSPIN820_SetMaxSpeed((uint8_t) deviceId, (uint16_t) newMaxSpeed);
+        return (bool) STSPIN820_SetDeceleration((unsigned int) deceleration);
     }
 
-    virtual bool set_min_speed(uint8_t deviceId, uint16_t newMinSpeed)
+    virtual void set_home(void)
     {
-        return (bool) STSPIN820_SetMinSpeed((uint8_t) deviceId, (uint16_t) newMinSpeed);
+        STSPIN820_SetHome();
     }
 
-    virtual bool soft_stop(uint8_t deviceId)
+    virtual void set_mark(void)
     {
-        return (bool) STSPIN820_SoftStop((uint8_t) deviceId);
+        STSPIN820_SetMark();
     }
 
-    virtual void step_clock_handler(uint8_t deviceId)
+    virtual bool set_max_speed(unsigned int speed)
     {
-        STSPIN820_StepClockHandler((uint8_t) deviceId);
+        return (bool) STSPIN820_SetMaxSpeed((unsigned int) speed);
     }
 
-    virtual void wait_while_active(uint8_t deviceId)
+    virtual bool set_min_speed(unsigned int speed)
     {
-        STSPIN820_WaitWhileActive((uint8_t) deviceId);
+        return (bool) STSPIN820_SetMinSpeed((unsigned int) speed);
     }
 
-    virtual void cmd_disable(uint8_t deviceId)
+    virtual void wait_while_active(void)
     {
-        STSPIN820_Disable((uint8_t) deviceId);
+        STSPIN820_WaitWhileActive();
     }
 
-    virtual void cmd_enable(uint8_t deviceId)
+    virtual void cmd_disable(void)
     {
-        STSPIN820_Enable((uint8_t) deviceId);
+        STSPIN820_Disable();
+    }
+
+    virtual void cmd_enable(void)
+    {
+        STSPIN820_Enable();
     }
 
-    virtual bool select_step_mode(uint8_t deviceId, motor_step_mode_t stepMode)
+    virtual bool set_step_mode(step_mode_t step_mode)
     {
-        return (bool) STSPIN820_SetStepMode((uint8_t) deviceId, (motor_step_mode_t) stepMode);
+        return (bool) STSPIN820_SetStepMode((motor_step_mode_t) step_mode);
     }
 
-    virtual void set_direction(uint8_t deviceId, motor_direction_t direction)
+    virtual void set_direction(direction_t direction)
     {
-        STSPIN820_SetDirection((uint8_t) deviceId, (motor_direction_t) direction);
+        STSPIN820_SetDirection((motor_direction_t) direction);
     }
 
-    virtual void cmd_go_to_dir(uint8_t deviceId, motor_direction_t direction, int32_t targetPosition)
+    virtual void go_to_dir(direction_t direction, int32_t targetPosition)
     {
-        STSPIN820_GoToDir((uint8_t) deviceId, (motor_direction_t) direction, (int32_t) targetPosition);
+        STSPIN820_GoToDir((motor_direction_t) direction, (int32_t) targetPosition);
     }
 
-    virtual uint8_t check_status_hw(void)
+    virtual unsigned int get_status(void)
     {
-        return (uint8_t) STSPIN820_CheckStatusHw();
+        return (unsigned int) STSPIN820_CheckStatusHw();
     }
 
-    virtual void cmd_reset_device(uint8_t deviceId)
+    virtual void cmd_reset_device(void)
     {
-        STSPIN820_PutDeviceInStandby((uint8_t) deviceId);
+        STSPIN820_PutDeviceInStandby();
     }
 
     virtual uint8_t get_nb_devices(void)
@@ -323,89 +369,79 @@
         return (uint8_t) STSPIN820_GetNbDevices();
     }
 
-    virtual void error_handler(uint16_t error)
+    virtual uint32_t get_bridge_input_pwm_freq(void)
     {
-        STSPIN820_ErrorHandler((uint16_t) error);
+        return (uint32_t) STSPIN820_VrefPwmGetFreq();
     }
 
-    virtual uint32_t get_bridge_input_pwm_freq(uint8_t deviceId)
+    virtual void set_bridge_input_pwm_freq(uint32_t newFreq)
     {
-        return (uint32_t) STSPIN820_VrefPwmGetFreq((uint8_t) deviceId);
+        STSPIN820_VrefPwmSetFreq((uint32_t) newFreq);
     }
 
-    virtual void set_bridge_input_pwm_freq(uint8_t deviceId, uint32_t newFreq)
+    virtual void set_stop_mode(motor_stop_mode_t stopMode)
     {
-        STSPIN820_VrefPwmSetFreq((uint8_t) deviceId, (uint32_t) newFreq);
+        STSPIN820_SetStopMode((motor_stop_mode_t) stopMode);
     }
 
-    virtual void set_stop_mode(uint8_t deviceId, motor_stop_mode_t stopMode)
+    virtual motor_stop_mode_t get_stop_mode(void)
     {
-        STSPIN820_SetStopMode((uint8_t) deviceId, (motor_stop_mode_t) stopMode);
-    }
-
-    virtual motor_stop_mode_t get_stop_mode(uint8_t deviceId)
-    {
-        return (motor_stop_mode_t) STSPIN820_GetStopMode((uint8_t) deviceId);
+        return (motor_stop_mode_t) STSPIN820_GetStopMode();
     }
 
-    virtual void set_decay_mode(uint8_t deviceId, motor_decay_mode_t decayMode)
+    virtual void set_decay_mode(motor_decay_mode_t decayMode)
     {
-        STSPIN820_SetDecayMode((uint8_t) deviceId, (motor_decay_mode_t) decayMode);
+        STSPIN820_SetDecayMode((motor_decay_mode_t) decayMode);
     }
 
-    virtual motor_decay_mode_t get_decay_mode(uint8_t deviceId)
+    virtual motor_decay_mode_t get_decay_mode(void)
     {
-        return (motor_decay_mode_t) STSPIN820_GetDecayMode((uint8_t) deviceId);
+        return (motor_decay_mode_t) STSPIN820_GetDecayMode();
     }
 
-    virtual motor_step_mode_t get_step_mode(uint8_t deviceId)
+    virtual motor_step_mode_t get_step_mode(void)
     {
-        return (motor_step_mode_t) STSPIN820_GetStepMode((uint8_t) deviceId);
+        return (motor_step_mode_t) STSPIN820_GetStepMode();
     }
 
-    virtual motor_direction_t get_direction(uint8_t deviceId)
+    virtual direction_t get_direction(void)
     {
-        return (motor_direction_t) STSPIN820_GetDirection((uint8_t) deviceId);
+        return (direction_t) (STSPIN820_GetDirection() == FORWARD ? StepperMotor::FWD : StepperMotor::BWD);
     }
 
-    virtual void exit_device_from_reset(uint8_t deviceId)
+    virtual void exit_device_from_reset(void)
     {
-        STSPIN820_ExitDeviceFromStandby((uint8_t) deviceId);
+        STSPIN820_ExitDeviceFromStandby();
     }
 
-    virtual void set_torque(uint8_t deviceId, motor_torque_mode_t torqueMode, uint8_t torqueValue)
+    virtual void set_torque(motor_torque_mode_t torqueMode, uint8_t torqueValue)
     {
-        STSPIN820_SetTorque((uint8_t) deviceId, (motor_torque_mode_t) torqueMode, (uint8_t) torqueValue);
-    }
-
-    virtual uint8_t get_torque(uint8_t deviceId, motor_torque_mode_t torqueMode)
-    {
-        return (uint8_t) STSPIN820_GetTorque((uint8_t) deviceId, (motor_torque_mode_t) torqueMode);
+        STSPIN820_SetTorque((motor_torque_mode_t) torqueMode, (uint8_t) torqueValue);
     }
 
-    virtual bool set_nb_devices(uint8_t deviceId)
+    virtual uint8_t get_torque(motor_torque_mode_t torqueMode)
     {
-        return (bool) STSPIN820_SetNbDevices((uint8_t) deviceId);
+        return (uint8_t) STSPIN820_GetTorque((motor_torque_mode_t) torqueMode);
     }
 
-    virtual void set_torque_boost_enable(uint8_t deviceId, bool enable)
+    virtual void set_torque_boost_enable(bool enable)
     {
-        STSPIN820_SetTorqueBoostEnable((uint8_t) deviceId, (bool) enable);
+        STSPIN820_SetTorqueBoostEnable((bool) enable);
     }
 
-    virtual bool get_torque_boost_enable(uint8_t deviceId)
+    virtual bool get_torque_boost_enable(void)
     {
-        return (bool) STSPIN820_GetTorqueBoostEnable((uint8_t) deviceId);
+        return (bool) STSPIN820_GetTorqueBoostEnable();
     }
 
-    virtual void set_torque_boost_threshold(uint8_t deviceId, uint16_t speedThreshold)
+    virtual void set_torque_boost_threshold(uint16_t speedThreshold)
     {
-        STSPIN820_SetTorqueBoostThreshold((uint8_t) deviceId, (uint16_t) speedThreshold);
+        STSPIN820_SetTorqueBoostThreshold((uint16_t) speedThreshold);
     }
 
-    virtual uint16_t get_torque_boost_threshold(uint8_t deviceId)
+    virtual uint16_t get_torque_boost_threshold(void)
     {
-        return (uint16_t) STSPIN820_GetTorqueBoostThreshold((uint8_t) deviceId);
+        return (uint16_t) STSPIN820_GetTorqueBoostThreshold();
     }
 
 
@@ -440,6 +476,36 @@
      *     feature_irq.disable_irq();                                         *
      *   }                                                                    *
      *------------------------------------------------------------------------*/
+    /**
+     * @brief  Attaching an interrupt handler to the FLAG interrupt.
+     * @param  fptr An interrupt handler.
+     * @retval None.
+     */
+    void attach_en_fault_irq(void (*fptr)(void))
+    {
+        en_fault_irq.mode(PullUp);
+        en_fault_irq.fall(fptr);
+    }
+    
+    /**
+     * @brief  Enabling the FLAG interrupt handling.
+     * @param  None.
+     * @retval None.
+     */
+    void enable_en_fault_irq(void)
+    {
+        en_fault_irq.enable_irq();
+    }
+    
+    /**
+     * @brief  Disabling the FLAG interrupt handling.
+     * @param  None.
+     * @retval None.
+     */
+    void disable_en_fault_irq(void)
+    {
+        en_fault_irq.disable_irq();
+    }
 
 
 protected:
@@ -461,244 +527,396 @@
      *   status_t COMPONENT_enable_feature(void);  //(2)                      *
      *   status_t COMPONENT_compute_average(void); //(3)                      *
      *------------------------------------------------------------------------*/
-    void STSPIN820_ApplySpeed(uint8_t pwmId, uint16_t newSpeed);
-    void STSPIN820_ApplyTorque(uint8_t deviceId, motor_torque_mode_t torqueMode);
-    void STSPIN820_ComputeSpeedProfile(uint8_t deviceId, uint32_t nbSteps);
+    //Apply speed
+    void STSPIN820_ApplySpeed(uint16_t newSpeed);
+    //Apply torque
+    void STSPIN820_ApplyTorque(motor_torque_mode_t torqueMode);
+    //Compute speed profile
+    void STSPIN820_ComputeSpeedProfile(uint32_t nbSteps);
+    //Handler for the flag interrupt
     void STSPIN820_FlagInterruptHandler(void);
+    //Set device paramenters to other values
     void STSPIN820_SetDeviceParamsOtherValues(void);
+    //Set device paramenters to given values
     void STSPIN820_SetDeviceParamsToGivenValues(STSPIN820_init_t* initDevicePrm);
+    //Set device paramenters to predefined values
     void STSPIN820_SetDeviceParamsToPredefinedValues(void);
-    void STSPIN820_StartMovement(uint8_t deviceId);
-    void STSPIN820_StepClockHandler(uint8_t deviceId);
-    MOTOR_vt_t* STSPIN820_GetMotorHandle(void);                                    //Return handle of the motor driver handle
-    void STSPIN820_Init(void* pInit);                                //Start the STSPIN820 library
-    uint16_t STSPIN820_ReadId(void);                                       //Read Id to get driver instance
-    void STSPIN820_AttachErrorHandler(void (*callback)(uint16_t));   //Attach a user callback to the error handler
-    void STSPIN820_AttachFlagInterrupt(void (*callback)(void));      //Attach a user callback to the flag Interrupt
-    uint8_t STSPIN820_CheckStatusHw(void);                                 //Check if STSPIN820 has a fault by reading EN pin position
-    void STSPIN820_Disable(uint8_t deviceId);                        //Disable the power stage of the specified device
-    void STSPIN820_Enable(uint8_t deviceId);                         //Enable the power stage of the specified device
-    void STSPIN820_ErrorHandler(uint16_t error);                     //Error handler which calls the user callback
-    void STSPIN820_ExitDeviceFromStandby(uint8_t deviceId);          //Exit STSPIN820 device from standby 
-    uint16_t STSPIN820_GetAcceleration(uint8_t deviceId);            //Return the acceleration in pps^2
-    uint16_t STSPIN820_GetCurrentSpeed(uint8_t deviceId);            //Return the current speed in pps
-    motor_decay_mode_t STSPIN820_GetDecayMode(uint8_t deviceId);     //Return the device decay mode
-    uint16_t STSPIN820_GetDeceleration(uint8_t deviceId);            //Return the deceleration in pps^2
-    motor_state_t STSPIN820_GetDeviceState(uint8_t deviceId);        //Return the device state
-    motor_direction_t STSPIN820_GetDirection(uint8_t deviceId);      //Get the motor current direction
-    uint32_t STSPIN820_GetFwVersion(void);                                 //Return the FW version
-    int32_t STSPIN820_GetMark(uint8_t deviceId);                     //Return the mark position 
-    uint16_t STSPIN820_GetMaxSpeed(uint8_t deviceId);                //Return the max speed in pps
-    uint16_t STSPIN820_GetMinSpeed(uint8_t deviceId);                //Return the min speed in pps
-    uint8_t STSPIN820_GetNbDevices(void);                                  //Return the nupber of devices
-    int32_t STSPIN820_GetPosition(uint8_t deviceId);                 //Return the ABS_POSITION (32b signed)
-    motor_step_mode_t STSPIN820_GetStepMode(uint8_t deviceId);       //Get the motor step mode
-    motor_stop_mode_t STSPIN820_GetStopMode(uint8_t deviceId);       //Get the selected mode to stop the motor
-    uint8_t STSPIN820_GetTorque(uint8_t deviceId, motor_torque_mode_t torqueMode);
-    bool STSPIN820_GetTorqueBoostEnable(uint8_t deviceId);           //Get the torque boost feature status
-    uint16_t STSPIN820_GetTorqueBoostThreshold(uint8_t deviceId);    //Get the torque boost threshold
-    void STSPIN820_GoHome(uint8_t deviceId);                         //Move to the home position
-    void STSPIN820_GoMark(uint8_t deviceId);                         //Move to the Mark position
-    void STSPIN820_GoTo(uint8_t deviceId, int32_t targetPosition);   //Go to the specified position
-    void STSPIN820_GoToDir(uint8_t deviceId, motor_direction_t direction, int32_t targetPosition); //Go to the specified position using the specified direction
-    void STSPIN820_HardStop(uint8_t deviceId);                       //Stop the motor and keep holding torque
-    void STSPIN820_HardHiZ(uint8_t deviceId);                        //Stop the motor and disable the power bridge
-    void STSPIN820_Move(uint8_t deviceId, motor_direction_t direction, uint32_t stepCount); //Move the motor of the specified number of steps
-    void STSPIN820_PutDeviceInStandby(uint8_t deviceId);              //Put STSPIN820 device in standby (low power consumption)
-    void STSPIN820_Run(uint8_t deviceId, motor_direction_t direction);       //Run the motor 
-    bool STSPIN820_SetAcceleration(uint8_t deviceId,uint16_t newAcc); //Set the acceleration in pps^2
-    bool STSPIN820_SetDeceleration(uint8_t deviceId,uint16_t newDec); //Set the deceleration in pps^2
-    void STSPIN820_SetDecayMode(uint8_t deviceId, motor_decay_mode_t decay); //Set the STSPIN820 decay mode pin
-    void STSPIN820_SetDirection(uint8_t deviceId, motor_direction_t direction); //Set the STSPIN820 direction pin
-    void STSPIN820_SetHome(uint8_t deviceId);                         //Set current position to be the home position
-    void STSPIN820_SetMark(uint8_t deviceId);                         //Set current position to be the Markposition
-    bool STSPIN820_SetMaxSpeed(uint8_t deviceId,uint16_t newMaxSpeed);//Set the max speed in pps
-    bool STSPIN820_SetMinSpeed(uint8_t deviceId,uint16_t newMinSpeed);//Set the min speed in pps
+    //Start moving
+    void STSPIN820_StartMovement(void);
+    //Handle the step clock
+    void STSPIN820_StepClockHandler(void);
+    //Start the STSPIN820 library
+    status_t STSPIN820_Init(void *init);
+    //Read Id to get driver instance
+    status_t STSPIN820_ReadId(uint8_t *id);
+    //Attach a user callback to the error handler
+    void STSPIN820_AttachErrorHandler(void (*callback)(uint16_t));
+    //Attach a user callback to the flag Interrupt
+    void STSPIN820_AttachFlagInterrupt(void (*callback)(void));
+    //Check if STSPIN820 has a fault by reading EN pin position
+    uint8_t STSPIN820_CheckStatusHw(void);
+    //Disable the power stage of the specified device
+    void STSPIN820_Disable(void);
+    //Enable the power stage of the specified device
+    void STSPIN820_Enable(void);
+    //Error handler which calls the user callback
+    void STSPIN820_ErrorHandler(uint16_t error);
+    //Exit STSPIN820 device from standby 
+    void STSPIN820_ExitDeviceFromStandby(void);
+    //Return the acceleration in pps^2
+    uint16_t STSPIN820_GetAcceleration(void);
+    //Return the current speed in pps
+    uint16_t STSPIN820_GetCurrentSpeed(void);
+    //Return the device decay mode
+    motor_decay_mode_t STSPIN820_GetDecayMode(void);
+    //Return the deceleration in pps^2
+    uint16_t STSPIN820_GetDeceleration(void);
+    //Return the device state
+    motor_state_t STSPIN820_GetDeviceState(void);
+    //Get the motor current direction
+    motor_direction_t STSPIN820_GetDirection(void);
+    //Return the FW version
+    uint32_t STSPIN820_GetFwVersion(void);
+    //Return the mark position 
+    int32_t STSPIN820_GetMark(void);
+    //Return the max speed in pps
+    uint16_t STSPIN820_GetMaxSpeed(void);
+    //Return the min speed in pps
+    uint16_t STSPIN820_GetMinSpeed(void);
+    //Return the nupber of devices
+    uint8_t STSPIN820_GetNbDevices(void);
+    //Return the ABS_POSITION (32b signed)
+    int32_t STSPIN820_GetPosition(void);
+    //Get the motor step mode
+    motor_step_mode_t STSPIN820_GetStepMode(void);
+    //Get the selected mode to stop the motor
+    motor_stop_mode_t STSPIN820_GetStopMode(void);
+    //Get the torque
+    uint8_t STSPIN820_GetTorque(motor_torque_mode_t torqueMode);
+    //Get the torque boost feature status
+    bool STSPIN820_GetTorqueBoostEnable(void);
+    //Get the torque boost threshold
+    uint16_t STSPIN820_GetTorqueBoostThreshold(void);
+    //Move to the home position
+    void STSPIN820_GoHome(void);
+    //Move to the Mark position
+    void STSPIN820_GoMark(void);
+    //Go to the specified position
+    void STSPIN820_GoTo(int32_t targetPosition);
+    //Go to the specified position using the specified direction
+    void STSPIN820_GoToDir(motor_direction_t direction, int32_t targetPosition);
+    //Stop the motor and keep holding torque
+    void STSPIN820_HardStop(void);
+    //Stop the motor and disable the power bridge
+    void STSPIN820_HardHiZ(void);
+    //Move the motor of the specified number of steps
+    void STSPIN820_Move(motor_direction_t direction, uint32_t stepCount);
+    //Put STSPIN820 device in standby (low power consumption)
+    void STSPIN820_PutDeviceInStandby(void);
+    //Run the motor 
+    void STSPIN820_Run(motor_direction_t direction);
+    //Set the acceleration in pps^2
+    bool STSPIN820_SetAcceleration(uint16_t newAcc);
+    //Set the deceleration in pps^2
+    bool STSPIN820_SetDeceleration(uint16_t newDec);
+    //Set the STSPIN820 decay mode pin
+    void STSPIN820_SetDecayMode(motor_decay_mode_t decay);
+    //Set the STSPIN820 direction pin
+    void STSPIN820_SetDirection(motor_direction_t direction);
+    //Set current position to be the home position
+    void STSPIN820_SetHome(void);
+    //Set current position to be the mark position
+    void STSPIN820_SetMark(void);
+    //Set the max speed in pps
+    bool STSPIN820_SetMaxSpeed(uint16_t newMaxSpeed);
+    //Set the min speed in pps
+    bool STSPIN820_SetMinSpeed(uint16_t newMinSpeed);
+    //Set the number of devices
     bool STSPIN820_SetNbDevices(uint8_t nbDevices);
-    bool STSPIN820_SetStepMode(uint8_t deviceId, motor_step_mode_t stepMode); // Step mode selection
-    void STSPIN820_SetStopMode(uint8_t deviceId, motor_stop_mode_t stopMode); //Select the mode to stop the motor
-    void STSPIN820_SetTorque(uint8_t deviceId, motor_torque_mode_t torqueMode, uint8_t torqueValue);
-    void STSPIN820_SetTorqueBoostEnable(uint8_t deviceId, bool enable); // Enable or disable the torque boost feature
-    void STSPIN820_SetTorqueBoostThreshold(uint8_t deviceId, uint16_t speedThreshold); //Set the torque boost threshold
-    bool STSPIN820_SoftStop(uint8_t deviceId);                        //Progressively stop the motor by using the device deceleration and set deceleration torque
-    uint32_t STSPIN820_VrefPwmGetFreq(uint8_t deviceId);              //Get the frequency of REF PWM of the specified device
-    void STSPIN820_VrefPwmSetFreq(uint8_t deviceId, uint32_t newFreq);//Set the frequency of REF PWM of the specified device
-    void STSPIN820_WaitWhileActive(uint8_t deviceId);                 //Wait for the device state becomes Inactive
-
-
-    /*** Component's I/O Methods ***/
+    //Step mode selection
+    bool STSPIN820_SetStepMode(motor_step_mode_t stepMode);
+    //Select the mode to stop the motor
+    void STSPIN820_SetStopMode(motor_stop_mode_t stopMode);
+    //Set the torque
+    void STSPIN820_SetTorque(motor_torque_mode_t torqueMode, uint8_t torqueValue);
+    //Enable or disable the torque boost feature
+    void STSPIN820_SetTorqueBoostEnable(bool enable);
+    //Set the torque boost threshold
+    void STSPIN820_SetTorqueBoostThreshold(uint16_t speedThreshold);
+    //Progressively stop the motor by using the device deceleration and set deceleration torque
+    bool STSPIN820_SoftStop(void);
+    //Get the frequency of REF PWM of the specified device
+    uint32_t STSPIN820_VrefPwmGetFreq(void);
+    //Set the frequency of REF PWM of the specified device
+    void STSPIN820_VrefPwmSetFreq(uint32_t newFreq);
+    //Wait for the device state becomes Inactive
+    void STSPIN820_WaitWhileActive(void);
 
-    /**
-     * @brief      Utility function to read data from STSPIN820.
-     * @param[out] pBuffer pointer to the buffer to read data into.
-     * @param[in]  NumBytesToRead number of bytes to read.
-     * @retval     COMPONENT_OK in case of success, COMPONENT_ERROR otherwise.
-     */
-    status_t read(uint8_t* pBuffer, uint16_t NumBytesToRead)
-    {
-        if (dev_spi.spi_read(pBuffer, ssel, NumBytesToRead) != 0)
-            return COMPONENT_ERROR;
-        return COMPONENT_OK;
-    }
-    
-    /**
-     * @brief      Utility function to write data to STSPIN820.
-     * @param[in]  pBuffer pointer to the buffer of data to send.
-     * @param[in]  NumBytesToWrite number of bytes to write.
-     * @retval     COMPONENT_OK in case of success, COMPONENT_ERROR otherwise.
-     */
-    status_t write(uint8_t* pBuffer, uint16_t NumBytesToWrite)
-    {
-        if (dev_spi.spi_write(pBuffer, ssel, NumBytesToWrite) != 0)
-            return COMPONENT_ERROR;
-        return COMPONENT_OK;
-    }
-
-    /**
-     * @brief      Utility function to read and write data from/to STSPIN820 at the same time.
-     * @param[out] pBufferToRead pointer to the buffer to read data into.
-     * @param[in]  pBufferToWrite pointer to the buffer of data to send.
-     * @param[in]  NumBytes number of bytes to read and write.
-     * @retval     COMPONENT_OK in case of success, COMPONENT_ERROR otherwise.
-     */
-    status_t read_write(uint8_t* pBufferToRead, uint8_t* pBufferToWrite, uint16_t NumBytes)
-    {
-        if (dev_spi.spi_read_write(pBufferToRead, pBufferToWrite, ssel, NumBytes) != 0)
-            return COMPONENT_ERROR;
-        return COMPONENT_OK;
-    }
 
     /* ACTION 8 --------------------------------------------------------------*
      * Implement here other I/O methods beyond those already implemented      *
      * above, which are declared extern within the component's header file.   *
      *------------------------------------------------------------------------*/
-    void STSPIN820_Board_Delay(uint32_t delay)
+    /**
+     * @brief  Making the CPU wait.
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_Delay(uint32_t delay)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        wait_ms(delay);
     }
 
-    void STSPIN820_Board_Disable(void)
+    /**
+     * @brief  Enabling the power bridges (leaving the output bridges at HiZ).
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_Enable_Power_Bridges(void)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        if (en_fault_irq.read() == 0)
+        {
+            //en_fault_irq.write(1);
+            wait_ms(BRIDGE_TURN_ON_DELAY_ms);
+            enable_en_fault_irq();
+        }
     }
 
-    void STSPIN820_Board_DisableIrq(void)
+    /**
+     * @brief  Disabling the power bridges (forcing the output bridges at HiZ).
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_Disable_Power_Bridges(void)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        disable_en_fault_irq();
+        //en_fault_irq.write(0);
     }
 
-    uint32_t STSPIN820_Board_EN_AND_FAULT_PIN_GetState(void)
+    /**
+     * @brief  Enabling interrupts.
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_EnableIrq(void)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
-        return (uint32_t) 0;
+        __enable_irq();
     }
 
-    void STSPIN820_Board_Enable(void)
+    /**
+     * @brief  Disabling interrupts.
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_DisableIrq(void)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        __disable_irq();
     }
 
-    void STSPIN820_Board_EnableIrq(void)
+    /**
+     * @brief  Getting the state of the EN_FAULT pin.
+     * @param  None.
+     * @retval None.
+     */
+    uint32_t STSPIN820_EN_FAULT_PIN_GetState(void)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        return (uint32_t) en_fault_irq;
     }
 
-    void STSPIN820_Board_GpioInit(void)
+    /**
+     * @brief  Initialising the GPIOs.
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_GpioInit(void)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
-    }
-
-    void STSPIN820_Board_PwmRefInit(void)
-    {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        disable_en_fault_irq();
+        enable_en_fault_irq();
+        STSPIN820_Reset();
     }
 
-    void STSPIN820_Board_PwmRefSetFreqAndDutyCycle(uint32_t newFreq, uint8_t dutyCycle)
+    /**
+     * @brief  Initialising the PWM.
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_PwmRefInit(void) {}
+
+    /**
+     * @brief  Setting the frequency and the duty-cycle of PWM.
+     *         The frequency controls directly the speed of the device.
+     *         The duty-cycle controls the torque of the device.
+     * @param  frequency  The frequency of PWM in Hz.
+     * @param  duty_cycle The duty-cycle of PWM in [0..100]%.
+     * @retval None.
+     */
+    void STSPIN820_PwmRefSetFreqAndDutyCycle(uint32_t frequency, uint8_t duty_cycle)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        pwm_period = (double) (1.0f / frequency);
+        pwm_duty_cycle = (double) duty_cycle;
     }
 
-    void STSPIN820_Board_PwmRefStart(void)
+    /**
+     * @brief  Starting the PWM.
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_PwmRefStart(void)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        /* Setting the period and the duty-cycle of PWM. */
+        ref_pwm.period(pwm_period);
+        ref_pwm.write(pwm_duty_cycle);
+
+        /* Setting a callback with the same period of PWM's, to update the state machine. */
+        ticker.attach(Callback<void()>(this, &STSPIN820::STSPIN820_StepClockHandler), pwm_period);
     }
 
-    void STSPIN820_Board_PwmRefStop(void)
+    /**
+     * @brief  Stopping the PWM.
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_PwmRefStop(void)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
-    }
-
-    void STSPIN820_Board_ReleaseReset(void)
-    {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        ref_pwm.write(0.0f);
+        ticker.detach();
     }
 
-    void STSPIN820_Board_Reset(void)
+    /**
+     * @brief  Putting the device in standby mode.
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_ReleaseReset(void)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        standby_reset = 1;
     }
 
-    void STSPIN820_Board_SetDecayGpio(uint8_t gpioState)
+    /**
+     * @brief  Putting the device in reset mode.
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_Reset(void)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        standby_reset = 0;
     }
 
-    uint8_t STSPIN820_Board_GetDecayGpio(void)
+    /**
+     * @brief  Setting the decay mode pin state.
+     * @param  gpio_state State of the decay mode pin ("0" to reset, "1" to set).
+     * @retval None.
+     */
+    void STSPIN820_SetDecayGpio(uint8_t gpio_state)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
-        return (uint8_t) 0;
+        decay = gpio_state;
     }
 
-    void STSPIN820_Board_SetDirectionGpio(uint8_t gpioState)
+    /**
+     * @brief  Getting the decay mode pin state.
+     * @param  None.
+     * @retval None.
+     */
+    uint8_t STSPIN820_GetDecayGpio(void)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        return (decay != 0 ? 1 : 0);
     }
 
-    void STSPIN820_Board_SetFullStep(void)
+    /**
+     * @brief  Setting the direction pin state.
+     * @param  gpio_state State of the direction pin ("0" to reset, "1" to set).
+     * @retval None.
+     */
+    void STSPIN820_SetDirectionGpio(uint8_t gpio_state)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        direction = gpio_state;
     }
 
-    bool STSPIN820_Board_SetModePins(uint8_t modePin1Level, uint8_t modePin2Level, uint8_t modePin3Level)
+    /**
+     * @brief  Setting the full step mode.
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_SetFullStep(void)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
-        return (bool) 0;
+        mode1 = mode2 = mode3 = 0;
     }
 
-    void STSPIN820_Board_TimStckCompareInit(void)
-    {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
-    }
-
-    void STSPIN820_Board_TimStckDeInit(void)
+    /**
+     * @brief  Selecting the STSPIN820 mode1, mode2 and mode3 pins levels.
+     * @param  mode1_level Level of the mode1 gpio (0 low, 1+ high).
+     * @param  mode2_level Level of the mode2 gpio (0 low, 1+ high).
+     * @param  mode3_level Level of the mode3 gpio (0 low, 1+ high).
+     * @retval None.
+     */
+    void STSPIN820_SetModePins(uint8_t mode1_level, uint8_t mode2_level, uint8_t mode3_level)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
-    }
-
-    void STSPIN820_Board_TimStckInit(void)
-    {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        mode1 = (mode1_level != 0 ? 1 : 0);
+        mode2 = (mode2_level != 0 ? 1 : 0);
+        mode3 = (mode3_level != 0 ? 1 : 0);
     }
 
-    void STSPIN820_Board_TimStckSetFreq(uint16_t newFreq)
+    /**
+     * @brief  Initializing step clock compare value.
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_TimStckCompareInit(void) {}
+
+    /**
+     * @brief  Deinitializing the timer used for the step clock.
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_TimStckDeInit(void) {}
+
+    /**
+     * @brief  Initializing the timer used for the step clock.
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_TimStckInit(void) {}
+
+    /**
+     * @brief  Setting the frequency of PWM.
+     *         The frequency controls directly the speed of the device.
+     * @param  frequency  The frequency of PWM in Hz.
+     * @retval None.
+     */
+    void STSPIN820_TimStckSetFreq(uint32_t frequency)
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
-    }
-
-    void STSPIN820_Board_TimStckStart(void)
-    {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        pwm_period = (double) (1.0f / frequency);
     }
 
-    uint8_t STSPIN820_Board_TimStckStop(uint8_t *pToggleOdd)
+    /**
+     * @brief  Starting the step clock.
+     * @param  None.
+     * @retval None.
+     */
+    void STSPIN820_TimStckStart(void) {}
+
+    /**
+     * @brief  Stopping the step clock.
+     * @param  p_toggle_odd Pointer to the volatile toggleOdd variable.
+     * @retval "1" if OK, "0" if the STCK pin is High (forbidden configuration).
+     */
+    uint8_t STSPIN820_TimStckStop(volatile uint8_t *p_toggle_odd )
     {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
-        return (uint8_t) 0;
-    }
-
-    void STSPIN820_Board_UnsetFullStep(void)
-    {
-        /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs. */
+        __disable_irq();
+        if (*p_toggle_odd == 1)
+        {
+            __enable_irq();
+            return 1;
+        }
+        if (step_clock != 0)
+        {
+            __enable_irq();
+            return 0;
+        }
+        //HAL_TIM_OC_Stop_IT(&hTimerStepClock, BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK);
+        __enable_irq();
+        STSPIN820_TimStckDeInit();
+        return 1;
     }
 
 
@@ -713,6 +931,8 @@
      *   + mbed:                                                              *
      *     InterruptIn feature_irq;                                           *
      *------------------------------------------------------------------------*/
+    /* En Fault Interrupt. */
+    InterruptIn en_fault_irq;
 
     /* ACTION 10 -------------------------------------------------------------*
      * Declare here other pin related variables, if needed.                   *
@@ -721,6 +941,32 @@
      *   + mbed:                                                              *
      *     DigitalOut standby_reset;                                          *
      *------------------------------------------------------------------------*/
+    /* Standby/reset pin. */
+    DigitalOut standby_reset;
+
+    /* Direction of rotation pin. */
+    DigitalOut direction;
+
+    /* Pulse Width Modulation pin. */
+    PwmOut ref_pwm;
+
+    /* Decay pin. */
+    DigitalOut decay;
+    
+    /* Step clock pin. */
+    DigitalOut step_clock;
+    
+    /* Mode1 pin. */
+    DigitalOut mode1;
+    
+    /* Mode2 pin. */
+    DigitalOut mode2;
+    
+    /* Mode3 pin. */
+    DigitalOut mode3;
+
+    /* Timer to trigger the PWM callback at each PWM pulse. */
+    Ticker ticker;
 
     /* ACTION 11 -------------------------------------------------------------*
      * Declare here communication related variables, if needed.               *
@@ -730,11 +976,6 @@
      *     DigitalOut ssel;                                                   *
      *     DevSPI &dev_spi;                                                   *
      *------------------------------------------------------------------------*/
-    /* Configuration. */
-    DigitalOut ssel;
-
-    /* IO Device. */
-    DevSPI &dev_spi;
 
     /* ACTION 12 -------------------------------------------------------------*
      * Declare here identity related variables, if needed.                    *
@@ -753,12 +994,17 @@
      *   int instance_id;                                                     *
      *   static int number_of_instances;                                      *
      *------------------------------------------------------------------------*/
+    /* Data. */
     void (*flag_interrupt_callback)(void);
     void (*error_handler_callback)(uint16_t error);
-    uint8_t toggle_odd;
+    volatile uint8_t toggle_odd;
     device_params_t device_prm;
-    uint8_t number_of_devices;
+    double pwm_period;
+    double pwm_duty_cycle;
     uint8_t device_instance;
+    
+    /* Static data. */
+    static uint8_t number_of_devices;
 };
 
 #endif /* __STSPIN820_CLASS_H */
--- a/Components/STSPIN820/STSPIN820_config.h	Fri Apr 27 17:02:08 2018 +0000
+++ b/Components/STSPIN820/STSPIN820_config.h	Thu Sep 27 14:05:44 2018 +0000
@@ -1,40 +1,41 @@
-/**************************************************************************//**
-  * @file    STSPIN820_config.h
-  * @author  STM
-  * @version V1.0.1
-  * @date    August 7th, 2017
-  * @brief   Predefines values for the STSPIN820 registers
-  * and for the devices parameters
-  * @note    (C) COPYRIGHT 2017 STMicroelectronics
-  ******************************************************************************
-  * @attention
-  *
-  * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
-  *
-  * Redistribution and use in source and binary forms, with or without modification,
-  * are permitted provided that the following conditions are met:
-  *   1. Redistributions of source code must retain the above copyright notice,
-  *      this list of conditions and the following disclaimer.
-  *   2. Redistributions in binary form must reproduce the above copyright notice,
-  *      this list of conditions and the following disclaimer in the documentation
-  *      and/or other materials provided with the distribution.
-  *   3. Neither the name of STMicroelectronics nor the names of its contributors
-  *      may be used to endorse or promote products derived from this software
-  *      without specific prior written permission.
-  *
-  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-  *
-  ******************************************************************************
-  */
+/**
+ *******************************************************************************
+ * @file    STSPIN820_config.h
+ * @author  STM
+ * @version V1.0.1
+ * @date    August 7th, 2017
+ * @brief   Predefines values for the STSPIN820 registers and for the devices
+ *          parameters.
+ * @note    (C) COPYRIGHT 2017 STMicroelectronics
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *   1. Redistributions of source code must retain the above copyright notice,
+ *      this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright notice,
+ *      this list of conditions and the following disclaimer in the documentation
+ *      and/or other materials provided with the distribution.
+ *   3. Neither the name of STMicroelectronics nor the names of its contributors
+ *      may be used to endorse or promote products derived from this software
+ *      without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *******************************************************************************
+ */
 
 
 /* Define to prevent recursive inclusion -------------------------------------*/
@@ -110,6 +111,9 @@
 /// REF PWM frequency (Hz)
 #define STSPIN820_CONF_PARAM_REF_PWM_FREQUENCY                 (100000)
 
+/// MCU wait time after power bridges are enabled (ms)
+#define BRIDGE_TURN_ON_DELAY_ms                                (10)
+
 /**
   * @}
   */
--- a/Components/STSPIN820/STSPIN820_def.h	Fri Apr 27 17:02:08 2018 +0000
+++ b/Components/STSPIN820/STSPIN820_def.h	Thu Sep 27 14:05:44 2018 +0000
@@ -1,39 +1,41 @@
-/******************************************************//**
-  * @file    STSPIN820_def.h 
-  * @author  STM
-  * @version V1.0.0
-  * @date    August 7th, 2017
-  * @brief   Header for STSPIN820 driver (fully integrated microstepping motor driver)
-  * @note    (C) COPYRIGHT 2017 STMicroelectronics
-  ******************************************************************************
-  * @attention
-  *
-  * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
-  *
-  * Redistribution and use in source and binary forms, with or without modification,
-  * are permitted provided that the following conditions are met:
-  *   1. Redistributions of source code must retain the above copyright notice,
-  *      this list of conditions and the following disclaimer.
-  *   2. Redistributions in binary form must reproduce the above copyright notice,
-  *      this list of conditions and the following disclaimer in the documentation
-  *      and/or other materials provided with the distribution.
-  *   3. Neither the name of STMicroelectronics nor the names of its contributors
-  *      may be used to endorse or promote products derived from this software
-  *      without specific prior written permission.
-  *
-  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-  *
-  ******************************************************************************
-  */
+/**
+ *******************************************************************************
+ * @file    STSPIN820_def.h 
+ * @author  STM
+ * @version V1.0.0
+ * @date    August 7th, 2017
+ * @brief   Header for STSPIN820 driver (fully integrated microstepping motor
+ *          driver).
+ * @note    (C) COPYRIGHT 2017 STMicroelectronics
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *   1. Redistributions of source code must retain the above copyright notice,
+ *      this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright notice,
+ *      this list of conditions and the following disclaimer in the documentation
+ *      and/or other materials provided with the distribution.
+ *   3. Neither the name of STMicroelectronics nor the names of its contributors
+ *      may be used to endorse or promote products derived from this software
+ *      without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *******************************************************************************
+ */
 
 
 /* Define to prevent recursive inclusion -------------------------------------*/
@@ -235,7 +237,6 @@
     motor_step_mode_t stepModeLatched;
     /// current stop mode
     motor_stop_mode_t stopMode;
-    
 } device_params_t; 
 
 /* ACTION --------------------------------------------------------------------*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Components/STSPIN820/platform_dependent.c	Thu Sep 27 14:05:44 2018 +0000
@@ -0,0 +1,708 @@
+/**
+  ******************************************************************************
+  * @file    stm32f0xx_nucleo_ihm14a1.c
+  * @author  STM
+  * @version V1.1.0
+  * @date    April 10th, 2018
+  * @brief   BSP driver for x-nucleo-ihm14a1 Nucleo extension board 
+  *  (based on STSPIN820)
+  ******************************************************************************
+* @attention
+  *
+  * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+  *
+  * Redistribution and use in source and binary forms, with or without modification,
+  * are permitted provided that the following conditions are met:
+  *   1. Redistributions of source code must retain the above copyright notice,
+  *      this list of conditions and the following disclaimer.
+  *   2. Redistributions in binary form must reproduce the above copyright notice,
+  *      this list of conditions and the following disclaimer in the documentation
+  *      and/or other materials provided with the distribution.
+  *   3. Neither the name of STMicroelectronics nor the names of its contributors
+  *      may be used to endorse or promote products derived from this software
+  *      without specific prior written permission.
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */ 
+  
+/* Includes ------------------------------------------------------------------*/
+#if 0
+
+/** @addtogroup BSP
+  * @{
+  */ 
+
+/** @defgroup STM32F0XX_NUCLEO_IHM14A1 STM32F0XX NUCLEO IHM14A1
+  * @{
+  */   
+    
+/* Private constants ---------------------------------------------------------*/    
+
+/** @defgroup IHM14A1_Private_Constants IHM14A1 Private Constants
+  * @{
+  */
+
+/// Timer Prescaler for step clocks
+#define TIMER_PRESCALER         (32)
+    
+/// MCU wait time after power bridges are enabled
+#define BRIDGE_TURN_ON_DELAY    (10)
+
+/// RC Filtering delay on the PWM
+#define PWM_FILTER_TIME_CONSTANT                                 (5)
+
+/**
+  * @}
+  */ 
+
+/* Private variables ---------------------------------------------------------*/
+
+/** @defgroup IHM14A1_Board_Private_Variables IHM14A1 Board Private Variables
+  * @{
+  */
+/// Timer handler for step clock
+TIM_HandleTypeDef hTimerStepClock;
+
+/// Step clock compare value
+volatile uint32_t ccrValue;
+
+/// Timer handler for REF
+TIM_HandleTypeDef hTimerPwm;
+
+/**
+  * @}
+  */ 
+
+/** @defgroup IHM14A1_Board_Private_Function_Prototypes IHM14A1 Board Private Function Prototypes
+  * @{
+  */   
+//Delay of the requested number of milliseconds   
+void Stspin820_Board_Delay(uint32_t delay);
+//Disable Irq
+void Stspin820_Board_DisableIrq(void);
+//Enable Irq
+void Stspin820_Board_EnableIrq(void);
+//Read the status of the Pin DECAY
+uint8_t Stspin820_Board_GetDecayGpio(void);
+//Initialise GPIOs used for STSPIN820
+void Stspin820_Board_GpioInit(void);
+//Start step clock
+void Stspin820_Board_TimStckStart(void);
+//Set step clock frequency and start it
+void Stspin820_Board_TimStckSetFreq(uint16_t newFreq);
+//Sets the frequency and duty cycle of PWM used for the reference voltage 
+//generation
+void Stspin820_Board_PwmRefSetFreqAndDutyCycle(uint32_t newFreq,uint8_t dutyCycle);
+//Init the timer
+void Stspin820_Board_TimStckInit(void);
+//DeInit the timer
+void Stspin820_Board_TimStckDeInit(void);
+//Stop the timer
+uint8_t Stspin820_Board_TimStckStop(volatile uint8_t *pToggleOdd);
+//Init the reference voltage pwm
+void Stspin820_Board_PwmRefInit(void);
+//Start the reference voltage pwm
+void Stspin820_Board_PwmRefStart(void);
+//Stop the reference voltage pwm
+void Stspin820_Board_PwmRefStop(void);
+//Set the STSPIN820 STBY RESET pin and leave low consumption mode
+void Stspin820_Board_ReleaseReset(void);
+//Reset the STSPIN820 STBY RESET pin and force low consumption mode
+void Stspin820_Board_Reset(void);
+//Set the state of the direction GPIO
+void Stspin820_Board_SetDirectionGpio(uint8_t gpioState);
+//Set the state of the decay GPIO
+void Stspin820_Board_SetDecayGpio(uint8_t gpioState);
+//Enable the power bridges (leave the output bridges HiZ)
+void Stspin820_Board_Enable(void);
+//Disable the power bridges (force the output bridges HiZ)
+void Stspin820_Board_Disable(void);
+//Get the EN FAULT pin state
+uint32_t Stspin820_Board_EN_AND_FAULT_PIN_GetState(void);
+//Select the STSPIN820 mode1, mode2 and mode3 pins levels
+uint8_t Stspin820_Board_SetModePins(uint8_t modePin1Level,\
+  uint8_t modePin2Level,\
+  uint8_t modePin3Level);
+//Select Full Step mode
+void Stspin820_Board_SetFullStep(void);
+//Step clock compare value initialization
+void Stspin820_Board_TimStckCompareInit(void);
+/**
+  * @}
+  */
+
+/** @defgroup IHM14A1_Board_Private_Functions IHM14A1 Board Private Functions
+  * @{
+  */   
+
+/******************************************************//**
+ * @brief This function provides an accurate delay in milliseconds
+ * @param[in] delay  time length in milliseconds
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_Delay(uint32_t delay)
+{
+  HAL_Delay(delay);
+}
+
+/******************************************************//**
+ * @brief This function disable the interruptions
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_DisableIrq(void)
+{
+  __disable_irq();
+}
+
+/******************************************************//**
+ * @brief This function enable the interruptions
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_EnableIrq(void)
+{
+  __enable_irq();
+}
+
+/******************************************************//**
+ * @brief  Read the digital level of GPIO decay pin
+ * @retval Value of the decay pin
+ **********************************************************/
+uint8_t Stspin820_Board_GetDecayGpio(void)
+{
+    uint8_t statusPin;
+    
+    if(HAL_GPIO_ReadPin(BSP_MOTOR_CONTROL_BOARD_PORT_DECAY,\
+      BSP_MOTOR_CONTROL_BOARD_PIN_DECAY) != GPIO_PIN_RESET)
+    {
+      statusPin = 1;
+    }
+    else
+    {
+      statusPin = 0;
+    }
+    
+    return statusPin;
+    
+}
+
+/******************************************************//**
+ * @brief  Initiliases the GPIOs used by the STSPIN820
+ * @retval None
+  **********************************************************/
+void Stspin820_Board_GpioInit(void)
+{
+   GPIO_InitTypeDef GPIO_InitStruct;
+  
+  /* GPIO Ports Clock Enable */
+  __HAL_RCC_GPIOA_CLK_ENABLE();
+  __HAL_RCC_GPIOB_CLK_ENABLE();
+  __HAL_RCC_GPIOC_CLK_ENABLE();  
+
+  /* Configure STSPIN820 - EN pin --------------------------------------------*/
+  /* When this pin is set low, it is configured just before as                */
+  /* GPIO_MODE_OUTPUT_PP with GPIO_NOPULL                                     */
+  /* When this pin is set high, it is just after configured for FAULT         */
+  /* as GPIO_MODE_IT_FALLING with GPIO_PULLUP                                 */
+  Stspin820_Board_Disable();
+  
+  /* Set Priority of External Line Interrupt used for the FAULT interrupt*/ 
+  HAL_NVIC_SetPriority(BSP_MOTOR_CONTROL_BOARD_IRQn_EN_AND_FAULT,\
+    BSP_MOTOR_CONTROL_BOARD_PRIORITY_EN_AND_FAULT,\
+    0);
+    
+  /* Enable the External Line Interrupt used for the FAULT interrupt*/
+  HAL_NVIC_EnableIRQ(BSP_MOTOR_CONTROL_BOARD_IRQn_EN_AND_FAULT);  
+
+  /* Configure STSPIN820 - MODE1 pin -----------------------------------------*/
+  GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_PIN_MODE1;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
+  HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_PORT_MODE1, &GPIO_InitStruct);
+
+  /* Configure STSPIN820 - MODE2 pin -----------------------------------------*/
+  GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_PIN_MODE2;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
+  HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_PORT_MODE2, &GPIO_InitStruct);
+
+  /* Configure STSPIN820 - MODE3 pin -----------------------------------------*/
+  GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_PIN_MODE3;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
+  HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_PORT_MODE3, &GPIO_InitStruct);
+  
+  /* Configure STSPIN820 - DIR pin -------------------------------------------*/
+  GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_PIN_DIR;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
+  HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_PORT_DIR, &GPIO_InitStruct);
+  
+  /* Configure STSPIN820 - DECAY pin -------------------------------------------*/
+  GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_PIN_DECAY;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
+  HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_PORT_DECAY, &GPIO_InitStruct);
+  
+  /* Configure STSPIN820 - STBY/RESET pin ------------------------------------*/
+  GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_PIN_STBY_RESET;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
+  HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_PORT_STBY_RESET, &GPIO_InitStruct);
+  
+  Stspin820_Board_Reset();
+
+}
+
+/******************************************************//**
+ * @brief  Starts the step clock
+ * @retval None
+ * @note The frequency is directly the current speed of the device
+ **********************************************************/
+void Stspin820_Board_TimStckStart()
+{
+  /* Clear pending timer interrupt */
+  if (BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK == TIM_CHANNEL_1)
+  {
+    __HAL_TIM_CLEAR_IT(&hTimerStepClock, TIM_IT_CC1);
+  }
+  else if (BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK == TIM_CHANNEL_2)
+  {
+    __HAL_TIM_CLEAR_IT(&hTimerStepClock, TIM_IT_CC2);
+  }
+  else if (BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK == TIM_CHANNEL_3)
+  {
+    __HAL_TIM_CLEAR_IT(&hTimerStepClock, TIM_IT_CC3);
+  }
+  else if (BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK == TIM_CHANNEL_4)
+  {
+    __HAL_TIM_CLEAR_IT(&hTimerStepClock, TIM_IT_CC4);
+  }
+  /* Start timer interrupts */
+#if (BSP_MOTOR_CONTROL_BOARD_OUTPUT_TIM_STCK == TIMER_MAIN_OUTPUT)
+    if (hTimerStepClock.Instance->CCER == 0)
+    {
+      hTimerStepClock.Instance->CCER |=\
+      (TIM_OCPOLARITY_LOW<<BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK);
+    }
+    else
+    {
+      hTimerStepClock.Instance->CCER = 0;
+    }
+  HAL_TIM_OC_Start_IT(&hTimerStepClock,\
+      BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK);
+#endif /* (BSP_MOTOR_CONTROL_BOARD_OUTPUT_TIM_STCK == TIMER_MAIN_OUTPUT) */
+
+#if (BSP_MOTOR_CONTROL_BOARD_OUTPUT_TIM_STCK == TIMER_COMPLEMENTARY_OUTPUT)
+      if (hTimerStepClock.Instance->CCER == 0)
+      {
+        hTimerStepClock.Instance->CCER |=\
+      (TIM_OCNPOLARITY_LOW<<BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK);
+      }
+      else
+      {
+        hTimerStepClock.Instance->CCER = 0;
+      }
+  HAL_TIMEx_OCN_Start_IT(&hTimerStepClock,\
+    BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK);
+#endif /* (BSP_MOTOR_CONTROL_BOARD_OUTPUT_TIM_STCK == TIMER_COMPLEMENTARY_OUTPUT) */
+
+#if (BSP_MOTOR_CONTROL_BOARD_OUTPUT_TIM_STCK == TIMER_NO_OUTPUT)
+  HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_TIM_STCK,\
+    BSP_MOTOR_CONTROL_BOARD_PIN_TIM_STCK,\
+        GPIO_PIN_RESET);
+    HAL_TIM_OC_Start_IT(&hTimerStepClock,\
+      BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK);
+#endif /* (BSP_MOTOR_CONTROL_BOARD_OUTPUT_TIM_STCK == TIMER_NO_OUTPUT) */
+}
+
+/******************************************************//**
+ * @brief Step clock compare value initialization
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_TimStckCompareInit(void)
+{
+  ccrValue = hTimerStepClock.Instance->CNT;
+}
+
+/******************************************************//**
+ * @brief  Sets the frequency of step clock
+ * @param[in] newFreq in Hz
+ * @retval None
+ * @note The frequency is directly the current speed of the device
+ **********************************************************/
+void Stspin820_Board_TimStckSetFreq(uint16_t newFreq)
+{
+  ccrValue += (HAL_RCC_GetSysClockFreq()/\
+                           (TIMER_PRESCALER * 2 * (uint32_t)newFreq));
+  __HAL_TIM_SET_COMPARE(&hTimerStepClock,\
+    BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK,\
+    ccrValue);
+}
+
+/******************************************************//**
+ * @brief  Starts the PWM used for the reference voltage generation
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_PwmRefStart(void)
+{
+  HAL_TIM_PWM_Start_IT(&hTimerPwm, BSP_MOTOR_CONTROL_BOARD_CHAN_PWM_REF);
+  HAL_Delay(5*PWM_FILTER_TIME_CONSTANT);
+}
+                                                  
+/******************************************************//**
+ * @brief  Sets the frequency and duty cycle of PWM used for the reference
+ * voltage generation
+ * @param[in] newFreq in Hz
+ * @param[in] dutyCycle 0 - 100%
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_PwmRefSetFreqAndDutyCycle(uint32_t newFreq, uint8_t dutyCycle)
+{
+  uint32_t sysFreq = HAL_RCC_GetSysClockFreq();
+  uint32_t period = (sysFreq/newFreq) - 1;
+  uint16_t pulseLength;
+  TIM_HandleTypeDef *pHTim;
+  
+  pHTim = &hTimerPwm;
+  pHTim->Instance = BSP_MOTOR_CONTROL_BOARD_PWM_REF;
+  
+  if (dutyCycle > 100) dutyCycle = 100;
+  pulseLength = (uint16_t)((period * (100-(uint32_t)dutyCycle)) / 100);
+  
+  __HAL_TIM_SET_AUTORELOAD(pHTim, period);
+  __HAL_TIM_SET_COMPARE(pHTim, BSP_MOTOR_CONTROL_BOARD_CHAN_PWM_REF, pulseLength);
+}
+
+/******************************************************//**
+ * @brief  Initialises the PWM used for the reference voltage generation
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_PwmRefInit(void)
+{
+  TIM_OC_InitTypeDef sConfigOC;
+  TIM_MasterConfigTypeDef sMasterConfig;
+  TIM_HandleTypeDef *pHTim;
+
+  pHTim = &hTimerPwm;
+  
+  pHTim->Instance = BSP_MOTOR_CONTROL_BOARD_PWM_REF;
+  pHTim->Init.CounterMode = TIM_COUNTERMODE_UP;
+  pHTim->Init.Prescaler = 0;
+  pHTim->Init.Period = 0;
+  pHTim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+  
+  sConfigOC.OCMode = TIM_OCMODE_PWM1;
+  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
+  sConfigOC.Pulse = 0;
+
+  HAL_TIM_PWM_Init(pHTim);
+  HAL_TIM_PWM_ConfigChannel(pHTim, &sConfigOC, BSP_MOTOR_CONTROL_BOARD_CHAN_PWM_REF);
+
+  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+  HAL_TIMEx_MasterConfigSynchronization(pHTim, &sMasterConfig);
+}
+
+/******************************************************//**
+ * @brief  Initialises the timer used for the step clock
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_TimStckInit(void)
+{
+  TIM_OC_InitTypeDef sConfigOC;
+  TIM_MasterConfigTypeDef sMasterConfig;
+  TIM_HandleTypeDef *pHTim;
+  uint32_t output = BSP_MOTOR_CONTROL_BOARD_OUTPUT_TIM_STCK;
+  
+  pHTim = &hTimerStepClock;
+  pHTim->Instance = BSP_MOTOR_CONTROL_BOARD_TIM_STCK;
+  pHTim->Init.CounterMode = TIM_COUNTERMODE_UP;
+  pHTim->Init.Prescaler = TIMER_PRESCALER -1;
+  pHTim->Init.Period = 0xFFFF;
+  pHTim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+  HAL_TIM_OC_Init(pHTim); 
+
+  if (output != TIMER_COMPLEMENTARY_OUTPUT)
+  {
+    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
+  }
+  else
+  {
+    sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW;
+  }
+  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
+  sConfigOC.Pulse = 0; 
+  if (pHTim->Instance != TIM15)
+  {
+    /* Setting the OCMode to TIM_OCMODE_FORCED_ACTIVE ensures that on the */
+    /* first interrupt occuring in the toggle mode, a rising edge will occur */
+    sConfigOC.OCMode = TIM_OCMODE_FORCED_ACTIVE;
+    HAL_TIM_OC_ConfigChannel(pHTim, &sConfigOC, BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK);
+    sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
+  }
+  else
+  {
+    sConfigOC.OCMode = TIM_OCMODE_TIMING;
+  }
+  HAL_TIM_OC_ConfigChannel(pHTim, &sConfigOC, BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK);
+
+  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+  HAL_TIMEx_MasterConfigSynchronization(pHTim, &sMasterConfig);
+}
+
+/******************************************************//**
+ * @brief  DeInitialises the timer used for the step clock
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_TimStckDeInit(void)
+{
+  HAL_TIM_OC_DeInit(&hTimerStepClock);
+}
+
+/******************************************************//**
+ * @brief  Stops the timer
+ * @param[in] pToggleOdd pointer to the volatile toggleOdd variable
+ * @retval 1 if OK, 0 if STCK pin is high (forbidden configuration) 
+ **********************************************************/
+uint8_t Stspin820_Board_TimStckStop(volatile uint8_t *pToggleOdd)
+{
+  __disable_irq();
+  if (*pToggleOdd == 1)
+  {
+    __enable_irq();
+    return 1;
+  }
+  if (HAL_GPIO_ReadPin(BSP_MOTOR_CONTROL_BOARD_PORT_TIM_STCK,\
+    BSP_MOTOR_CONTROL_BOARD_PIN_TIM_STCK) != 0)
+  {
+    __enable_irq();
+    return 0;
+  }
+#if (BSP_MOTOR_CONTROL_BOARD_OUTPUT_TIM_STCK == TIMER_COMPLEMENTARY_OUTPUT)
+  HAL_TIMEx_OCN_Stop_IT(&hTimerStepClock, BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK);
+#else
+  HAL_TIM_OC_Stop_IT(&hTimerStepClock, BSP_MOTOR_CONTROL_BOARD_CHAN_TIM_STCK);
+#endif
+  __enable_irq();
+  /* DeInitialize the step clock timer */
+  Stspin820_Board_TimStckDeInit();
+  return 1;
+}
+
+/******************************************************//**
+ * @brief  Stops the PWM used for the reference voltage generation 
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_PwmRefStop(void)
+{
+  HAL_TIM_PWM_Stop_IT(&hTimerPwm, BSP_MOTOR_CONTROL_BOARD_CHAN_PWM_REF);
+}
+
+/******************************************************//**
+ * @brief  Releases the STSPIN820 reset (pin set to High)
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_ReleaseReset(void)
+{ 
+  HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_STBY_RESET,\
+    BSP_MOTOR_CONTROL_BOARD_PIN_STBY_RESET,\
+    GPIO_PIN_SET);
+}
+
+/******************************************************//**
+ * @brief  Resets the STSPIN820 (reset pin set to low)
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_Reset(void)
+{
+  HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_STBY_RESET,\
+    BSP_MOTOR_CONTROL_BOARD_PIN_STBY_RESET,\
+    GPIO_PIN_RESET);
+}
+
+/******************************************************//**
+ * @brief  Set the GPIO used for the decay mode
+ * @param[in] gpioState state of the direction gpio (0 to reset, 1 to set)
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_SetDecayGpio(uint8_t gpioState)
+{
+  HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_DECAY,\
+    BSP_MOTOR_CONTROL_BOARD_PIN_DECAY,\
+    (GPIO_PinState)gpioState);
+}
+                   
+/******************************************************//**
+ * @brief  Set the GPIO used for the direction
+ * @param[in] gpioState state of the direction gpio (0 to reset, 1 to set)
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_SetDirectionGpio(uint8_t gpioState)
+{
+  HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_DIR,\
+    BSP_MOTOR_CONTROL_BOARD_PIN_DIR,\
+    (GPIO_PinState)gpioState);
+}
+
+/******************************************************//**
+ * @brief Disable the power bridges (Force the output bridges HiZ)
+ * the IHM14A1 board
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_Disable(void)
+{
+  GPIO_InitTypeDef GPIO_InitStruct;
+
+  /* Configure the GPIO connected to EN pin as an output */
+  GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_PIN_EN_AND_FAULT;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
+  HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_PORT_EN_AND_FAULT, &GPIO_InitStruct);
+  __disable_irq();
+  HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_EN_AND_FAULT,\
+    BSP_MOTOR_CONTROL_BOARD_PIN_EN_AND_FAULT,\
+    GPIO_PIN_RESET);
+  __HAL_GPIO_EXTI_CLEAR_IT(BSP_MOTOR_CONTROL_BOARD_PIN_EN_AND_FAULT);
+  __enable_irq();
+}
+
+/******************************************************//**
+ * @brief Enable the power bridges (leave the output bridges HiZ)
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_Enable(void)
+{
+  GPIO_InitTypeDef GPIO_InitStruct;
+  if (HAL_GPIO_ReadPin(BSP_MOTOR_CONTROL_BOARD_PORT_EN_AND_FAULT,\
+    BSP_MOTOR_CONTROL_BOARD_PIN_EN_AND_FAULT) == 0)
+  {
+    HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_EN_AND_FAULT,\
+      BSP_MOTOR_CONTROL_BOARD_PIN_EN_AND_FAULT,\
+      GPIO_PIN_SET);
+    HAL_Delay(BRIDGE_TURN_ON_DELAY);
+    /* Configure the GPIO connected to EN pin to take interrupt */
+    GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_PIN_EN_AND_FAULT;
+    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
+    GPIO_InitStruct.Pull = GPIO_PULLUP;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
+    HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_PORT_EN_AND_FAULT, &GPIO_InitStruct);
+    __HAL_GPIO_EXTI_CLEAR_IT(BSP_MOTOR_CONTROL_BOARD_PIN_EN_AND_FAULT);
+    HAL_NVIC_ClearPendingIRQ(BSP_MOTOR_CONTROL_BOARD_IRQn_EN_AND_FAULT);
+    HAL_NVIC_EnableIRQ(BSP_MOTOR_CONTROL_BOARD_IRQn_EN_AND_FAULT);
+  }
+}
+
+/******************************************************//**
+ * @brief  Returns the EN FAULT pin state.
+ * @retval The EN FAULT pin value.
+ **********************************************************/
+uint32_t Stspin820_Board_EN_AND_FAULT_PIN_GetState(void)
+{
+  return HAL_GPIO_ReadPin(BSP_MOTOR_CONTROL_BOARD_PORT_EN_AND_FAULT, BSP_MOTOR_CONTROL_BOARD_PIN_EN_AND_FAULT);
+}
+
+/******************************************************//**
+ * @brief Select the STSPIN820 mode1, mode2 and mode3 pins levels.
+ * @param[in] modePin1Level level of the mode1 gpio (0 low, 1+ high)
+ * @param[in] modePin2Level level of the mode2 gpio (0 low, 1+ high)
+ * @param[in] modePin3Level level of the mode3 gpio (0 low, 1+ high)
+ * @retval 1
+ **********************************************************/
+uint8_t Stspin820_Board_SetModePins(uint8_t modePin1Level,\
+  uint8_t modePin2Level,\
+  uint8_t modePin3Level)
+{
+   
+  
+  if (modePin1Level != 0)
+  {
+    HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_MODE1,\
+      BSP_MOTOR_CONTROL_BOARD_PIN_MODE1,\
+      GPIO_PIN_SET);
+  }
+  else
+  {
+    HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_MODE1,\
+      BSP_MOTOR_CONTROL_BOARD_PIN_MODE1,\
+      GPIO_PIN_RESET);
+  }
+
+  if (modePin2Level != 0)
+  {
+    HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_MODE2,\
+      BSP_MOTOR_CONTROL_BOARD_PIN_MODE2,\
+      GPIO_PIN_SET);
+  }
+  else
+  {
+    HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_MODE2,\
+      BSP_MOTOR_CONTROL_BOARD_PIN_MODE2,\
+      GPIO_PIN_RESET);
+  }
+  
+  if (modePin3Level != 0)
+  {
+    HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_MODE3,\
+      BSP_MOTOR_CONTROL_BOARD_PIN_MODE3,\
+      GPIO_PIN_SET);
+  }
+  else
+  {
+    HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_MODE3,\
+      BSP_MOTOR_CONTROL_BOARD_PIN_MODE3,\
+      GPIO_PIN_RESET);
+  }
+  
+  return 1;
+}
+
+/******************************************************//**
+ * @brief Select Full Step mode
+ * @retval None
+ **********************************************************/
+void Stspin820_Board_SetFullStep(void)
+{
+  HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_MODE1,\
+    BSP_MOTOR_CONTROL_BOARD_PIN_MODE1,\
+    GPIO_PIN_RESET);
+  HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_MODE2,\
+    BSP_MOTOR_CONTROL_BOARD_PIN_MODE2,\
+    GPIO_PIN_RESET);
+  HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_PORT_MODE3,\
+    BSP_MOTOR_CONTROL_BOARD_PIN_MODE3,\
+    GPIO_PIN_RESET);
+}
+
+/**
+  * @}
+  */
+
+/**
+  * @}
+  */    
+
+/**
+  * @}
+  */ 
+    
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+#endif