void pwmout_init(pwmout_t* obj, PinName pin) { // Get the peripheral name from the pin and assign it to the object obj->pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM); MBED_ASSERT(obj->pwm != (PWMName)NC); // Get the pin function and assign the used channel to the object uint32_t function = pinmap_function(pin, PinMap_PWM); MBED_ASSERT(function != (uint32_t)NC); obj->channel = STM_PIN_CHANNEL(function); obj->inverted = STM_PIN_INVERTED(function); // Enable TIM clock if (obj->pwm == PWM_2) __TIM2_CLK_ENABLE(); #if defined(TIM3_BASE) if (obj->pwm == PWM_3) __TIM3_CLK_ENABLE(); #endif if (obj->pwm == PWM_21) __TIM21_CLK_ENABLE(); #if defined(TIM22_BASE) if (obj->pwm == PWM_22) __TIM22_CLK_ENABLE(); #endif // Configure GPIO pinmap_pinout(pin, PinMap_PWM); obj->pin = pin; obj->period = 0; obj->pulse = 0; pwmout_period_us(obj, 20000); // 20 ms per default }
void pwmout_init(pwmout_t* obj, PinName pin) { // Get the peripheral name from the pin and assign it to the object obj->pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM); MBED_ASSERT(obj->pwm != (PWMName)NC); // Get the functions (timer channel, (non)inverted) from the pin and assign it to the object uint32_t function = pinmap_function(pin, PinMap_PWM); MBED_ASSERT(function != (uint32_t)NC); obj->channel = STM_PIN_CHANNEL(function); obj->inverted = STM_PIN_INVERTED(function); // Enable TIM clock if (obj->pwm == PWM_1) __TIM1_CLK_ENABLE(); if (obj->pwm == PWM_2) __TIM2_CLK_ENABLE(); if (obj->pwm == PWM_3) __TIM3_CLK_ENABLE(); // Configure GPIO pinmap_pinout(pin, PinMap_PWM); obj->pin = pin; obj->period = 0; obj->pulse = 0; obj->prescaler = 1; pwmout_period_us(obj, 20000); // 20 ms per default }
void pwmout_init(pwmout_t* obj, PinName pin) { // Get the peripheral name from the pin and assign it to the object obj->pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM); MBED_ASSERT(obj->pwm != (PWMName)NC); // Get the functions (timer channel, (non)inverted) from the pin and assign it to the object uint32_t function = pinmap_function(pin, PinMap_PWM); MBED_ASSERT(function != (uint32_t)NC); obj->channel = STM_PIN_CHANNEL(function); obj->inverted = STM_PIN_INVERTED(function); // Enable TIM clock #if defined(TIM1_BASE) if (obj->pwm == PWM_1) __HAL_RCC_TIM1_CLK_ENABLE(); #endif #if defined(TIM2_BASE) if (obj->pwm == PWM_2) __HAL_RCC_TIM2_CLK_ENABLE(); #endif #if defined(TIM3_BASE) if (obj->pwm == PWM_3) __HAL_RCC_TIM3_CLK_ENABLE(); #endif #if defined(TIM4_BASE) if (obj->pwm == PWM_4) __HAL_RCC_TIM4_CLK_ENABLE(); #endif #if defined(TIM5_BASE) if (obj->pwm == PWM_5) __HAL_RCC_TIM5_CLK_ENABLE(); #endif #if defined(TIM8_BASE) if (obj->pwm == PWM_8) __HAL_RCC_TIM8_CLK_ENABLE(); #endif #if defined(TIM9_BASE) if (obj->pwm == PWM_9) __HAL_RCC_TIM9_CLK_ENABLE(); #endif #if defined(TIM10_BASE) if (obj->pwm == PWM_10) __HAL_RCC_TIM10_CLK_ENABLE(); #endif #if defined(TIM11_BASE) if (obj->pwm == PWM_11) __HAL_RCC_TIM11_CLK_ENABLE(); #endif #if defined(TIM12_BASE) if (obj->pwm == PWM_12) __HAL_RCC_TIM12_CLK_ENABLE(); #endif #if defined(TIM13_BASE) if (obj->pwm == PWM_13) __HAL_RCC_TIM13_CLK_ENABLE(); #endif #if defined(TIM14_BASE) if (obj->pwm == PWM_14) __HAL_RCC_TIM14_CLK_ENABLE(); #endif // Configure GPIO pinmap_pinout(pin, PinMap_PWM); obj->pin = pin; obj->period = 0; obj->pulse = 0; obj->prescaler = 1; pwmout_period_us(obj, 20000); // 20 ms per default }
/** * @brief This function will set the PWM to the required value * @param port : the gpio port to use * @param pin : the gpio pin to use * @param clock_freq : frequency of the tim clock * @param period : period of the tim counter * @param value : the value to push on the PWM output * @param do_init : if set to 1 the initialization of the PWM is done * @retval None */ void pwm_start(PinName pin, uint32_t clock_freq, uint32_t period, uint32_t value, uint8_t do_init) { TIM_HandleTypeDef timHandle = {}; TIM_OC_InitTypeDef timConfig = {}; uint32_t timChannel; /* Compute the prescaler value to have TIM counter clock equal to clock_freq Hz */ timHandle.Instance = pinmap_peripheral(pin, PinMap_PWM); if (timHandle.Instance == NP) return; timHandle.Init.Prescaler = (uint32_t)(getTimerClkFreq(timHandle.Instance) / clock_freq) - 1; timHandle.Init.Period = period -1; timHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; timHandle.Init.CounterMode = TIM_COUNTERMODE_UP; #if !defined(STM32L0xx) && !defined(STM32L1xx) timHandle.Init.RepetitionCounter = 0; #endif timHandle.State= HAL_TIM_STATE_RESET; // TBC: is timHandle.State field should be saved ? if (do_init == 1) { g_current_pin = pin; if (HAL_TIM_PWM_Init(&timHandle) != HAL_OK) { return; } } timChannel = get_pwm_channel(pin); if (!IS_TIM_CHANNELS(timChannel)) return; //HAL_TIM_PWM_Stop(&timHandle, timChannel); /*##-2- Configure the PWM channels #########################################*/ /* Common configuration for all channels */ timConfig.OCMode = TIM_OCMODE_PWM1; timConfig.OCPolarity = TIM_OCPOLARITY_HIGH; timConfig.OCFastMode = TIM_OCFAST_DISABLE; #if !defined(STM32L0xx) && !defined(STM32L1xx) timConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH; timConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET; timConfig.OCIdleState = TIM_OCIDLESTATE_RESET; #endif timConfig.Pulse = value; if (HAL_TIM_PWM_ConfigChannel(&timHandle, &timConfig, timChannel) != HAL_OK) { /*##-2- Configure the PWM channels #########################################*/ return; } #if !defined(STM32L0xx) && !defined(STM32L1xx) if(STM_PIN_INVERTED(pinmap_function(pin, PinMap_PWM))) { HAL_TIMEx_PWMN_Start(&timHandle, timChannel); } else #endif { HAL_TIM_PWM_Start(&timHandle, timChannel); } }
/** * @brief This function will disable the PWM * @param port : the gpio port to use * @param pin : the gpio pin to use * @retval None */ void pwm_stop(PinName pin) { TIM_HandleTypeDef timHandle; uint32_t timChannel; timHandle.Instance = pinmap_peripheral(pin, PinMap_PWM); if (timHandle.Instance == NP) return; timChannel = get_pwm_channel(pin); if (!IS_TIM_CHANNELS(timChannel)) return; #if !defined(STM32L0xx) && !defined(STM32L1xx) if (STM_PIN_INVERTED(pinmap_function(pin, PinMap_PWM))) { HAL_TIMEx_PWMN_Stop(&timHandle, timChannel); } else #endif { HAL_TIM_PWM_Stop(&timHandle, timChannel); } HAL_TIM_PWM_DeInit(&timHandle); }