diff --git a/tools/mpy-tool.py b/tools/mpy-tool.py
index bfb2a5da7970f6d1c0f5079744e5f2fa585535f7..bc8ac4fbd391cd66bfade21ba936b980d404be3c 100755
--- a/tools/mpy-tool.py
+++ b/tools/mpy-tool.py
@@ -320,6 +320,9 @@ class RawCode:
                 print('STATIC const mp_obj_float_t %s = {{&mp_type_float}, %.16g};'
                     % (obj_name, obj))
                 print('#endif')
+            elif type(obj) is complex:
+                print('STATIC const mp_obj_complex_t %s = {{&mp_type_complex}, %.16g, %.16g};'
+                    % (obj_name, obj.real, obj.imag))
             else:
                 # TODO
                 raise FreezeError(self, 'freezing of object %r is not implemented' % (obj,))
@@ -485,6 +488,15 @@ def freeze_mpy(base_qstrs, raw_codes):
     print('#endif')
     print()
 
+    print('#if MICROPY_PY_BUILTINS_COMPLEX')
+    print('typedef struct _mp_obj_complex_t {')
+    print('    mp_obj_base_t base;')
+    print('    mp_float_t real;')
+    print('    mp_float_t imag;')
+    print('} mp_obj_complex_t;')
+    print('#endif')
+    print()
+
     print('enum {')
     for i in range(len(new)):
         if i == 0: