STM32 - Generador de señal de reloj usando un temporizador - Código generado STM32CubeMX

Estoy tratando de generar un reloj de 1,4 MHz usando STM32F103C8Tx usando STM32CubeMX.

En primer lugar, en mi código tengo el pin PB13 como salida y en principal lo alterno cada dos segundos. Esto funciona.

Ahora la parte más importante. Cosas que he configurado en CubeMX:

  • He configurado el reloj base del dispositivo a 28 MHz.
  • TIM3 Canal 2: Comparación de salida CH2 PWM Generación CH2
  • Reloj interno
  • Temporizador3:Ingrese la descripción de la imagen aquí

Compilé el código generado en el IDE de OpenSTM32 y lo subí. El LED parpadea en el intervalo establecido, pero no tengo salida en el pin B5 A7 (Timer3 canal 2). Esto se verifica en el osciloscopio.

Código (principal):

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM3_Init();

  //These two lines were manually added
  HAL_TIM_Base_Start(&htim3);
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);

  while (1)
  {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        HAL_Delay(5000);
  }
}

El resto se puede encontrar aquí .

Creo que la comparación de salida de un canal de temporizador no significa salida física a un pin. Simplemente compara el valor del temporizador (salida) con algún valor preestablecido y genera una interrupción o cualquier cosa si coincide.
Ahora estoy usando la salida PWM en el Modo 1.
En mi caso, encontré que la HAL_TIM_Base_Start(&htim3);línea no era necesaria (tampoco creo que doliera).
La señal de reloj generada debe ser exactamente de 1,4 MHz o ¿hay algún otro valor permitido?
@Bence Kaulics: Sí, tienes razón. Dividir por 20 en lugar de 19 es más cercano (de hecho, es exactamente 1,4 MHz si los 28 MHz son exactos). He ajustado mi respuesta.

Respuestas (1)

Debe establecer un período para el temporizador en el campo "Contador de período (registro de recarga automática - valor de 16 bits)" (tercera línea). Éste, junto con el prescaler (primera línea) y la frecuencia APB1, determina la frecuencia del temporizador.

La configuración de "Pulso" para las salidas PWM determina el ciclo de trabajo . Todas las salidas PWM para el temporizador 3 tienen la misma frecuencia (la frecuencia del temporizador), pero configuraciones de ciclo de trabajo independientes (una por salida PWM).

Captura de pantalla de STM32CubeMx, para la placa STM32 Nucleo STM32F042K6, temporizador 3

Tenga en cuenta que es fácil cometer errores de uno en uno. Esto se aplica tanto al preescalador (por ejemplo, 0 significa dividir por 1) como al período del temporizador. Por ejemplo, en este ejemplo donde la frecuencia APB1 es 48 MHz, la frecuencia es 48 MHz / 3 / 51 = 313,725 kHz (y no, por ejemplo, 48 MHz / 3 / 50 = 320 kHz). Para la configuración de PWM, por otro lado, la configuración es el valor efectivo real (no +1). Los ciclos de trabajo son 45,1 %, 64,7 %, 13,7 % y 5,9 %, respectivamente.

(Tengo una configuración similar para un procesador STM32 diferente, pero también configuré con STM32CubeMX y compilé/ejecuté bajo OpenSTM32. Verifiqué la frecuencia y los cuatro ciclos de trabajo en un osciloscopio (dentro de la precisión de la medición).)

En su caso, suponiendo que la frecuencia APB1 es en realidad 28 MHz, un período de contador de 19 daría exactamente 1.4000000 MHz (28 MHz / 1/20), aunque si está utilizando el oscilador interno no se garantizan más de tres dígitos significativos (I Encontré que el mío estaba errado en aproximadamente un 0,37 %, dentro de la especificación del 1 %. Si establece el pulso PWM en 10, el ciclo de trabajo debería convertirse en 50,0%.

Muchas gracias por su ayuda. El problema es que actualmente la salida está atascada en "ALTO". Le vincularé algunas capturas de pantalla del proyecto Cube, tal vez pueda detectar mi error. imgur.com/a/HI9fI También agregué antes de "while(1)" en las siguientes líneas principales: HAL_TIM_Base_MspInit(&htim2); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
Olvidé mencionar que usé TIM2 esta vez, en el canal 2, que es el pin PA1, si importa.
Acabo de hacer una reconstrucción y ahora está funcionando. Gracias
@Cezar Chirila: debe configurar el "Período de contador" (tercera línea), no el preescalador, en 18. El preescalador (primera línea) debe permanecer en 0.
@Cezar Chirila: ¿Funcionó para "Counter Period" igual a 0, pero el prescaler diferente de cero?
Sí. Funcionó para un "Prescaler" igual a 0, y un "Counter period" de 18.
Necesito preguntar, ¿por qué tengo que modificar el "Contraperíodo". ¿No es 28MHz / 1 / 19 igual a 28MHz / 19 / 1?
@Cezar Chirila: si desea variar el ciclo de trabajo (de manera detallada), entonces debe ser "Prescaler" igual a 0 y un "Contador de período" de 18. De lo contrario, solo es posible un ciclo de trabajo PWM (50%?) - si funciona en absoluto.
Encontré algo interesante. No puedo generar la señal en TIM3 o TIM4. Solo en TIM2. Todo lo demás es igual, excepto que Clocksource Internal es una casilla de verificación (que marqué). Todo lo demás es lo mismo. He agregado las líneas: HAL_TIM_Base_MspInit(&htim3); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); HAL_TIM_Base_MspInit(&htim4); HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
No importa, tuve que reconstruirlo dos veces, extraño. Necesito configurar mejor mi banco de trabajo, en este momento solo lo construyo allí y cargo el contenedor a través de la utilidad ST-Link.