PageSourceSearch

https://meshtastic.org/assets/js/232232b1.4850ce26.js

js meshtastic.org collected 2026-09-24 08:46:46 UTC 9,526 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkmeshtastic=self.webpackChunkmeshtastic||[]).push([["31955"],{88710(e,t,r){r.r(t),r.d(t,{metadata:()=>n,default:()=>m,frontMatter:()=>a,contentTitle:()=>d,toc:()=>c,assets:()=>l});var n=JSON.parse('{"id":"getting-started/flashing-firmware/stm32/removing-readout-protection","title":"Removing STM32 Readout Protection","description":"Clear flash readout protection (RDP level 1) on an STM32WL device so Meshtastic firmware can be flashed.","source":"@site/versioned_docs/version-2.7/getting-started/flashing-firmware/stm32/removing-readout-protection.mdx","sourceDirName":"getting-started/flashing-firmware/stm32","slug":"/getting-started/flashing-firmware/stm32/removing-readout-protection","permalink":"/docs/2.7/getting-started/flashing-firmware/stm32/removing-readout-protection","draft":false,"unlisted":false,"tags":[],"version":"2.7","lastUpdatedBy":"rcarteraz","sidebarPosition":4,"frontMatter":{"id":"removing-readout-protection","title":"Removing STM32 Readout Protection","sidebar_label":"Removing Readout Protection","sidebar_position":4,"description":"Clear flash readout protection (RDP level 1) on an STM32WL device so Meshtastic firmware can be flashed."},"sidebar":"Sidebar","previous":{"title":"Flashing over SWD","permalink":"/docs/2.7/getting-started/flashing-firmware/stm32/flashing-over-swd"},"next":{"title":"Initial Configuration","permalink":"/docs/2.7/getting-started/initial-config"}}'),o=r(91987),i=r(67008),s=r(87622);let a={id:"removing-readout-protection",title:"Removing STM32 Readout Protection",sidebar_label:"Removing Readout Protection",sidebar_position:4,description:"Clear flash readout protection (RDP level 1) on an STM32WL device so Meshtastic firmware can be flashed."},d,l={},c=[{value:"GUI \u2014 STM32CubeProgrammer",id:"gui--stm32cubeprogrammer",level:2},{value:"CLI \u2014 STM32CubeProgrammer",id:"cli--stm32cubeprogrammer",level:2}];function h(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(t.p,{children:["Some boards, such as the Wio-E5, ship with flash readout protection (RDP level 1)\nenabled.\n",(0,o.jsx)(t.a,{href:"https://www.st.com/en/development-tools/stm32cubeprog.html",children:"STM32CubeProgrammer"}),"\nconnects but cannot read, verify, or write flash. Removing the protection clears\nit but erases the whole chip, including the factory firmware."]}),"\n",(0,o.jsx)(t.admonition,{type:"warning",children:(0,o.jsxs)(t.p,{children:["Removing RDP mass-erases the chip and resets the ",(0,o.jsx)(s.A,{term:"MCU",definition:"The microcontroller that runs the firmware on a device. The hardware tables list the MCU for each supported board.",routePath:"/docs/terms/",children:"MCU"}),". On a board whose BOOT0 pin\nis not reachable, such as the Wio-E5, remove RDP\n",(0,o.jsx)(t.a,{href:"/docs/2.7/getting-started/flashing-firmware/stm32/flashing-over-swd",children:"over SWD"}),",\nconnecting ",(0,o.jsx)(t.strong,{children:"under reset"})," (",(0,o.jsx)(t.code,{children:"mode=UR"}),", or ",(0,o.jsx)(t.strong,{children:"Connect Under Reset"})," in the GUI) so\nthe programmer keeps control after the erase. With the firmware erased and no\nBOOT0 pin, nothing can re-enter the ROM bootloader for a ",(0,o.jsx)(s.A,{term:"UART",definition:"A serial interface used to communicate with a device over its pins or through a USB-to-serial bridge.",routePath:"/docs/terms/",children:"UART"})," connection."]})}),"\n",(0,o.jsx)(t.h2,{id:"gui--stm32cubeprogrammer",children:"GUI \u2014 STM32CubeProgrammer"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["Connect over ",(0,o.jsx)(s.A,{term:"SWD",definition:"A two-pin debug and programming interface, used on STM32 devices to enter bootloader mode and flash firmware.",routePath:"/docs/terms/",children:"SWD"})," with ",(0,o.jsx)(t.strong,{children:"Connect Under Reset"}),". Only on a board that exposes\nBOOT0 can you instead connect over ",(0,o.jsx)(s.A,{term:"UART",definition:"A serial interface used to communicate with a device over its pins or through a USB-to-serial bridge.",routePath:"/docs/terms/",children:"UART"})," with the board in the\n",(0,o.jsx)(t.a,{href:"/docs/2.7/getting-started/flashing-firmware/stm32/entering-bootloader-mode",children:"ROM bootloader"}),"."]}),"\n",(0,o.jsxs)(t.li,{children:["Choose ",(0,o.jsxs)(t.strong,{children:["Read Unprotect (",(0,o.jsx)(s.A,{term:"MCU",definition:"The microcontroller that runs the firmware on a device. The hardware tables list the MCU for each supported board.",routePath:"/docs/terms/",children:"MCU"}),")"]})," from the target menu."]}),"\n",(0,o.jsx)(t.li,{children:"Wait for the mass erase to finish, then reconnect."}),"\n",(0,o.jsxs)(t.li,{children:["Flash the Meshtastic firmware as de
1scribed in\n",(0,o.jsx)(t.a,{href:"/docs/2.7/getting-started/flashing-firmware/stm32/flashing-over-swd",children:"Flashing over SWD"}),",\nor ",(0,o.jsx)(t.a,{href:"/docs/2.7/getting-started/flashing-firmware/stm32/flashing-over-uart",children:"Flashing over UART"}),"\nafter re-entering the ROM bootloader with BOOT0."]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"cli--stm32cubeprogrammer",children:"CLI \u2014 STM32CubeProgrammer"}),"\n",(0,o.jsxs)(t.p,{children:["STM32CubeProgrammer's ",(0,o.jsx)(t.code,{children:"-rdu"})," (read unprotect) removes RDP and mass-erases the\nchip. Over ",(0,o.jsx)(s.A,{term:"SWD",definition:"A two-pin debug and programming interface, used on STM32 devices to enter bootloader mode and flash firmware.",routePath:"/docs/terms/",children:"SWD"}),", connecting under reset:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-shell",children:"STM32_Programmer_CLI -c port=SWD mode=UR -rdu\n"})}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"mode=UR"})," needs the programmer's nRST line wired to the board; see\n",(0,o.jsx)(t.a,{href:"/docs/2.7/getting-started/flashing-firmware/stm32/flashing-over-swd",children:"Flashing over SWD"}),"\nfor the ",(0,o.jsx)(t.code,{children:"mode=HOTPLUG"})," fallback. On a board that exposes BOOT0, you can instead\nrun ",(0,o.jsx)(t.code,{children:"-rdu"})," over the ",(0,o.jsx)(s.A,{term:"UART",definition:"A serial interface used to communicate with a device over its pins or through a USB-to-serial bridge.",routePath:"/docs/terms/",children:"UART"})," bootloader, then use BOOT0 to re-enter the bootloader\nand flash firmware:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-shell",children:"STM32_Programmer_CLI -c port=/dev/ttyUSB0 br=115200 -rdu\n"})})]})}function m(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},67008(e,t,r){r.d(t,{R:()=>s,x:()=>a});var n=r(71763);let o={},i=n.createContext(o);function s(e){let t=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(i.Provider,{value:t},e.children)}},87622(e,t,r){r.d(t,{A:()=>s});var n=r(71763),o=r(37773),i=r(91987);function s({term:e,definition:t,abbreviation:r,routePath:a="/glossary",children:d}
1){let[l,c]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,g]=(0,n.useState)("top"),f=(0,n.useRef)(null),p=(0,n.useRef)(null),v=(0,n.useCallback)(()=>{let e;if(!f.current||!p.current)return;let t=f.current.getBoundingClientRect(),r=p.current.getBoundingClientRect(),n=window.innerWidth,o=window.innerHeight,i=document.querySelector(".navbar"),s=i?i.getBoundingClientRect().bottom:0,a=t.top-s>=r.height+8,d=o-t.bottom>=r.height+8,l=a||!d?"top":"bottom";e="top"===l?t.top-r.height-8:t.bottom+8;let c=t.left+t.width/2-r.width/2;c=Math.max(8,Math.min(c,n-r.width-8)),g(l),m({top:Math.max(s+4,e),left:c})},[]);(0,n.useEffect)(()=>{let e;if(!l)return;let t=requestAnimationFrame(()=>{e=requestAnimationFrame(()=>{v()})}),r=()=>v(),n=()=>v();return window.addEventListener("scroll",r,!0),window.addEventListener("resize",n),()=>{cancelAnimationFrame(t),e&&cancelAnimationFrame(e),window.removeEventListener("scroll",r,!0),window.removeEventListener("resize",n)}},[l,v]);let w=(0,o.P_)("docusaurus-plugin-glossary"),b=(0,n.useMemo)(()=>{if(t&&"string"==typeof t&&t.length>0)return t;let r=(w&&w.terms||[]).find(t=>"string"==typeof t.term&&t.term.toLowerCase()===String(e).toLowerCase());return r&&r.definition?r.definition:void 0},[t,w,e]),x=(0,n.useMemo)(()=>{let t=r;if(!t){let r=(w&&w.terms||[]).find(t=>"string"==typeof t.term&&t.term.toLowerCase()===String(e).toLowerCase());t=r&&r.abbreviation}if("string"!=typeof t)return;let n=t.trim();if(n&&n.toLowerCase()!==String(e).toLowerCase())return n},[r,w,e]),j=(0,n.useMemo)(()=>a&&"string"==typeof a&&a.length>0?a:w&&w.routePath||"/glossary",[w,a]),R=d||e,M=e.toLowerCase().replace(/\s+/g,"-");return(0,i.jsxs)("span",{ref:f,className:"glossaryTermWrapper_ud7W",children:[(0,i.jsx)("a",{href:`${j}#${M}`,className:"glossaryTerm_x2nJ",onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),onFocus:()=>c(!0),onBlur:()=>c(!1),"aria-describedby":`tooltip-${M}`,children:R}),b&&(0,i.jsxs)("span",{ref:p,id:`tooltip-${M}`,className:`tooltip_WjgA ${l?"tooltipVisible_AjfD":""} ${"top"===u?"tooltipTop_uMN4":"tooltipBottom_U9P5"} tooltipFloating_nLk7`,role:"tooltip",style:l&&h?{top:`${h.top}px`,left:`${h.left}px`}:void 0,children:[(0,i.jsx)("strong",{children:e}),x?` (${x}). `:"",b]})]})}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.