AnsweredAssumed Answered

SysTick , I dont understand whats happening.

Question asked by Scott Dev on Sep 11, 2017
Latest reply on Sep 11, 2017 by Vangelis Fortounas

Hi,

   I am still working my way through the STM32 , and decided to  move away from CubeMX, to use the registers.  I have started by writing the following just to get the systick to work. Im not really interested on the time span, just want to see the interupt working. I have done the following, and wondering if anyone can tell me whats happening? I simply setup ticker interupt, and setup a delay. The delay should exit when count down to 0, but for some reason the Delay function never exits. I am using Keil and step through the Delay function and see it count down..

 

I am initialising the systick, and initialising the Load register.

I then simply create a Delay(x) routine to continue to check the variable to see if reached 0.

 

Many Thanks

Scott

 

#include "stm32l073xx.h"
#include "header.h"

 

uint32_t TimeDelay=0;

 

int main(void)
{
    SysTick_Initialize(100); // << init Load and set interupt
    Delay(5);  //<<do a simple countdown. In here  is the issue
   return 0;
}

void SysTick_Initialize(uint32_t ticks)
{
    SysTick->CTRL=0;
    SysTick->LOAD=ticks-1;
    
    NVIC_SetPriority(SysTick_IRQn,(1UL<<__NVIC_PRIO_BITS)-1UL);
    
    SysTick->VAL=0;
    SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
    SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;    
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;    
}

 

void SysTick_Handler(void)
{
    if(TimeDelay>0) //simply count down
        TimeDelay--; //just to test I have setup the interupt okay
}

 

void Delay(uint32_t nTime)
{
    TimeDelay=nTime;
    while(TimeDelay !=0) //<<< this loop never breaks out..  The variable does count down to 0.
     ;
    
}

Outcomes