Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cómo se calcula el tiempo de retraso de la función Delay() en stm32?

¿Cómo se calcula el tiempo de retraso de la función Delay() en stm32?

Las funciones de retardo se utilizan a menudo en el proceso de programación de microcontroladores. Las más utilizadas son retardo de microsegundos delay_us(

) y milisegundos de retardo_ms(

). 1. El método de retardo ordinario es relativamente simple. Permite que el microcontrolador realice un trabajo insignificante para pasar el tiempo. A menudo se implementa mediante bucles, pero aún requiere mucho esfuerzo para hacerlo más preciso. El siguiente código se encontró en línea y se probó el retraso para que sea más preciso. //Función de retardo aproximado, microsegundos

void delay_us(u16 time)

{

u16 i=0;

while (time --)

{

i=10; //defínelo tú mismo

while(i--) ;

}

}

//Retraso de nivel de milisegundos

void delay_ms(u16 time)

{

u16 i =0;

mientras(tiempo--)

{

i=12000; //definirlo usted mismo

mientras( i --) ;

}

}2.Retraso del temporizador SysTick El procesador del núcleo CM3 contiene un temporizador SysTick

, SysTick es de 24 bits. Temporizador de cuenta atrás. Cuando cuente hasta 0, recargará automáticamente el valor de tiempo inicial del registro RELOAD. Mientras su bit de habilitación en el registro de control y estado de SysTick

no se borre, nunca se detendrá. SysTick se presenta muy brevemente en el manual de referencia de STM32

. Para una introducción detallada, consulte la "Guía autorizada de Cortex-M3".

También hay dos formas de implementar esto: a. Método de interrupción

De la siguiente manera, defina el tiempo de retardo time_delay, SysTick_Config() define el período de tiempo de interrupción y disminuye time_delay en el interrupción, logrando así el Retraso.

volatile unsigned long time_delay; //

Tiempo de retraso, tenga en cuenta que está definido como una variable global

//Delay n_ms

void delay_ms(nms largos volátiles sin signo)

{

//División de frecuencia SYSTICK--interrupción del reloj del sistema de 1 ms

if (SysTick_Config(SystemFrequency/1000) )

{

while (1);

}

time_delay=nms;//Leer tiempo de sincronización

while(time_delay);

SysTick->CTRL=0x00; //Cerrar el contador

SysTick->VAL =0X00 //Borrar el contador

}

//Delay nus

void delay_us(volatile unsigned long nus)

{

//SYSTICK división de frecuencia- - 1us interrupción del reloj del sistema

if (SysTick_Config(SystemFrequency/1000000))

{

mientras (1);

}

time_delay=nus;//Leer el tiempo

while(time_delay);

SysTick->CTRL=0x00 //Cerrar el contador

SysTick->VAL =0X00; //Borrar el contador

} //Disminuir time_delay en la interrupción. Implementar retraso void

SysTick_Handler(void)

{

if(time_delay)

time_delay--;