I am working with the stm32f4-discovery development board and I need to share timer 3 for two purposes:
1. Regular timer that can be scheduled with 1 ms accuracy:
scheduleTimer3(uint16_t delayMs, EventCallback_t callback)
This is easy to implement, I have set the prescalar (TIM3->PSC) so that the timer increments every 1 ms and then I set TIM3->CCR1 to the desired delayMs. TIM3->ARR is set to 0xFFFF which means the biggest delay I can accomplish is 65535 ms and that's fine.
2. A square wave with frequency of roughly 60 Hz (55 - 64 Hz is fine) on the pin connected to timer 3 channel 2. This is also fairly easy to achieve by itself, I just use PWM and set TIM3->ARR to 1000/60 = 16 and TIM3->CCR2 = TIM3->ARR/2.
But how can I do both 1 and 2 at the same time? The problem with this approach is that they require different TIM3->ARR values at the same time. Of course, I can use the lower TIM3-ARR value and then increment a counter in interrupts and only call the callback when a number of interrupts has occurred, but it seems inefficient. Surely there must be a better way to do this. Can someone please help me?