How to implement 1MHz interrupt in PlatformIO / Arduino on STM32
In our previous post Minimal STM32 HardwareTimer PlatformIO / Arduino timer interrupt blink example we showed how to use HardwareTimer
to blink the onboard LED of our STM32F407 board using a timer interrupt.
In this post, we’ll provide an example of how to use HardwareTimer
and have a really fast interrupt which runs at 1 MHz - in other words: one million times per second.
#include <Arduino.h>
HardwareTimer timer(TIM1);
bool ledOn = false;
void OnTimer1Interrupt() {
ledOn = !ledOn;
digitalWrite(PC13, ledOn ? HIGH : LOW);
}
void setup() {
pinMode(PC13, OUTPUT);
// Configure timer
timer.setPrescaleFactor(21); // Set prescaler to 21 => timer frequency = 168/21 = 8 MHz (from prediv'd by 1 clocksource of 168 MHz)
timer.setOverflow(8); // Set ARR to 8 => timer frequency = 1 MHz
timer.attachInterrupt(OnTimer1Interrupt);
timer.refresh(); // Make register changes take effect
timer.resume(); // Start timre
}
void loop() {
}
Note that when running such a quick interrupt, you can’t do all too much within the interrupt before the next time the interrupt will run.