stm32 flash: check lock bit before unlocking
It hardfaults if already unlocked flash is unlocked again.
This commit is contained in:
parent
904f1cfc7a
commit
3616d68aaa
@ -19,8 +19,10 @@ pub(crate) unsafe fn lock() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) unsafe fn unlock() {
|
pub(crate) unsafe fn unlock() {
|
||||||
pac::FLASH.keyr().write(|w| w.set_fkeyr(0x4567_0123));
|
if pac::FLASH.cr().read().lock() {
|
||||||
pac::FLASH.keyr().write(|w| w.set_fkeyr(0xCDEF_89AB));
|
pac::FLASH.keyr().write(|w| w.set_fkeyr(0x4567_0123));
|
||||||
|
pac::FLASH.keyr().write(|w| w.set_fkeyr(0xCDEF_89AB));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) unsafe fn enable_blocking_write() {
|
pub(crate) unsafe fn enable_blocking_write() {
|
||||||
|
@ -19,8 +19,10 @@ pub(crate) unsafe fn lock() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) unsafe fn unlock() {
|
pub(crate) unsafe fn unlock() {
|
||||||
pac::FLASH.keyr().write(|w| w.set_fkeyr(0x4567_0123));
|
if pac::FLASH.cr().read().lock() {
|
||||||
pac::FLASH.keyr().write(|w| w.set_fkeyr(0xCDEF_89AB));
|
pac::FLASH.keyr().write(|w| w.set_fkeyr(0x4567_0123));
|
||||||
|
pac::FLASH.keyr().write(|w| w.set_fkeyr(0xCDEF_89AB));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) unsafe fn enable_blocking_write() {
|
pub(crate) unsafe fn enable_blocking_write() {
|
||||||
|
@ -228,8 +228,10 @@ pub(crate) unsafe fn lock() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) unsafe fn unlock() {
|
pub(crate) unsafe fn unlock() {
|
||||||
pac::FLASH.keyr().write(|w| w.set_key(0x45670123));
|
if pac::FLASH.cr().read().lock() {
|
||||||
pac::FLASH.keyr().write(|w| w.set_key(0xCDEF89AB));
|
pac::FLASH.keyr().write(|w| w.set_key(0x45670123));
|
||||||
|
pac::FLASH.keyr().write(|w| w.set_key(0xCDEF89AB));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) unsafe fn enable_write() {
|
pub(crate) unsafe fn enable_write() {
|
||||||
|
@ -19,8 +19,10 @@ pub(crate) unsafe fn lock() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) unsafe fn unlock() {
|
pub(crate) unsafe fn unlock() {
|
||||||
pac::FLASH.keyr().write(|w| w.set_key(0x4567_0123));
|
if pac::FLASH.cr().read().lock() {
|
||||||
pac::FLASH.keyr().write(|w| w.set_key(0xCDEF_89AB));
|
pac::FLASH.keyr().write(|w| w.set_key(0x4567_0123));
|
||||||
|
pac::FLASH.keyr().write(|w| w.set_key(0xCDEF_89AB));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) unsafe fn enable_blocking_write() {
|
pub(crate) unsafe fn enable_blocking_write() {
|
||||||
|
@ -24,8 +24,10 @@ pub(crate) unsafe fn unlock() {
|
|||||||
while pac::FLASH.sr().read().bsy() {}
|
while pac::FLASH.sr().read().bsy() {}
|
||||||
|
|
||||||
// Unlock flash
|
// Unlock flash
|
||||||
pac::FLASH.keyr().write(|w| w.set_keyr(0x4567_0123));
|
if pac::FLASH.cr().read().lock() {
|
||||||
pac::FLASH.keyr().write(|w| w.set_keyr(0xCDEF_89AB));
|
pac::FLASH.keyr().write(|w| w.set_keyr(0x4567_0123));
|
||||||
|
pac::FLASH.keyr().write(|w| w.set_keyr(0xCDEF_89AB));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) unsafe fn enable_blocking_write() {
|
pub(crate) unsafe fn enable_blocking_write() {
|
||||||
|
@ -26,11 +26,15 @@ pub(crate) unsafe fn lock() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) unsafe fn unlock() {
|
pub(crate) unsafe fn unlock() {
|
||||||
pac::FLASH.bank(0).keyr().write(|w| w.set_keyr(0x4567_0123));
|
if pac::FLASH.bank(0).cr().read().lock() {
|
||||||
pac::FLASH.bank(0).keyr().write(|w| w.set_keyr(0xCDEF_89AB));
|
pac::FLASH.bank(0).keyr().write(|w| w.set_keyr(0x4567_0123));
|
||||||
|
pac::FLASH.bank(0).keyr().write(|w| w.set_keyr(0xCDEF_89AB));
|
||||||
|
}
|
||||||
if is_dual_bank() {
|
if is_dual_bank() {
|
||||||
pac::FLASH.bank(1).keyr().write(|w| w.set_keyr(0x4567_0123));
|
if pac::FLASH.bank(1).cr().read().lock() {
|
||||||
pac::FLASH.bank(1).keyr().write(|w| w.set_keyr(0xCDEF_89AB));
|
pac::FLASH.bank(1).keyr().write(|w| w.set_keyr(0x4567_0123));
|
||||||
|
pac::FLASH.bank(1).keyr().write(|w| w.set_keyr(0xCDEF_89AB));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,17 +28,23 @@ pub(crate) unsafe fn lock() {
|
|||||||
pub(crate) unsafe fn unlock() {
|
pub(crate) unsafe fn unlock() {
|
||||||
#[cfg(any(flash_wl, flash_wb, flash_l4))]
|
#[cfg(any(flash_wl, flash_wb, flash_l4))]
|
||||||
{
|
{
|
||||||
pac::FLASH.keyr().write(|w| w.set_keyr(0x4567_0123));
|
if pac::FLASH.cr().read().lock() {
|
||||||
pac::FLASH.keyr().write(|w| w.set_keyr(0xCDEF_89AB));
|
pac::FLASH.keyr().write(|w| w.set_keyr(0x4567_0123));
|
||||||
|
pac::FLASH.keyr().write(|w| w.set_keyr(0xCDEF_89AB));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(flash_l0, flash_l1))]
|
#[cfg(any(flash_l0, flash_l1))]
|
||||||
{
|
{
|
||||||
pac::FLASH.pekeyr().write(|w| w.set_pekeyr(0x89ABCDEF));
|
if pac::FLASH.pecr().read().pelock() {
|
||||||
pac::FLASH.pekeyr().write(|w| w.set_pekeyr(0x02030405));
|
pac::FLASH.pekeyr().write(|w| w.set_pekeyr(0x89ABCDEF));
|
||||||
|
pac::FLASH.pekeyr().write(|w| w.set_pekeyr(0x02030405));
|
||||||
|
}
|
||||||
|
|
||||||
pac::FLASH.prgkeyr().write(|w| w.set_prgkeyr(0x8C9DAEBF));
|
if pac::FLASH.pecr().read().prglock() {
|
||||||
pac::FLASH.prgkeyr().write(|w| w.set_prgkeyr(0x13141516));
|
pac::FLASH.prgkeyr().write(|w| w.set_prgkeyr(0x8C9DAEBF));
|
||||||
|
pac::FLASH.prgkeyr().write(|w| w.set_prgkeyr(0x13141516));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user