You know that the maximal tick rate in ESP-IDF is 1000Hz.
This is ok for almost applications and if you require sub-milli time precision, the extra timer or interrupt would be your friend.
But why can't be 2000Hz tick rate set on 240Mz CPU?
Here is a famous LED blinker example with 500Hz blinks:
void app_main()
{
gpio_set_direction(GPIO_NUM_2, GPIO_MODE_OUTPUT);
int level = 0;
while (true) {
gpio_set_level(GPIO_NUM_2, level);
level = !level;
vTaskDelay(1 / portTICK_PERIOD_MS);
}
}
.
If you like 1kHz blinks, you need 0.5ms delay instead of 1ms delay.
Here is a hack for this.
diff --git a/components/freertos/include/freertos/xtensa_timer.h b/components/freertos/include/freertos/xtensa_timer.h
index 9bb8648..5c810a3 100644
--- a/components/freertos/include/freertos/xtensa_timer.h
+++ b/components/freertos/include/freertos/xtensa_timer.h
@@ -147,7 +147,7 @@ editing this here or in xtensa_rtos.h, or compiling with xt-xcc option
Derivation of clock divisor for timer tick and interrupt (one per tick).
*/
#ifdef XT_CLOCK_FREQ
-#define XT_TICK_DIVISOR (XT_CLOCK_FREQ / XT_TICK_PER_SEC)
+#define XT_TICK_DIVISOR (XT_CLOCK_FREQ / XT_TICK_PER_SEC / 2)
#endif
#ifndef __ASSEMBLER__
.
i.e. fakes 120MHz CPU for freertos :-)
It gives 1000Hz square wave on GPIO2 for the above blinker code snippet:
All my more complex applications have worked without problem on this hack. Looks ESP-IDF system itself doesn't depend on port tick constraints. It's expected and fine.
I don't think this hack is the right thing to do. Last resort, though.
Happy Hacking!