diff --git a/stmhal/mphal.c b/stmhal/mphal.c
index e8f242051e223d30cba2b30c654718870b9cd38d..7fcd982dcb8a3642c24b03411c3c9a4179a89e77 100644
--- a/stmhal/mphal.c
+++ b/stmhal/mphal.c
@@ -16,5 +16,5 @@ const byte mp_hal_status_to_errno_table[4] = {
 };
 
 NORETURN void mp_hal_raise(HAL_StatusTypeDef status) {
-    nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, (mp_obj_t)(mp_uint_t)mp_hal_status_to_errno_table[status]));
+    nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(mp_hal_status_to_errno_table[status])));
 }
diff --git a/tests/pyb/halerror.py b/tests/pyb/halerror.py
new file mode 100644
index 0000000000000000000000000000000000000000..1a6bce1a7ef9daed786d23dd0b7a7e8df834c554
--- /dev/null
+++ b/tests/pyb/halerror.py
@@ -0,0 +1,15 @@
+# test hal errors
+
+import pyb
+
+i2c = pyb.I2C(2, pyb.I2C.MASTER)
+try:
+    i2c.recv(1, 1)
+except OSError as e:
+    print(repr(e))
+
+can = pyb.CAN(1, pyb.CAN.NORMAL)
+try:
+    can.send('1', 1, timeout=50)
+except OSError as e:
+    print(repr(e))
diff --git a/tests/pyb/halerror.py.exp b/tests/pyb/halerror.py.exp
new file mode 100644
index 0000000000000000000000000000000000000000..09c9f7ad92f092daa62416bf6b08b7c4cafaaaca
--- /dev/null
+++ b/tests/pyb/halerror.py.exp
@@ -0,0 +1,2 @@
+OSError(5,)
+OSError(116,)