{"record":{"id":"3fe2f9751b418eda","repo":"embassy-rs/embassy","slug":"bank-2-not-present","errorCode":null,"errorMessage":"Bank 2 not present","messagePattern":"Bank 2 not present","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"embassy-stm32/build.rs","lineNumber":544,"sourceCode":"\n        let mut bank_1_base = None;\n        let mut bank_2_base = None;\n        let mut otp_base = None;\n        for region in flash_memory_regions.iter() {\n            if region.name == \"BANK_1\" || region.name == \"BANK_1_REGION_1\" {\n                bank_1_base = Some(region.address);\n            } else if region.name == \"BANK_2\" || region.name == \"BANK_2_REGION_1\" {\n                bank_2_base = Some(region.address);\n            } else if region.name == \"OTP\" {\n                otp_base = Some(region.address);\n            }\n        }\n        let bank_1 = bank_1_base\n            .map(|a| quote!(#a))\n            .unwrap_or_else(|| quote!(panic!(\"Bank 1 not present\")));\n        let bank_2 = bank_2_base\n            .map(|a| quote!(#a))\n            .unwrap_or_else(|| quote!(panic!(\"Bank 2 not present\")));\n        let otp = otp_base\n            .map(|a| quote!(#a))\n            .unwrap_or_else(|| quote!(panic!(\"OTP not present\")));\n\n        let (swap_check, bank1, bank2) = if check_fb_mode {\n            (\n                quote! { let is_swapped = crate::pac::SYSCFG.memrmp().read().fb_mode(); },\n                quote! { if is_swapped { #bank_2 } else { #bank_1 } },\n                quote! { if is_swapped { #bank_1 } else { #bank_2 } },\n            )\n        } else {\n            (quote! {}, quote! { #bank_1 }, quote! { #bank_2 })\n        };\n\n        flash_regions.extend(quote! {\n            impl crate::flash::FlashBank {\n                /// Absolute base address.\n                pub fn base(&self) -> u32 {","sourceCodeStart":526,"sourceCodeEnd":562,"githubUrl":"https://github.com/embassy-rs/embassy/blob/463a07b963419a1bfe61d5d597c44acb810afb8b/embassy-stm32/build.rs#L526-L562","documentation":"Generated into embassy-stm32's flash driver: when the chip metadata has no second flash bank region, `bank_2` compiles to `panic!(\"Bank 2 not present\")`. It fires at runtime when code accesses flash bank 2 on a single-bank chip (or when bank swap mode is queried and the alternate bank is absent).","triggerScenarios":"Enabling dual-bank flash usage or flash bank swap (check_fb_mode / SYSCFG fb_mode path) on a chip that only has one flash bank, so any access to bank 2 hits the generated panic.","commonSituations":"Running single-bank parts (many F4/G0/G4/WB variants) with code written for dual-bank parts; setting the DUAL_BANK option bytes or reading `SYSCFG.MEMRMP.fb_mode` on single-bank parts.","solutions":["Use only bank 1 / single-bank flash APIs on single-bank parts.","Build for the correct chip feature that actually has two flash banks if dual-bank operation is required.","Remove dual-bank/swap logic (fb_mode checks) when targeting a single-bank device."],"exampleFix":"// before\nflash.write(FLASH_BANK2_BASE + addr, data);\n// after\n// single-bank chip: operate only via the default flash region\nflash.write(addr, data);","handlingStrategy":"validation","validationCode":"// runtime guard before dual-bank access\nif single_bank_chip() { /* restrict all writes to bank 1 region */ }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Gate dual-bank/swap code with cfg flags tied to the chip feature.","Never enable DUAL_BANK option bytes on single-bank parts.","Check SYSCFG fb_mode usage only on chips documented as dual-bank."],"tags":["flash","stm32","runtime-panic","single-bank"],"backgroundTag":"resource-not-found","analyzedSha":"463a07b963419a1bfe61d5d597c44acb810afb8b","analyzedAt":"2026-09-10T13:38:26.660Z","contentChangedAt":"2026-09-10T13:38:26.660Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}