Red de conocimiento informático - Problemas con los teléfonos móviles - En STM32, ¿cómo se calcula el tiempo de retardo específico de systick?

En STM32, ¿cómo se calcula el tiempo de retardo específico de systick?

Jajaja, tienes mucha suerte. Acabo de investigarlo. Si crees que es bueno, dale una buena reseña.

/********** ******* ******************************************* ******** **********

* Programa experimental del temporizador de tic del sistema SysTick del microcontrolador STM32

*

*

*

************************************ ******* *************************************/

#ifndef _SYSTICK_H

#define _SYSTICK_H

#include "SysTick.h"

#define SYSTICK_CSR (*((volatile unsigned long *) 0xE000E010) )//Registro de control

#define SYSTICK_LOAD (*((volatile unsigned long *) 0xE000E014))//Recargar registro

#define SYSTICK_VAL (*((volatile unsigned long *) 0xE000E018))//Registro de valor actual

#define SYSTICK_CALRB (*((volatile unsigned long *) 0xE000E01C)) //Registro de valor de calibración

unsigned long SysTick_Delay;//Variable global

/ /Registro de configuración

void SysTick_InitStructReadCmd(void)

{

SYSTICK_VAL = 0 //Borrar el registro de valor actual<; /p>

SYSTICK_LOAD = SystemCoreClock / 1000000; //La parte importante está aquí System 72000000 / 100000

SYSTICK_CSR |= 0x06; //Apaga SysTick primero y luego enciéndelo cuando lo uses

}

//Rutina de servicio de interrupción

void SysTick_Hangler(void)

{

SYSTICK_VAL = 0; //Borrar el registro de valor actual

if(SysTick_Delay != 0x00)//Determinar si el retraso SysTick_Delay es igual a 0

{

SysTick_Delay-- ;//Reducir a 0 y finalizar

}

}

//Función de retardo

void Delay_10us(unsigned long Countlinef)

{

SYSTICK_CSR |= 0x07; //Iniciar SysTick enable

SysTick_Delay = Countlinef //Asigna la variable de retraso a la variable global SysTick_Delay

while(SysTick_Delay != 0); // Juzga si el tiempo de retardo ha terminado

SYSTICK_CSR |= 0x06 //Apaga SysTick cuando se acabe el tiempo y habilítalo

}

i

nt main(void)

{

SystemInit(); //Tenga en cuenta que esto inicializa el reloj del sistema a una frecuencia de 72 M, lo cual es necesario

SysTick_InitStructReadCmd() ;

mientras(1)

{

GPIOD->BSRR = 0x00000100;

Delay_10us(1000000) ; / /Lograr 1ms retraso

GPIOD->BRR = 0x00000100;

}

}

//====== ==== =========================FIN===================== ==== ======================//

/* Bien, comencemos a explicar cómo se implementa el programa 1us. La fuente de reloj utilizada. es el reloj APB y la frecuencia del sistema APB está configurada como 72 MHZ

SYSTICK_LOAD = SystemCoreClock / 1000000 La parte importante del valor inicial de recarga de SysTick está aquí

1: SystemCoreClock Esto es ¿Qué significa? La función de la biblioteca de seguimiento se encuentra de la siguiente manera:

#ifdef SYSCLK_FREQ_HSE

uint32_t SystemCoreClock = SYSCLK_FREQ_HSE

#elif definido SYSCLK_FREQ_24MHz

uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz

#elif definió SYSCLK_FREQ_36MHz

uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz

#elif definió SYSCLK_FREQ_48MHz

uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz

#elif definió SYSCLK_FREQ_56MHz

uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz

#elif definió SYSCLK_FREQ_72MHz

uint32_t SystemCoreClock = SYSCLK_F REQ_72MHz ;

#else /*!< HSI seleccionado como fuente del reloj del sistema */

// uint32_t SystemCoreClock = HSI_VALUE

/*No es difícil; vea aquí que inicializamos SystemInit(); No es difícil entender que el sistema ha configurado SystemCoreClock en 72M

Primero echemos un vistazo a la fórmula de cálculo: T = TICKS * (1/f). ;

T: es el tiempo total a cronometrar.

TICKS: Es el parámetro de entrada de SYSTICK_LOAD.

(1/f) es el ciclo de reloj de la fuente de reloj, f es la frecuencia de reloj de la fuente de reloj

La fuente de reloj es el reloj AHB y la frecuencia está configurada como 72M;

Asigne el registro de recarga SYSTICK_LOAD a SystemCoreClock / 1000000; jajaja a todos

Lo que encontré es 72000000 / 1000000 = 72; > Después de una interrupción, todos verán que (1/f) es el tiempo del ciclo del reloj. 1/72M = 0.138888888888888888888888888889;

1 nosotros nació, 0.1388888888888888888888888888888889*72 = 1; 1 nosotros jajaja todos entienden.

// El problema con los datos de incendios forestales es ticks = SystemFrequency / 10 000 = 720, lo que equivale a: 72000000 / 10000; aquí falta un 0. El resultado es igual a = 7200. no es igual a 720. Se enreda ver los datos jajaja.

Este programa me torturó durante una semana. No comí ni dormí bien. Tan pronto como lo descubrí, inmediatamente tomé notas y las compartí con todos.

*/