EDITAR: debido a la baja precisión del HSI - 0.1%, el reloj debe cambiarse a HSE.
Estoy haciendo todo esto en cubeMX, por lo que no escribiré los bits, puede encontrarlos en el manual de referencia - enlace
Después de un poco de experimentación me di cuenta. Para simplificar, escribiré todo el proceso de configuración de 2 contadores para medir la frecuencia directamente.
Primero el contador principal, tomemos TIM1:
- Ajuste el reloj a ETR2
- Establezca el disparador en ITRx, puede encontrar el correcto consultando la conexión interna del disparador TIMx, por ejemplo. Si desea que TIM1 sea el contador principal, puede activarlo con TIM15 seleccionando ITR0.
- Habilite un canal de captura de entrada activado por TRC, esto registrará el conteo de pulsos después de cada puerta
- Ahora las cosas clásicas del temporizador: establezca el Periodo del contador (carga automática) en 0xffff máx. para TIM1
Y esa es la configuración del contador principal. Ahora para el temporizador de activación, tomemos TIM15:
- Establezca la fuente del reloj en interna
- Establezca una salida para comparar la salida en el canal 1 (cualquier canal funcionará)
Ajustes de parámetros:
- En la salida de activación, seleccione Comparar pulso (OC1) como evento de activación
- Y establezca el preescalador apropiado, el período de contador y (pulso? no estoy seguro si es necesario). P.ej. para 1s, con reloj de 72MHz, elegí 7199 para el prescaler y 9999 para el período del contador
- El modo de comparación de salida debe estar en modo congelado
Eso es toda la configuración hecha. Después de generar el proyecto, no olvides iniciar todos los temporizadores, por ejemplo,
HAL_TIM_Base_Start(&htim1);
HAL_TIM_IC_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_Base_Start(&htim15);
HAL_TIM_OC_Start(&htim15, TIM_CHANNEL_1);
Y la frecuencia se puede leer en la unidad de comparación de captura,
frequency= __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_1);
Esto es, por supuesto, asumiendo que el tiempo de puerta es 1s.