Parece que el temporizador PWM no funciona en el descubrimiento STM32F4

0

He estado jugando con el proceso de ir y venir de la hoja de datos, el manual de programación y el manual de referencia para entender mejor cómo usar el microcontrolador STM32F4 Cortex-M4. No me gusta la forma en que las bibliotecas predefinidas lo presentan todo, así que lo hago de forma más manual: es una preferencia personal que me ayuda mucho a comprender los mecanismos internos de los microcontroladores.

Mi problema es que la salida del PD12 no hace nada en absoluto, aunque el temporizador está contando y reiniciando.

Aquí está mi código:

#include "stm32f4xx.h"

volatile unsigned int i;
int main(void)
{
    SystemInit();

    RCC -> AHB1ENR |= RCC_AHB1ENR_GPIODEN;                  // Enable usage of GPIOD
    RCC -> APB1ENR |= RCC_APB1ENR_TIM4EN;                   // Enable usage of TIM4

    GPIOD -> MODER = (0x10 << 24);                          // Alternate function for PWM on PD12
    GPIOD -> OSPEEDR = (0xFF << 24);                        // High Speed on PD12
    GPIOD -> AFR[1] |= (0x2 << 16);                         // AFRH selected AF2 (TIM4; CH1) for PB6

    TIM4 -> CCMR1 |= (0x7 << 4) | (0x1 << 3);               // PWM Mode 2, channel 1 output compare preload enabled
    TIM4 -> CCR1 = 0x0199;                                  // 10% duty cycle (arbitrary)
    TIM4 -> PSC = 0x0000;                                   // No pre-scaler
    TIM4 -> ARR = 0x1000;                                   // Reload at 0x1000


    (*TIM4).CCER |= TIM_CCER_CC1E;                          // Enable CH1 output
    (*TIM4).CR1 |= (0x2 << 8) | TIM_CR1_ARPE | TIM_CR1_CEN; // Divide clock by 4, auto-reload, and start timer

    while(1) {
        // Do nothing, used for debug
        i++;
    }
}

Aquí está la salida de depuración durante el estado "No hacer nada" en el bucle while: tenga en cuenta que TIM4_CNT está contando constantemente.

Parareferencia,usélossiguientestutoriales:

pregunta bastinka

1 respuesta

1

Oh, wow, soy un idiota. Hice "0x10" en lugar de "0b10", que en hexadecimal en realidad sería "0x2" o solo 2. ¡Ya está arreglado!

    
respondido por el bastinka

Lea otras preguntas en las etiquetas