Se necesita un consejo n00b. Estoy tratando de encontrar el mejor método para retrasar una operación de valor relativamente pequeño (10-5000 microsegundos) sin ralentizar el ciclo de ejecución principal. Supongo que estoy malinterpretando algo. Mi enfoque hasta ahora ha sido el siguiente:
Núcleo de 216 MHz (F767)
- Cree TIM2 con Prescaler = 0 y 216 * 10 ^ 6 período / ARR para obtener un contador de alta resolución.
- La interrupción recibe un evento de señal externa (120 Hz).
- Realice cualquier GPIO y tiempo dentro del controlador de interrupciones (también se intentó lanzar un temporizador y hacerlo allí; no hace una diferencia).
Debido a que necesito demoras de resolución de microsegundos, estoy haciendo algo como:
startTime = __HAL_TIM_GetCounter(&htim2);
while(GetMicros(__HAL_TIM_GetCounter(&htim2) - startTime) < delayMicros);
uint32_t GetMicros(uint32_t counterValue)
{
return counterValue / (108 / 1000 / 1000); // (216 MHz with APB2/2 = 108)
}
Pero lo que he notado es que cuanto mayor es la demora, más se ralentiza el bucle while
de mi programa (el LED parpadea mucho más lento cuanto más larga es la demora):
while(1){
HAL_Delay(50);
HAL_GPIO_TogglePin(GPIOB, Green_Pin);
}
¿Hay una mejor estructura para realizar demoras precisas? ¿O estoy haciendo algo realmente simple, realmente mal?