Lamentablemente no se que librerias posea. Pero si usas KEIL debes tener CMSIS a mano, con lo cual podrias cambiar los registros uno por uno.
Son unos cuantos para configurar el Systick, no es demasiado, tenes un 1 registro que es de configuracion, otro registro donde cargas el valor limite. y listo.
SYST_CSR - SysTick Control and Status Register.
SYST_RVR - SysTick Reload Value Register
SYST_CVR - SysTick Current Value Register
El systick es un contador decreciente, por lo cual vos vas a cargar un numero, y este va a ir restando por cada pulso de reloj le llegue. Una ves que este en 0x00000 y se reste 1 mas, Ocurre que solo el hardware toma el valor del registro RVR ( Reload ) y lo pone en el Current.
Muchas opciones para controlar el systick no tenes.
En el registro SYST_CSR tenes:
Bit 2: CLKSOURCE , Si es 0 utiliza algun reloj externo, si es 1 utiliza el mismo reloj del procesador
Bit 1: TICKINT, habilitacion de la interrupcion, obviamente luego hay que limpiar algun pendiente y habilitarlo desde el NVIC.
Bit 0: ENABLE, si pones un 1 el Systick comienza a funcionar.
Entonces supongamos que tenemos un reloj de 10Mhz, esto es un periodo de 1/10Mhz = 0.1us , o mejor dicho cada 0.1us el systick va a restar 1
Suponete que quisiera que la interrupcion ocurra cada 100ms, por lo tanto deberia contar X ciclos de reloj, esto es : 100ms / 0.1us = 1.000.000
Entonces en el registro RVR debo cargar ese valor menos 1 ( ya que el 0 cuenta ), Por lo tanto me quedaria:
SYST_RVR = 999999; // Cargo valor
SYST_CVR = 0; // Borro valor actual asi comienza de 0
SYST_CSR = 0b111; // Selecciono el clock a usar, activo interrupciones, y activo el systick
//Aca limpiar algun pendiente del systick y activar el NVIC
El valor de recarga ( RVR ) puede ser de 1 (0x1) a 16.777.215 (0xFFFFFF), observa que no son los 32 bits completos.
PD: Tal ves usen otros nombres.
Y no se si se puede utilizar esto:
(Creo que es parte del CMSIS, no me fije, pero podrias probar, agregando el correspondiente include y las rutas de include)
SysTick_Config(1000);
// Seteamos la prioridad a nuestra preferencia
NVIC_SetPriority(SysTick_IRQn,3);
// Limpiamos el interrupt
NVIC_ClearPendingIRQ(SysTick_IRQn);
// Habilitamos el IRQ
NVIC_EnableIRQ(SysTick_IRQn);
Algunos usan:
SysTick_Config(SystemCoreClock / 1000); // 1ms
Donde SystemCoreClock suele ser una constante, y tiene el valor de la frecuencia del clok de entrada al procesador, como esa frecuencia te va a dar 1 segundo, si lo divido por 1000 seria 1 ms.. O para que quede mas claro:
SysTick_Config(SystemCoreClock * 1*10^-3); // 1ms
SysTick_Config(SystemCoreClock * 1*10^-6); // 1us
SysTick_Config(SystemCoreClock * 1*10^-4); // 100us
Y si observas, 1*10^-3 segundos es 1ms, a la menos 6 es 1us.. y queda mas simple