Ejemplo minimal de salida PWM STM32H7 usando ST HAL

El siguiente ejemplo es el codigo minimal para usar la libreria ST HAL para generar una senal PWM en un pin de un microcontrolador STM32H7. En este ejemplo, usamos la placa Nucleo-H753ZI con un microcontrolador STM32H753ZI.

Usamos TIM2 para generar la senal PWM y el canal de comparacion TIM2_CH1 que se genera en el pin PA5.

pwm_output_stm32h7.c
#include <stm32h7xx_hal.h>

/**
 * Inicializar salida PWM para generar pulsos de prueba.
 */
TIM_HandleTypeDef pwmOutputTimer;
TIM_OC_InitTypeDef pwmOutputConfig = {0};

void PWM_Output_Init() {
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_TIM2_CLK_ENABLE();

    /**
     * Parametros para medicion:
     *   Prescaler = 9,
     *   Period = 48,
     *   Pulse = (Period + 1) / 8
     * Valores medidos (promedio sobre 5k mediciones, DSO-X 3024A):
     *   On time: 234.36ns
     *   Frecuencia: 495.34 kHz
     */

    pwmOutputTimer.Instance = TIM2;
    pwmOutputTimer.Init.Prescaler = 9;  // Prescaler de clock TIM2 (PSC)
    pwmOutputTimer.Init.CounterMode = TIM_COUNTERMODE_UP;
    pwmOutputTimer.Init.Period = 48;    // Valor Auto-reload (ARR) para 10 kHz
    pwmOutputTimer.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2;
    pwmOutputTimer.Init.RepetitionCounter = 0;
    if (HAL_TIM_PWM_Init(&pwmOutputTimer) != HAL_OK)
    {
        SendLogMessage("PWM output Timer Initialization Error");
    }

    // Configuracion PWM para TIM2 Channel 1
    pwmOutputConfig.OCMode = TIM_OCMODE_PWM1;
    pwmOutputConfig.Pulse = (pwmOutputTimer.Init.Period + 1) / 8; // 50% duty cycle
    pwmOutputConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
    pwmOutputConfig.OCFastMode = TIM_OCFAST_DISABLE;
    if (HAL_TIM_PWM_ConfigChannel(&pwmOutputTimer, &pwmOutputConfig, TIM_CHANNEL_1) != HAL_OK)
    {
        // Error de configuracion PWM
        SendLogMessage("PWM output Configuration Error");
    }

    // Configurar GPIO:
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // Habilitar clock GPIOA
    __HAL_RCC_GPIOA_CLK_ENABLE();

    // Configurar PA5 como funcion alterna para TIM2_CH1
    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;  // TIM2 AF en PA5
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    HAL_TIM_PWM_Start(&pwmOutputTimer, TIM_CHANNEL_1);
}

La senal se ve asi para mi placa

Medición de señal PWM STM32H7


Echa un vistazo a artículos similares por categoría: Electrónica STM32 C/C++