diff --git a/.gitignore b/.gitignore
index 7ca9401ea28a47e1b80f555fb902d358728fc8bc..1c25d3a0ae2a3c116a097855f681b805294ee1e7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@ __pycache__/
 .*.swp
 *~
 compile_commands.json
+/tags
diff --git a/tools/generate-tags.sh b/tools/generate-tags.sh
new file mode 100755
index 0000000000000000000000000000000000000000..a8347caa85f1cf51b44703966e5fe3ed1bfd1eba
--- /dev/null
+++ b/tools/generate-tags.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+set -e
+
+source_dir="$(dirname "$0")/.."
+
+find "$source_dir" -name '*.[ch]' \
+    | grep -v "$source_dir/lib/sdk/Libraries/FreeRTOS" \
+    | grep -v "$source_dir/lib/FreeRTOS-Plus" \
+    | grep -v "$source_dir/lib/micropython/micropython/ports" \
+    | grep -v "$source_dir/lib/micropython/micropython/lib/cmsis" \
+    | grep -v "$source_dir/hw-tests/upy-minimal" \
+    | xargs -d\\n ctags