|
|
@@ -56,7 +56,7 @@
|
|
|
the commutation event).
|
|
|
|
|
|
(#) Activate the TIM peripheral using one of the start functions:
|
|
|
- (++) Complementary Output Compare : HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(), HAL_TIMEx_OC_Start_IT()
|
|
|
+ (++) Complementary Output Compare : HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(), HAL_TIMEx_OCN_Start_IT()
|
|
|
(++) Complementary PWM generation : HAL_TIMEx_PWMN_Start(), HAL_TIMEx_PWMN_Start_DMA(), HAL_TIMEx_PWMN_Start_IT()
|
|
|
(++) Complementary One-pulse mode output : HAL_TIMEx_OnePulseN_Start(), HAL_TIMEx_OnePulseN_Start_IT()
|
|
|
(++) Hall Sensor output : HAL_TIMEx_HallSensor_Start(), HAL_TIMEx_HallSensor_Start_DMA(), HAL_TIMEx_HallSensor_Start_IT().
|
|
|
@@ -92,9 +92,11 @@
|
|
|
|
|
|
/* Private typedef -----------------------------------------------------------*/
|
|
|
/* Private define ------------------------------------------------------------*/
|
|
|
-/* Private macro -------------------------------------------------------------*/
|
|
|
+/* Private macros ------------------------------------------------------------*/
|
|
|
/* Private variables ---------------------------------------------------------*/
|
|
|
/* Private function prototypes -----------------------------------------------*/
|
|
|
+static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma);
|
|
|
+static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma);
|
|
|
static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState);
|
|
|
|
|
|
/* Exported functions --------------------------------------------------------*/
|
|
|
@@ -125,6 +127,9 @@ static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Cha
|
|
|
*/
|
|
|
/**
|
|
|
* @brief Initializes the TIM Hall Sensor Interface and initialize the associated handle.
|
|
|
+ * @note When the timer instance is initialized in Hall Sensor Interface mode,
|
|
|
+ * timer channels 1 and channel 2 are reserved and cannot be used for
|
|
|
+ * other purpose.
|
|
|
* @param htim TIM Hall Sensor Interface handle
|
|
|
* @param sConfig TIM Hall Sensor configuration structure
|
|
|
* @retval HAL status
|
|
|
@@ -210,6 +215,15 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSen
|
|
|
htim->Instance->CR2 &= ~TIM_CR2_MMS;
|
|
|
htim->Instance->CR2 |= TIM_TRGO_OC2REF;
|
|
|
|
|
|
+ /* Initialize the DMA burst operation state */
|
|
|
+ htim->DMABurstState = HAL_DMA_BURST_STATE_READY;
|
|
|
+
|
|
|
+ /* Initialize the TIM channels state */
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+
|
|
|
/* Initialize the TIM state*/
|
|
|
htim->State = HAL_TIM_STATE_READY;
|
|
|
|
|
|
@@ -243,6 +257,15 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim)
|
|
|
HAL_TIMEx_HallSensor_MspDeInit(htim);
|
|
|
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
|
|
|
|
|
|
+ /* Change the DMA burst operation state */
|
|
|
+ htim->DMABurstState = HAL_DMA_BURST_STATE_RESET;
|
|
|
+
|
|
|
+ /* Change the TIM channels state */
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET);
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET);
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET);
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET);
|
|
|
+
|
|
|
/* Change TIM state */
|
|
|
htim->State = HAL_TIM_STATE_RESET;
|
|
|
|
|
|
@@ -290,17 +313,43 @@ __weak void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim)
|
|
|
HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim)
|
|
|
{
|
|
|
uint32_t tmpsmcr;
|
|
|
+ HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1);
|
|
|
+ HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2);
|
|
|
+ HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1);
|
|
|
+ HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2);
|
|
|
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance));
|
|
|
|
|
|
+ /* Check the TIM channels state */
|
|
|
+ if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY)
|
|
|
+ || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY)
|
|
|
+ || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)
|
|
|
+ || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY))
|
|
|
+ {
|
|
|
+ return HAL_ERROR;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Set the TIM channels state */
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+
|
|
|
/* Enable the Input Capture channel 1
|
|
|
- (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */
|
|
|
+ (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */
|
|
|
TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
|
|
|
|
|
|
/* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
|
|
|
- tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
- if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
|
|
|
+ {
|
|
|
+ tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
+ if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ {
|
|
|
+ __HAL_TIM_ENABLE(htim);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
__HAL_TIM_ENABLE(htim);
|
|
|
}
|
|
|
@@ -326,6 +375,12 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim)
|
|
|
/* Disable the Peripheral */
|
|
|
__HAL_TIM_DISABLE(htim);
|
|
|
|
|
|
+ /* Set the TIM channels state */
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+
|
|
|
/* Return function status */
|
|
|
return HAL_OK;
|
|
|
}
|
|
|
@@ -338,10 +393,29 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim)
|
|
|
HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim)
|
|
|
{
|
|
|
uint32_t tmpsmcr;
|
|
|
+ HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1);
|
|
|
+ HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2);
|
|
|
+ HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1);
|
|
|
+ HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2);
|
|
|
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance));
|
|
|
|
|
|
+ /* Check the TIM channels state */
|
|
|
+ if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY)
|
|
|
+ || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY)
|
|
|
+ || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)
|
|
|
+ || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY))
|
|
|
+ {
|
|
|
+ return HAL_ERROR;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Set the TIM channels state */
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+
|
|
|
/* Enable the capture compare Interrupts 1 event */
|
|
|
__HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
|
|
|
|
|
|
@@ -350,8 +424,15 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim)
|
|
|
TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
|
|
|
|
|
|
/* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
|
|
|
- tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
- if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
|
|
|
+ {
|
|
|
+ tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
+ if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ {
|
|
|
+ __HAL_TIM_ENABLE(htim);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
__HAL_TIM_ENABLE(htim);
|
|
|
}
|
|
|
@@ -380,6 +461,12 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim)
|
|
|
/* Disable the Peripheral */
|
|
|
__HAL_TIM_DISABLE(htim);
|
|
|
|
|
|
+ /* Set the TIM channels state */
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+
|
|
|
/* Return function status */
|
|
|
return HAL_OK;
|
|
|
}
|
|
|
@@ -394,29 +481,36 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim)
|
|
|
HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length)
|
|
|
{
|
|
|
uint32_t tmpsmcr;
|
|
|
+ HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1);
|
|
|
+ HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1);
|
|
|
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance));
|
|
|
|
|
|
- if (htim->State == HAL_TIM_STATE_BUSY)
|
|
|
+ /* Set the TIM channel state */
|
|
|
+ if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)
|
|
|
+ ||(complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY))
|
|
|
{
|
|
|
return HAL_BUSY;
|
|
|
}
|
|
|
- else if (htim->State == HAL_TIM_STATE_READY)
|
|
|
+ else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY)
|
|
|
+ && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY))
|
|
|
{
|
|
|
- if (((uint32_t)pData == 0U) && (Length > 0U))
|
|
|
+ if ((pData == NULL) && (Length > 0U))
|
|
|
{
|
|
|
return HAL_ERROR;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- htim->State = HAL_TIM_STATE_BUSY;
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- /* nothing to do */
|
|
|
+ return HAL_ERROR;
|
|
|
}
|
|
|
+
|
|
|
/* Enable the Input Capture channel 1
|
|
|
(in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */
|
|
|
TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
|
|
|
@@ -436,8 +530,15 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32
|
|
|
__HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);
|
|
|
|
|
|
/* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
|
|
|
- tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
- if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
|
|
|
+ {
|
|
|
+ tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
+ if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ {
|
|
|
+ __HAL_TIM_ENABLE(htim);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
__HAL_TIM_ENABLE(htim);
|
|
|
}
|
|
|
@@ -465,9 +566,14 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim)
|
|
|
__HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);
|
|
|
|
|
|
(void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);
|
|
|
+
|
|
|
/* Disable the Peripheral */
|
|
|
__HAL_TIM_DISABLE(htim);
|
|
|
|
|
|
+ /* Set the TIM channel state */
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+
|
|
|
/* Return function status */
|
|
|
return HAL_OK;
|
|
|
}
|
|
|
@@ -514,6 +620,15 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
|
|
|
|
|
|
+ /* Check the TIM complementary channel state */
|
|
|
+ if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY)
|
|
|
+ {
|
|
|
+ return HAL_ERROR;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Set the TIM complementary channel state */
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+
|
|
|
/* Enable the Capture compare channel N */
|
|
|
TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE);
|
|
|
|
|
|
@@ -521,8 +636,15 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
|
|
|
__HAL_TIM_MOE_ENABLE(htim);
|
|
|
|
|
|
/* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
|
|
|
- tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
- if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
|
|
|
+ {
|
|
|
+ tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
+ if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ {
|
|
|
+ __HAL_TIM_ENABLE(htim);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
__HAL_TIM_ENABLE(htim);
|
|
|
}
|
|
|
@@ -556,6 +678,9 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
|
|
|
/* Disable the Peripheral */
|
|
|
__HAL_TIM_DISABLE(htim);
|
|
|
|
|
|
+ /* Set the TIM complementary channel state */
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+
|
|
|
/* Return function status */
|
|
|
return HAL_OK;
|
|
|
}
|
|
|
@@ -578,6 +703,15 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Chann
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
|
|
|
|
|
|
+ /* Check the TIM complementary channel state */
|
|
|
+ if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY)
|
|
|
+ {
|
|
|
+ return HAL_ERROR;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Set the TIM complementary channel state */
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+
|
|
|
switch (Channel)
|
|
|
{
|
|
|
case TIM_CHANNEL_1:
|
|
|
@@ -616,8 +750,15 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Chann
|
|
|
__HAL_TIM_MOE_ENABLE(htim);
|
|
|
|
|
|
/* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
|
|
|
- tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
- if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
|
|
|
+ {
|
|
|
+ tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
+ if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ {
|
|
|
+ __HAL_TIM_ENABLE(htim);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
__HAL_TIM_ENABLE(htim);
|
|
|
}
|
|
|
@@ -686,6 +827,9 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channe
|
|
|
/* Disable the Peripheral */
|
|
|
__HAL_TIM_DISABLE(htim);
|
|
|
|
|
|
+ /* Set the TIM complementary channel state */
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+
|
|
|
/* Return function status */
|
|
|
return HAL_OK;
|
|
|
}
|
|
|
@@ -710,24 +854,25 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Chan
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
|
|
|
|
|
|
- if (htim->State == HAL_TIM_STATE_BUSY)
|
|
|
+ /* Set the TIM complementary channel state */
|
|
|
+ if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY)
|
|
|
{
|
|
|
return HAL_BUSY;
|
|
|
}
|
|
|
- else if (htim->State == HAL_TIM_STATE_READY)
|
|
|
+ else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY)
|
|
|
{
|
|
|
- if (((uint32_t)pData == 0U) && (Length > 0U))
|
|
|
+ if ((pData == NULL) && (Length > 0U))
|
|
|
{
|
|
|
return HAL_ERROR;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- htim->State = HAL_TIM_STATE_BUSY;
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- /* nothing to do */
|
|
|
+ return HAL_ERROR;
|
|
|
}
|
|
|
|
|
|
switch (Channel)
|
|
|
@@ -735,11 +880,11 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Chan
|
|
|
case TIM_CHANNEL_1:
|
|
|
{
|
|
|
/* Set the DMA compare callbacks */
|
|
|
- htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt;
|
|
|
+ htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt;
|
|
|
htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
|
|
|
|
|
|
/* Set the DMA error callback */
|
|
|
- htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;
|
|
|
+ htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ;
|
|
|
|
|
|
/* Enable the DMA channel */
|
|
|
if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK)
|
|
|
@@ -754,11 +899,11 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Chan
|
|
|
case TIM_CHANNEL_2:
|
|
|
{
|
|
|
/* Set the DMA compare callbacks */
|
|
|
- htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt;
|
|
|
+ htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseNCplt;
|
|
|
htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
|
|
|
|
|
|
/* Set the DMA error callback */
|
|
|
- htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;
|
|
|
+ htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAErrorCCxN ;
|
|
|
|
|
|
/* Enable the DMA channel */
|
|
|
if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK)
|
|
|
@@ -773,11 +918,11 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Chan
|
|
|
case TIM_CHANNEL_3:
|
|
|
{
|
|
|
/* Set the DMA compare callbacks */
|
|
|
- htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt;
|
|
|
+ htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseNCplt;
|
|
|
htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
|
|
|
|
|
|
/* Set the DMA error callback */
|
|
|
- htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;
|
|
|
+ htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAErrorCCxN ;
|
|
|
|
|
|
/* Enable the DMA channel */
|
|
|
if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK)
|
|
|
@@ -800,8 +945,15 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Chan
|
|
|
__HAL_TIM_MOE_ENABLE(htim);
|
|
|
|
|
|
/* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
|
|
|
- tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
- if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
|
|
|
+ {
|
|
|
+ tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
+ if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ {
|
|
|
+ __HAL_TIM_ENABLE(htim);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
__HAL_TIM_ENABLE(htim);
|
|
|
}
|
|
|
@@ -865,8 +1017,8 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chann
|
|
|
/* Disable the Peripheral */
|
|
|
__HAL_TIM_DISABLE(htim);
|
|
|
|
|
|
- /* Change the htim state */
|
|
|
- htim->State = HAL_TIM_STATE_READY;
|
|
|
+ /* Set the TIM complementary channel state */
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
|
|
|
/* Return function status */
|
|
|
return HAL_OK;
|
|
|
@@ -923,6 +1075,15 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
|
|
|
|
|
|
+ /* Check the TIM complementary channel state */
|
|
|
+ if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY)
|
|
|
+ {
|
|
|
+ return HAL_ERROR;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Set the TIM complementary channel state */
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+
|
|
|
/* Enable the complementary PWM output */
|
|
|
TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE);
|
|
|
|
|
|
@@ -930,8 +1091,15 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel
|
|
|
__HAL_TIM_MOE_ENABLE(htim);
|
|
|
|
|
|
/* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
|
|
|
- tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
- if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
|
|
|
+ {
|
|
|
+ tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
+ if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ {
|
|
|
+ __HAL_TIM_ENABLE(htim);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
__HAL_TIM_ENABLE(htim);
|
|
|
}
|
|
|
@@ -964,6 +1132,9 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
|
|
|
/* Disable the Peripheral */
|
|
|
__HAL_TIM_DISABLE(htim);
|
|
|
|
|
|
+ /* Set the TIM complementary channel state */
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+
|
|
|
/* Return function status */
|
|
|
return HAL_OK;
|
|
|
}
|
|
|
@@ -986,6 +1157,15 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Chan
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
|
|
|
|
|
|
+ /* Check the TIM complementary channel state */
|
|
|
+ if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY)
|
|
|
+ {
|
|
|
+ return HAL_ERROR;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Set the TIM complementary channel state */
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+
|
|
|
switch (Channel)
|
|
|
{
|
|
|
case TIM_CHANNEL_1:
|
|
|
@@ -1023,8 +1203,15 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Chan
|
|
|
__HAL_TIM_MOE_ENABLE(htim);
|
|
|
|
|
|
/* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
|
|
|
- tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
- if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
|
|
|
+ {
|
|
|
+ tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
+ if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ {
|
|
|
+ __HAL_TIM_ENABLE(htim);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
__HAL_TIM_ENABLE(htim);
|
|
|
}
|
|
|
@@ -1094,6 +1281,9 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Chann
|
|
|
/* Disable the Peripheral */
|
|
|
__HAL_TIM_DISABLE(htim);
|
|
|
|
|
|
+ /* Set the TIM complementary channel state */
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+
|
|
|
/* Return function status */
|
|
|
return HAL_OK;
|
|
|
}
|
|
|
@@ -1118,35 +1308,37 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Cha
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
|
|
|
|
|
|
- if (htim->State == HAL_TIM_STATE_BUSY)
|
|
|
+ /* Set the TIM complementary channel state */
|
|
|
+ if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY)
|
|
|
{
|
|
|
return HAL_BUSY;
|
|
|
}
|
|
|
- else if (htim->State == HAL_TIM_STATE_READY)
|
|
|
+ else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY)
|
|
|
{
|
|
|
- if (((uint32_t)pData == 0U) && (Length > 0U))
|
|
|
+ if ((pData == NULL) && (Length > 0U))
|
|
|
{
|
|
|
return HAL_ERROR;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- htim->State = HAL_TIM_STATE_BUSY;
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- /* nothing to do */
|
|
|
+ return HAL_ERROR;
|
|
|
}
|
|
|
+
|
|
|
switch (Channel)
|
|
|
{
|
|
|
case TIM_CHANNEL_1:
|
|
|
{
|
|
|
/* Set the DMA compare callbacks */
|
|
|
- htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt;
|
|
|
+ htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt;
|
|
|
htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
|
|
|
|
|
|
/* Set the DMA error callback */
|
|
|
- htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;
|
|
|
+ htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ;
|
|
|
|
|
|
/* Enable the DMA channel */
|
|
|
if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK)
|
|
|
@@ -1161,11 +1353,11 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Cha
|
|
|
case TIM_CHANNEL_2:
|
|
|
{
|
|
|
/* Set the DMA compare callbacks */
|
|
|
- htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt;
|
|
|
+ htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseNCplt;
|
|
|
htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
|
|
|
|
|
|
/* Set the DMA error callback */
|
|
|
- htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;
|
|
|
+ htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAErrorCCxN ;
|
|
|
|
|
|
/* Enable the DMA channel */
|
|
|
if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK)
|
|
|
@@ -1180,11 +1372,11 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Cha
|
|
|
case TIM_CHANNEL_3:
|
|
|
{
|
|
|
/* Set the DMA compare callbacks */
|
|
|
- htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt;
|
|
|
+ htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseNCplt;
|
|
|
htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
|
|
|
|
|
|
/* Set the DMA error callback */
|
|
|
- htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;
|
|
|
+ htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAErrorCCxN ;
|
|
|
|
|
|
/* Enable the DMA channel */
|
|
|
if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK)
|
|
|
@@ -1207,8 +1399,15 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Cha
|
|
|
__HAL_TIM_MOE_ENABLE(htim);
|
|
|
|
|
|
/* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
|
|
|
- tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
- if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
|
|
|
+ {
|
|
|
+ tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
|
|
|
+ if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
|
|
|
+ {
|
|
|
+ __HAL_TIM_ENABLE(htim);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
__HAL_TIM_ENABLE(htim);
|
|
|
}
|
|
|
@@ -1272,8 +1471,8 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chan
|
|
|
/* Disable the Peripheral */
|
|
|
__HAL_TIM_DISABLE(htim);
|
|
|
|
|
|
- /* Change the htim state */
|
|
|
- htim->State = HAL_TIM_STATE_READY;
|
|
|
+ /* Set the TIM complementary channel state */
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
|
|
|
/* Return function status */
|
|
|
return HAL_OK;
|
|
|
@@ -1313,11 +1512,27 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chan
|
|
|
*/
|
|
|
HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel)
|
|
|
{
|
|
|
+ uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1;
|
|
|
+ HAL_TIM_ChannelStateTypeDef input_channel_state = TIM_CHANNEL_STATE_GET(htim, input_channel);
|
|
|
+ HAL_TIM_ChannelStateTypeDef output_channel_state = TIM_CHANNEL_N_STATE_GET(htim, OutputChannel);
|
|
|
+
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel));
|
|
|
|
|
|
- /* Enable the complementary One Pulse output */
|
|
|
+ /* Check the TIM channels state */
|
|
|
+ if ((output_channel_state != HAL_TIM_CHANNEL_STATE_READY)
|
|
|
+ || (input_channel_state != HAL_TIM_CHANNEL_STATE_READY))
|
|
|
+ {
|
|
|
+ return HAL_ERROR;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Set the TIM channels state */
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, OutputChannel, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, input_channel, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+
|
|
|
+ /* Enable the complementary One Pulse output channel and the Input Capture channel */
|
|
|
TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE);
|
|
|
+ TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_ENABLE);
|
|
|
|
|
|
/* Enable the Main Output */
|
|
|
__HAL_TIM_MOE_ENABLE(htim);
|
|
|
@@ -1338,12 +1553,14 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t Ou
|
|
|
*/
|
|
|
HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel)
|
|
|
{
|
|
|
+ uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1;
|
|
|
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel));
|
|
|
|
|
|
- /* Disable the complementary One Pulse output */
|
|
|
+ /* Disable the complementary One Pulse output channel and the Input Capture channel */
|
|
|
TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE);
|
|
|
+ TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_DISABLE);
|
|
|
|
|
|
/* Disable the Main Output */
|
|
|
__HAL_TIM_MOE_DISABLE(htim);
|
|
|
@@ -1351,6 +1568,10 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t Out
|
|
|
/* Disable the Peripheral */
|
|
|
__HAL_TIM_DISABLE(htim);
|
|
|
|
|
|
+ /* Set the TIM channels state */
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, OutputChannel, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, input_channel, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+
|
|
|
/* Return function status */
|
|
|
return HAL_OK;
|
|
|
}
|
|
|
@@ -1367,17 +1588,33 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t Out
|
|
|
*/
|
|
|
HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel)
|
|
|
{
|
|
|
+ uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1;
|
|
|
+ HAL_TIM_ChannelStateTypeDef input_channel_state = TIM_CHANNEL_STATE_GET(htim, input_channel);
|
|
|
+ HAL_TIM_ChannelStateTypeDef output_channel_state = TIM_CHANNEL_N_STATE_GET(htim, OutputChannel);
|
|
|
+
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel));
|
|
|
|
|
|
+ /* Check the TIM channels state */
|
|
|
+ if ((output_channel_state != HAL_TIM_CHANNEL_STATE_READY)
|
|
|
+ || (input_channel_state != HAL_TIM_CHANNEL_STATE_READY))
|
|
|
+ {
|
|
|
+ return HAL_ERROR;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Set the TIM channels state */
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, OutputChannel, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, input_channel, HAL_TIM_CHANNEL_STATE_BUSY);
|
|
|
+
|
|
|
/* Enable the TIM Capture/Compare 1 interrupt */
|
|
|
__HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
|
|
|
|
|
|
/* Enable the TIM Capture/Compare 2 interrupt */
|
|
|
__HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
|
|
|
|
|
|
- /* Enable the complementary One Pulse output */
|
|
|
+ /* Enable the complementary One Pulse output channel and the Input Capture channel */
|
|
|
TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE);
|
|
|
+ TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_ENABLE);
|
|
|
|
|
|
/* Enable the Main Output */
|
|
|
__HAL_TIM_MOE_ENABLE(htim);
|
|
|
@@ -1398,6 +1635,8 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t
|
|
|
*/
|
|
|
HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel)
|
|
|
{
|
|
|
+ uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1;
|
|
|
+
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel));
|
|
|
|
|
|
@@ -1407,8 +1646,9 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t
|
|
|
/* Disable the TIM Capture/Compare 2 interrupt */
|
|
|
__HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);
|
|
|
|
|
|
- /* Disable the complementary One Pulse output */
|
|
|
+ /* Disable the complementary One Pulse output channel and the Input Capture channel */
|
|
|
TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE);
|
|
|
+ TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_DISABLE);
|
|
|
|
|
|
/* Disable the Main Output */
|
|
|
__HAL_TIM_MOE_DISABLE(htim);
|
|
|
@@ -1416,6 +1656,10 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t
|
|
|
/* Disable the Peripheral */
|
|
|
__HAL_TIM_DISABLE(htim);
|
|
|
|
|
|
+ /* Set the TIM channels state */
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, OutputChannel, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ TIM_CHANNEL_STATE_SET(htim, input_channel, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+
|
|
|
/* Return function status */
|
|
|
return HAL_OK;
|
|
|
}
|
|
|
@@ -1856,10 +2100,10 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim,
|
|
|
#if defined(DFSDM1_Channel0)
|
|
|
if (sBreakInputConfig->Source != TIM_BREAKINPUTSOURCE_DFSDM1)
|
|
|
#endif /* DFSDM1_Channel0 */
|
|
|
- {
|
|
|
- tmporx &= ~bkin_polarity_mask;
|
|
|
- tmporx |= (sBreakInputConfig->Polarity << bkin_polarity_bitpos) & bkin_polarity_mask;
|
|
|
- }
|
|
|
+ {
|
|
|
+ tmporx &= ~bkin_polarity_mask;
|
|
|
+ tmporx |= (sBreakInputConfig->Polarity << bkin_polarity_bitpos) & bkin_polarity_mask;
|
|
|
+ }
|
|
|
|
|
|
/* Set TIMx_OR2 */
|
|
|
htim->Instance->OR2 = tmporx;
|
|
|
@@ -1878,10 +2122,10 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim,
|
|
|
#if defined(DFSDM1_Channel0)
|
|
|
if (sBreakInputConfig->Source != TIM_BREAKINPUTSOURCE_DFSDM1)
|
|
|
#endif /* DFSDM1_Channel0 */
|
|
|
- {
|
|
|
- tmporx &= ~bkin_polarity_mask;
|
|
|
- tmporx |= (sBreakInputConfig->Polarity << bkin_polarity_bitpos) & bkin_polarity_mask;
|
|
|
- }
|
|
|
+ {
|
|
|
+ tmporx &= ~bkin_polarity_mask;
|
|
|
+ tmporx |= (sBreakInputConfig->Polarity << bkin_polarity_bitpos) & bkin_polarity_mask;
|
|
|
+ }
|
|
|
|
|
|
/* Set TIMx_OR3 */
|
|
|
htim->Instance->OR3 = tmporx;
|
|
|
@@ -2092,7 +2336,7 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim,
|
|
|
* @arg TIM_TIM16_TI1_LSI: TIM16 TI1 is connected to LSI
|
|
|
* @arg TIM_TIM16_TI1_LSE: TIM16 TI1 is connected to LSE
|
|
|
* @arg TIM_TIM16_TI1_RTC: TIM16 TI1 is connected to RTC wakeup interrupt
|
|
|
- * @arg TIM_TIM16_TI1_MSI: TIM16 TI1 is connected to MSI (contraints: MSI clock < 1/4 TIM APB clock)
|
|
|
+ * @arg TIM_TIM16_TI1_MSI: TIM16 TI1 is connected to MSI (constraints: MSI clock < 1/4 TIM APB clock)
|
|
|
* @arg TIM_TIM16_TI1_HSE_32: TIM16 TI1 is connected to HSE div 32 (note that HSE div 32 must be selected as RTC clock source)
|
|
|
* @arg TIM_TIM16_TI1_MCO: TIM16 TI1 is connected to MCO
|
|
|
*
|
|
|
@@ -2103,7 +2347,7 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim,
|
|
|
* @arg TIM_TIM16_TI1_LSI: TIM16 TI1 is connected to LSI
|
|
|
* @arg TIM_TIM16_TI1_LSE: TIM16 TI1 is connected to LSE
|
|
|
* @arg TIM_TIM16_TI1_RTC: TIM16 TI1 is connected to RTC wakeup interrupt
|
|
|
- * @arg TIM_TIM16_TI1_MSI: TIM16 TI1 is connected to MSI (contraints: MSI clock < 1/4 TIM APB clock)
|
|
|
+ * @arg TIM_TIM16_TI1_MSI: TIM16 TI1 is connected to MSI (constraints: MSI clock < 1/4 TIM APB clock)
|
|
|
* @arg TIM_TIM16_TI1_HSE_32: TIM16 TI1 is connected to HSE div 32 (note that HSE div 32 must be selected as RTC clock source)
|
|
|
* @arg TIM_TIM16_TI1_MCO: TIM16 TI1 is connected to MCO
|
|
|
*
|
|
|
@@ -2111,7 +2355,7 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim,
|
|
|
@if STM32L486xx
|
|
|
* For TIM17, the parameter can have the following values:
|
|
|
* @arg TIM_TIM17_TI1_GPIO: TIM17 TI1 is connected to GPIO
|
|
|
- * @arg TIM_TIM17_TI1_MSI: TIM17 TI1 is connected to MSI (contraints: MSI clock < 1/4 TIM APB clock)
|
|
|
+ * @arg TIM_TIM17_TI1_MSI: TIM17 TI1 is connected to MSI (constraints: MSI clock < 1/4 TIM APB clock)
|
|
|
* @arg TIM_TIM17_TI1_HSE_32: TIM17 TI1 is connected to HSE div 32
|
|
|
* @arg TIM_TIM17_TI1_MCO: TIM17 TI1 is connected to MCO
|
|
|
@endif
|
|
|
@@ -2120,8 +2364,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim,
|
|
|
*/
|
|
|
HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap)
|
|
|
{
|
|
|
- uint32_t tmpor1 = 0U;
|
|
|
- uint32_t tmpor2 = 0U;
|
|
|
+ uint32_t tmpor1;
|
|
|
+ uint32_t tmpor2;
|
|
|
|
|
|
__HAL_LOCK(htim);
|
|
|
|
|
|
@@ -2295,6 +2539,27 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim)
|
|
|
return htim->State;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * @brief Return actual state of the TIM complementary channel.
|
|
|
+ * @param htim TIM handle
|
|
|
+ * @param ChannelN TIM Complementary channel
|
|
|
+ * This parameter can be one of the following values:
|
|
|
+ * @arg TIM_CHANNEL_1: TIM Channel 1
|
|
|
+ * @arg TIM_CHANNEL_2: TIM Channel 2
|
|
|
+ * @arg TIM_CHANNEL_3: TIM Channel 3
|
|
|
+ * @retval TIM Complementary channel state
|
|
|
+ */
|
|
|
+HAL_TIM_ChannelStateTypeDef HAL_TIMEx_GetChannelNState(TIM_HandleTypeDef *htim, uint32_t ChannelN)
|
|
|
+{
|
|
|
+ HAL_TIM_ChannelStateTypeDef channel_state;
|
|
|
+
|
|
|
+ /* Check the parameters */
|
|
|
+ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, ChannelN));
|
|
|
+
|
|
|
+ channel_state = TIM_CHANNEL_N_STATE_GET(htim, ChannelN);
|
|
|
+
|
|
|
+ return channel_state;
|
|
|
+}
|
|
|
/**
|
|
|
* @}
|
|
|
*/
|
|
|
@@ -2347,6 +2612,103 @@ void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma)
|
|
|
}
|
|
|
|
|
|
|
|
|
+/**
|
|
|
+ * @brief TIM DMA Delay Pulse complete callback (complementary channel).
|
|
|
+ * @param hdma pointer to DMA handle.
|
|
|
+ * @retval None
|
|
|
+ */
|
|
|
+static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma)
|
|
|
+{
|
|
|
+ TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
|
|
|
+
|
|
|
+ if (hdma == htim->hdma[TIM_DMA_ID_CC1])
|
|
|
+ {
|
|
|
+ htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;
|
|
|
+
|
|
|
+ if (hdma->Init.Mode == DMA_NORMAL)
|
|
|
+ {
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (hdma == htim->hdma[TIM_DMA_ID_CC2])
|
|
|
+ {
|
|
|
+ htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
|
|
|
+
|
|
|
+ if (hdma->Init.Mode == DMA_NORMAL)
|
|
|
+ {
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (hdma == htim->hdma[TIM_DMA_ID_CC3])
|
|
|
+ {
|
|
|
+ htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
|
|
|
+
|
|
|
+ if (hdma->Init.Mode == DMA_NORMAL)
|
|
|
+ {
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (hdma == htim->hdma[TIM_DMA_ID_CC4])
|
|
|
+ {
|
|
|
+ htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
|
|
|
+
|
|
|
+ if (hdma->Init.Mode == DMA_NORMAL)
|
|
|
+ {
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ /* nothing to do */
|
|
|
+ }
|
|
|
+
|
|
|
+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
|
|
|
+ htim->PWM_PulseFinishedCallback(htim);
|
|
|
+#else
|
|
|
+ HAL_TIM_PWM_PulseFinishedCallback(htim);
|
|
|
+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
|
|
|
+
|
|
|
+ htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief TIM DMA error callback (complementary channel)
|
|
|
+ * @param hdma pointer to DMA handle.
|
|
|
+ * @retval None
|
|
|
+ */
|
|
|
+void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma)
|
|
|
+{
|
|
|
+ TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
|
|
|
+
|
|
|
+ if (hdma == htim->hdma[TIM_DMA_ID_CC1])
|
|
|
+ {
|
|
|
+ htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ }
|
|
|
+ else if (hdma == htim->hdma[TIM_DMA_ID_CC2])
|
|
|
+ {
|
|
|
+ htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ }
|
|
|
+ else if (hdma == htim->hdma[TIM_DMA_ID_CC3])
|
|
|
+ {
|
|
|
+ htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
|
|
|
+ TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ /* nothing to do */
|
|
|
+ }
|
|
|
+
|
|
|
+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
|
|
|
+ htim->ErrorCallback(htim);
|
|
|
+#else
|
|
|
+ HAL_TIM_ErrorCallback(htim);
|
|
|
+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
|
|
|
+
|
|
|
+ htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* @brief Enables or disables the TIM Capture Compare Channel xN.
|
|
|
* @param TIMx to select the TIM peripheral
|