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.
*/