# Problem Look at the `SysTick_Handler` that sequences the notes. How does it work? Use the debugger as needed to investigate. # Process [(1)](https://community.st.com/t5/stm32-mcus-embedded-software/systick-handler-and-rtos/td-p/212299) The ARM-Cortex system timer is called SysTick. The STM32Cube Hardware Abstraction Layer (HAL) is built around this as a timebase source. The unmodified `SysTick_Handler` function simply calls `HAL_IncTick()`. There are some modifications to this code, though, which make the `SysTick_Handler` perform two additional functions: 1. Apply an effect to the music called vibrato. 2. Drives the animation of the seven-segment display. The function increments the `COUNT` and `Vibrato_Count` variables. The `COUNT` variable increases the length of a ... The function checks if 40 milliseconds have passed by comparing the number of milliseconds since the last check against `Vibrato_Rate`. The index of the current `Music` struct is stored in the variable `INDEX`, and so references it with `Song[INDEX]`. It applies vibrato by changing the pitch (adjusting the `note` member of the current `Music` struct) with the value of `Vibrato_Depth`. The function then checks if the seven-segment display animation is enabled with the `Animate_On` variable. If it is, it checks if 200 milliseconds have passed by comparing the number of milliseconds since the last check against `Delay_msec`. There's a pointer, `Message_Pointer`, which points to a character stored in the `Message` array. It calls the function `Seven_Segment_Digit` to automatically set each character of the display to one from the `Message` array. It gets the correct character by adding an offset to the current address of `Message_Pointer`. It then increments `Message_Pointer` and sets it back to its original address if it goes past the bounds of the `Message` array. Finally, it runs `HAL_IncTick()`. # Answer ...