Skip to main content
Associate II
January 4, 2024
Solved

HAL_GetTick() freezes and stops to update

During the debugging, I noticed HAL_GetTick() freezes, I mean uwTick does not update anymore and holds the same value.

 

This issue is happening while the TIM15_IRQHandler is called and executes a function responsible for reading from an SPI communication, it is shown below:

 

 

uint8_t canSpi_readAdresss(spi_SlaveInterface* spi, uint8_t adress, uint8_t* rxData, uint8_t rxBytes)
{
	uint8_t rxArray[2 + rxBytes];
	uint64_t timeout = HAL_GetTick() + 5;
	while (timeout > HAL_GetTick())
	{
		if (spi->master->activSlave == NULL)
		{
			uint8_t msgData[2];
			msgData[0] = 0b00000011; // read
			msgData[1] = adress;
			if (spi_TransmitReceive_(spi, msgData, 2, rxArray, rxBytes) == 0)
			{
				for (uint8_t i = 0; i < rxBytes; ++i)
				{
					rxData[i] = rxArray[2 + i];
				}
				return 0;
			}
			else
			{
				//rxData = 0;
			}
		}
	}
	return 0xff;
}

 

 

The HAL_GetTick()  holds the same value, therefore the execution gets stuck in the while-loop. It can happen just after the debugging starts or any time later.

The Tick priority uwTickPrio is 0 "zero", always.

 

Below is an image from the code execution shown in Parallel Stacks:
image.png

As it is the first time I am facing this kind of issue, I am a bit confused about what might be causing it.
Any help would be highly appreciated. 
 
The settings are:
MCU: STM32F303VE
Microsoft Visual Studio Professional 2019 - Version 16.11.30
VisualGDB Version 5.6R9


    This topic has been closed for replies.
    TDK
    TDKBest answer
    January 4, 2024
    	uint8_t NVIC_IRQChannelPreemptionPriority = 1;
    	uint8_t NVIC_IRQChannelSubPriority = 1;

    The typical configuration has 4 bits for preemption priority and 0 for subpriority. Have you changed the NVIC priority grouping?

    If you show the contents of the relevant NVIC registers, surely the issue will be apparent.

    "If you feel a post has answered your question, please click ""Accept as Solution""."

    4 replies

    KnarfB
    Super User
    January 4, 2024

    Timer tick prio must be higher (lower number) than TIM15_IRQHandler prio to increment the tick value within the handler.

    hth

    KnarfB

    GComesAuthor
    Associate II
    January 4, 2024

    Hi @KnarfB , thanks for the answer.

    I forgot to mention, the uwTickPrio is lower than TIM15_IRQHandler, which is 1

    Here is the function to set the TIM15 

     

    void EnableTimerInterruptTim15()
    {
    	uint8_t NVIC_IRQChannel = TIM15_IRQn;
    	uint8_t NVIC_IRQChannelPreemptionPriority = 1;
    	uint8_t NVIC_IRQChannelSubPriority = 1;
    	FunctionalState NVIC_IRQChannelCmd = ENABLE;
    	
    	uint32_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F;
     
    	/* Check the parameters */
    	assert_param(IS_FUNCTIONAL_STATE(NVIC_IRQChannelCmd));
    	assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_IRQChannelPreemptionPriority)); 
    	assert_param(IS_NVIC_SUB_PRIORITY(> NVIC_IRQChannelSubPriority));
     
    	if (NVIC_IRQChannelCmd != DISABLE)
    	{
    		/* Compute the Corresponding IRQ Priority --------------------------------*/ 
    		tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700)) >> 0x08;
    		tmppre = (0x4 - tmppriority);
    		tmpsub = tmpsub >> tmppriority;
    
    		tmppriority = (uint32_t)NVIC_IRQChannelPreemptionPriority << tmppre;
    		tmppriority |= NVIC_IRQChannelSubPriority & tmpsub;
    		tmppriority = tmppriority << 0x04;
     
    		NVIC->IP[NVIC_IRQChannel] = tmppriority;
     
    		/* Enable the Selected IRQ Channels --------------------------------------*/
    		NVIC->ISER[NVIC_IRQChannel >> 0x05] =
    		 (uint32_t)0x01 << (NVIC_IRQChannel & (uint8_t)0x1F);
    	}
    	else
    	{
    		/* Disable the Selected IRQ Channels -------------------------------------*/
    		NVIC->ICER[NVIC_IRQChannel >> 0x05] =
    		 (uint32_t)0x01 << (NVIC_IRQChannel & (uint8_t)0x1F);
    	}
    }

     

    Thank you!


    TDK
    TDKBest answer
    January 4, 2024
    	uint8_t NVIC_IRQChannelPreemptionPriority = 1;
    	uint8_t NVIC_IRQChannelSubPriority = 1;

    The typical configuration has 4 bits for preemption priority and 0 for subpriority. Have you changed the NVIC priority grouping?

    If you show the contents of the relevant NVIC registers, surely the issue will be apparent.

    "If you feel a post has answered your question, please click ""Accept as Solution""."
    KnarfB
    Super User
    January 4, 2024

    In addidtion to @TDK :

    compare your code to (or better use directly) CMSIS NVIC functions.

    See https://arm-software.github.io/CMSIS_5/Core/html/group__NVIC__gr.html

    and your local CMSIS installation like Drivers/CMSIS/Core/Include/core_cm*.h

    hth

    KnarfB