2020-04-09 04:50 PM
Hello,
In my application there is an external interrupt configurations:
RCC_ClocksTypeDef RCC_Clocks;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource15);
EXTI_InitStruct.EXTI_Line = EXTI_Line15;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
EXTI_InitStruct.EXTI_Line = EXTI_Line14;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource13);
EXTI_InitStruct.EXTI_Line = EXTI_Line13;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
// Initialize NVIC for EXTI15_10 IRQ channel
NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);
EXTI_InitStruct.EXTI_Line = EXTI_Line8;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
RCC_GetClocksFreq(&RCC_Clocks);
SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
NVIC_SetPriority(SysTick_IRQn, 0x00);
and also I am using Timer2 to delay and Here is my delay configurations:
void delay_start(void)
{
TIM_TimeBaseInitTypeDef TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);
TimeBaseStructure.TIM_Prescaler = (RCC_Clocks.SYSCLK_Frequency>>0)/1000000L ;
TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TimeBaseStructure.TIM_Period = 1000 - 1;
TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TimeBaseStructure.TIM_RepetitionCounter = 0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInit(TIM2, &TimeBaseStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
counter_micros = 0;
counter_millis = 0;
TIM_SetCounter(TIM2, 0);
countdown_millis = 0;
TIM_Cmd(TIM2, ENABLE);
}
Of course there is a TIM2_Handler:
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update ) == SET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
if(countdown_millis > 0)
{
countdown_millis--;
}
counter_micros += 1000;
counter_millis += 1;
}
}
My issue is when I try to run this code, program stucks on delay function. If I remove this line SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
Program runs without an issue and I do not why. Is there any one who can explain why the program stucks in delay function?
2020-04-10 07:12 AM
> stucks on delay function
What delay function? What does it mean it stuck there - single-step in disasm and observe the related registers.
> If I remove this line SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
What does this line do, exactly, what's the change in the registers it is related to? Again, you can single-step it, the "libraries" are open-source.
JW