Skip to content

fix stm32h5 hard fault when reading UID with ICACHE enabled#3593

Merged
hathach merged 1 commit intomasterfrom
worktree-fix-stm32h5-uid-icache
Apr 10, 2026
Merged

fix stm32h5 hard fault when reading UID with ICACHE enabled#3593
hathach merged 1 commit intomasterfrom
worktree-fix-stm32h5-uid-icache

Conversation

@hathach
Copy link
Copy Markdown
Owner

@hathach hathach commented Apr 10, 2026

Summary

  • On STM32H5, reading UID_BASE with ICACHE enabled causes a hard fault (ST errata)
  • Cache the unique ID at the very start of board_init(), before any user code can enable ICACHE
  • board_get_unique_id() now returns the cached copy instead of reading UID_BASE directly

Closes: #3588

Test plan

  • Builds cleanly for stm32h563nucleo (cdc_msc example)
  • Verify on STM32H5 hardware with ICACHE enabled that USB serial number works without hard fault

🤖 Generated with Claude Code

On STM32H5, reading UID_BASE with ICACHE enabled causes a hard fault
(ST errata). Cache the unique ID at the very start of board_init(),
before any user code has a chance to enable ICACHE.

Closes: #3588

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings April 10, 2026 09:41
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes an STM32H5 errata-triggered hard fault by avoiding UID_BASE reads after the instruction cache may be enabled, by caching the UID early during board initialization and returning the cached value thereafter.

Changes:

  • Add a static cached_uid buffer to store the STM32H5 UID.
  • Populate cached_uid at the very start of board_init().
  • Update board_get_unique_id() to return the cached UID instead of reading UID_BASE.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@github-actions
Copy link
Copy Markdown

Size Difference Report

Because TinyUSB code size varies by port and configuration, the metrics below represent the averaged totals across all example builds.

Note: If there is no change, only one value is shown.

Changes >1% in size

No entries.

Changes <1% in size

No entries.

No changes
file .text .rodata .data .bss size % diff
audio_device.c 2897 0 1260 1627 4518 +0.0%
cdc_device.c 1252 16 1106 684 1935 +0.0%
cdc_host.c 6381 487 15 985 7579 +0.0%
dcd_ch32_usbfs.c 1473 0 0 2444 3917 +0.0%
dcd_ch32_usbhs.c 1469 0 0 448 1917 +0.0%
dcd_ci_fs.c 1925 0 0 1290 3215 +0.0%
dcd_ci_hs.c 1759 0 0 1344 2538 +0.0%
dcd_da146xx.c 3067 0 0 144 3211 +0.0%
dcd_dwc2.c 4210 25 0 265 4500 +0.0%
dcd_eptri.c 2271 0 0 259 2530 +0.0%
dcd_ft9xx.c 3276 0 0 172 3448 +0.0%
dcd_khci.c 1953 0 0 1290 3243 +0.0%
dcd_lpc17_40.c 1474 0 0 648 1798 +0.0%
dcd_lpc_ip3511.c 1463 0 0 264 1683 +0.0%
dcd_mm32f327x_otg.c 1478 0 0 1290 2768 +0.0%
dcd_msp430x5xx.c 1798 0 0 176 1974 +0.0%
dcd_musb.c 2445 0 0 160 2605 +0.0%
dcd_nrf5x.c 2918 0 0 292 3210 +0.0%
dcd_nuc120.c 1094 0 0 78 1172 +0.0%
dcd_nuc121.c 1168 0 0 101 1269 +0.0%
dcd_nuc505.c 0 0 1531 157 1688 +0.0%
dcd_rp2040.c 838 0 764 655 2257 +0.0%
dcd_rusb2.c 2919 0 0 156 3075 +0.0%
dcd_samd.c 1034 0 0 266 1300 +0.0%
dcd_samg.c 1320 0 0 72 1392 +0.0%
dcd_stm32_fsdev.c 2558 0 0 291 2849 +0.0%
dfu_device.c 777 28 712 140 916 +0.0%
dfu_rt_device.c 157 0 134 0 157 +0.0%
dwc2_common.c 602 30 0 0 618 +0.0%
ecm_rndis_device.c 1037 0 1 2858 3896 +0.0%
ehci.c 2763 0 0 6043 7597 +0.0%
fsdev_common.c 180 0 0 0 180 +0.0%
hcd_ch32_usbfs.c 2485 0 0 498 2983 +0.0%
hcd_ci_hs.c 184 0 0 0 184 +0.0%
hcd_dwc2.c 4994 33 1 513 5540 +0.0%
hcd_khci.c 2442 0 0 449 2891 +0.0%
hcd_musb.c 3073 0 0 157 3230 +0.0%
hcd_pio_usb.c 262 0 240 0 502 +0.0%
hcd_rp2040.c 2000 17 4 321 2342 +0.0%
hcd_rusb2.c 2923 0 0 245 3168 +0.0%
hcd_samd.c 2220 0 0 324 2544 +0.0%
hcd_stm32_fsdev.c 3287 0 1 420 3708 +0.0%
hid_device.c 1125 44 997 119 1244 +0.0%
hid_host.c 1240 0 0 1251 2491 +0.0%
hub.c 1384 8 8 30 1418 +0.0%
midi_device.c 1151 0 1007 623 1772 +0.0%
midi_host.c 1341 7 7 3635 4979 +0.0%
msc_device.c 2525 108 2286 547 3071 +0.0%
msc_host.c 1587 0 0 394 1982 +0.0%
mtp_device.c 1696 22 735 588 2292 +0.0%
ncm_device.c 1538 28 718 5843 7395 +0.0%
ohci.c 1940 0 0 2414 4353 +0.0%
printer_device.c 830 0 706 566 1394 +0.0%
rp2040_usb.c 382 35 625 11 1053 +0.0%
rusb2_common.c 160 0 16 0 176 +0.0%
tusb.c 451 0 383 3 453 +0.0%
tusb_fifo.c 846 0 480 0 841 +0.0%
typec_stm32.c 820 8 2 12 842 +0.0%
usbc.c 420 2 20 166 608 +0.0%
usbd.c 3224 57 88 275 3564 +0.0%
usbd_control.c 538 0 484 79 616 +0.0%
usbh.c 4652 55 99 1034 5807 +0.0%
usbtmc_device.c 2196 24 68 316 2544 +0.0%
vendor_device.c 641 0 534 565 1204 +0.0%
video_device.c 4443 5 1235 479 4914 +0.0%
TOTAL 118956 1039 16267 46476 167060 +0.0%

