Editando
C10 - Finite State Machine
(sección)
Ir a la navegación
Ir a la búsqueda
Advertencia:
no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si
inicias sesión
o
creas una cuenta
, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.
Comprobación antispam. ¡
No
rellenes esto!
= Accurate Time Delays Using SysTick = <br> El temporizador SysTick funciona de la siguiente manera: *Se coloca el numero de ciclos de reloj que se quieren dejar pasar (hacer el delay) en el registro <b>RELOAD</b> *Cada ciclo de reloj se resta un bit al número introducido en <b>RELOAD</b> *Cuando se pasa del numero 1 al numero 0 el bit 16 del registro <b>CTRL</b> se pone en 1. Esto nos indica que el contador ha llegado a su fin <br> Delay<br> *Por lo visto como funciona el SysTick timer podemos utilizarlo para crear una función delay precisa *Cada iteración de Systick tarda 1 ciclo de reloj Ej: Si el bus del sistema va a 80Mhz<br> <math>80Mhz \Rightarrow \frac {1}{80Mhz} = 12.5 ns</math> por operación<br> <br> *Sabiendo lo que tarda cada iteración podemos calcular cuantas iteraciones son necesarias para tener un delay de Xms Ej: Si queremos calcular un delay de 10ms. n es el número que pondremos en el registro <b>RELOAD</b><br> <math>10ms = 12ns * n \Rightarrow n = \frac {10ms}{12ns} = 800000</math><br> <br> Ej código: #define NVIC_ST_CTRL_R (*((volatile unsigned long *)0xE000E010)) //Registro CTRL #define NVIC_ST_RELOAD_R (*((volatile unsigned long *)0xE000E014)) //Registro RELOAD #define NVIC_ST_CURRENT_R (*((volatile unsigned long *)0xE000E018)) //Registro CURRENT void SysTick_Init(void){ NVIC_ST_CTRL_R = 0; // disable SysTick during setup NVIC_ST_CTRL_R = 0x00000005; // enable SysTick with core clock } // The delay parameter is in units of the 80 MHz core clock. (12.5 ns) void SysTick_Wait(unsigned long delay){ NVIC_ST_RELOAD_R = delay-1; // se resta 1 a delay porque la cuenta la haria de 8000000 a 0 que son 800001 veces NVIC_ST_CURRENT_R = 0; // any value written to CURRENT clears while((NVIC_ST_CTRL_R&0x00010000)==0){ // esperamos a que el bit 16 de CTRL pase a 1 } } <br> *Como el SysTick timer solo admite un numero de 24 bits, por lo tanto como máximo se puede hacer un delay de 200ms *Para poder hacer un delay más grande se puede usar un bucle que vaya llamando a SysTick cada Xms *En el ejemplo de abajo se ve como se crea un bucle que llama las veces que queramos a la función SysTick_Wait10ms que tarda 10ms en acabarse. Por lo tanto si queremos un delay de 100ms tenemos que llamar a la función 10 veces<br> // 800000*12.5ns equals 10ms void SysTick_Wait10ms(unsigned long delay){ unsigned long i; for(i=0; i<delay; i++){ SysTick_Wait(800000); // wait 10ms } } <br> En la siguiente imagen se puede ver una máquina de estados finita de las dos funciones:<br> [[File: edx-fsm-systick-delay.png|400px]]<br> <br>
Resumen:
Ten en cuenta que todas las contribuciones a Proyectos se consideran publicadas bajo la Creative Commons Atribución-CompartirIgual (véase
Proyectos:Derechos de autor
para más información). Si no deseas que las modifiquen sin limitaciones y las distribuyan libremente, no las publiques aquí.
Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre.
¡No uses textos con copyright sin permiso!
Cancelar
Ayuda de edición
(se abre en una ventana nueva)
Menú de navegación
Herramientas personales
No has accedido
Discusión
Contribuciones
Crear una cuenta
Acceder
Espacios de nombres
Página
Discusión
español
Vistas
Leer
Editar
Ver historial
Más
Buscar
Navegación
Página principal
Cambios recientes
Página aleatoria
Ayuda sobre MediaWiki
Páginas especiales
Herramientas
Lo que enlaza aquí
Cambios relacionados
Información de la página