2020-12-14 01:00 AM
Hello,
I'm encouring one problem with STM32F405 interrupts.
I'm working on a project that using a MCU STM32F405,
I have created a CubeMx Projet, set all the clock (input frequency, Sysclck, APB1, ...), set timer2, CAN2 and UART2. I have set enable TIM2 global interrupt in TIM2 Configuration and also Set enable USART2 global interrupt in NVIC Settings tab.
I use VsCode to code and debug in the STM32F405. My program seems to work perfectly, I can blink some Led. But usart, can and timer interrupt don't fire!
Breakpoint in SysTick_Handler works, so it seems that interrupt works, but breakpoints in timer never fire.
I think that may be the debugger have trouble, so I have tried to blink a led with the timer and of course that doesn't work.
In the past I had used CubMx and STM32 MCU for other project without trouble about interrupts.
Thanks
2020-12-14 03:52 AM
I forgot to mention that I using STM32CubeMX 4.25.1 on Win10.
Could you please help me to get interrupt works.
2020-12-14 04:33 AM
Check the vector table and linkage to your routines.
If using .CPP files or C++ remember that it mangles names and breaks C linkage.
Review .MAP and disassemblies.
2020-12-14 06:52 AM
Hi Clive,
Thanks to take time to answer to my question.
Flash is at common addres for a STM32F4:
FLASH starts at 0x8000000, which include interrupt?
.MAP Address seems to be ok, but I really don't know if it is good address, I'm not used to modify or check this kind of file
.text.SysTick_Handler
0x08000d2c 0xc build/stm32f4xx_it.o
0x08000d2c SysTick_Handler
.text.TIM2_IRQHandler
0x08000d38 0x10 build/stm32f4xx_it.o
0x08000d38 TIM2_IRQHandler
.text.USART2_IRQHandler
0x08000d48 0x10 build/stm32f4xx_it.o
0x08000d48 USART2_IRQHandler
Everything looks good but interrupt is not firing (exept systick irq)
2020-12-14 09:07 AM
The vector table is a list of 32-bit addresses and takes up the first few hundreds of bytes of the image at 0x08000000
You need to confirm the entries of interest (the interrupts you're firing) go to the routines you expect.
You'll then want to confirm the interrupt is enabled in the NVIC, and within the peripherals. You'll want to dump out or inspect all registers in the chain, end-to-end.
You want to determine if the routines are entered/exited, you can use breakpoints, or preferably GPIO you can set high/low and scope.
If you don't properly clear/service an enabled interrupt, you'll get a storm, and it will keep entering over and over. ie you enable USART TXE, and don't give it any data.