@github-actions
Copy link
Copy Markdown

MemBrowse Memory Report

Top 10 targets by memory change (%) (out of 2156 targets) View Project Dashboard →

target .text .rodata .data .bss total % diff
stm32h503nucleo/board_test 9,048 → 9,076 (+28) 344 → 356 (+12) 14,852 → 14,896 (+44) +0.3%
stm32h503nucleo/dfu_runtime 13,668 → 13,692 (+24) 720 → 732 (+12) 20,136 → 20,176 (+40) +0.2%
stm32h503nucleo/hid_multiple_interface 15,396 → 15,420 (+24) 800 → 812 (+12) 21,944 → 21,984 (+40) +0.2%
stm32h503nucleo/hid_boot_interface 15,452 → 15,476 (+24) 800 → 812 (+12) 21,956 → 21,996 (+40) +0.2%
stm32h503nucleo/midi_test 15,772 → 15,796 (+24) 920 → 932 (+12) 22,360 → 22,400 (+40) +0.2%
stm32h503nucleo/cdc_dual_ports 16,396 → 16,420 (+24) 1,104 → 1,116 (+12) 23,420 → 23,460 (+40) +0.2%
stm32h503nucleo/printer_to_cdc 16,632 → 16,656 (+24) 1,084 → 1,096 (+12) 23,436 → 23,476 (+40) +0.2%
stm32h503nucleo/audio_test 16,828 → 16,852 (+24) 1,300 → 1,312 (+12) 23,772 → 23,812 (+40) +0.2%
stm32h503nucleo/dfu 16,948 → 16,972 (+24) 1,068 → 1,080 (+12) 24,060 → 24,100 (+40) +0.2%
stm32h503nucleo/hid_controller 21,040 → 21,068 (+28) 1,784 → 1,796 (+12) 28,868 → 28,912 (+44) +0.2%

@hathach hathach merged commit 470715a into master Apr 10, 2026
318 checks passed
@hathach hathach deleted the worktree-fix-stm32h5-uid-icache branch April 10, 2026 10:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants