88 lines
1.9 KiB
C++
88 lines
1.9 KiB
C++
|
#include "flash.h"
|
||
|
|
||
|
void flash_unlock(){
|
||
|
|
||
|
// Check if flash is locked
|
||
|
if(!(FLASH->CR & FLASH_CR_LOCK)) {
|
||
|
return; // Already unlocked
|
||
|
}
|
||
|
|
||
|
// Write flash key sequence to unlock
|
||
|
FLASH->KEYR = 0x45670123; // First key
|
||
|
FLASH->KEYR = 0xCDEF89AB; // Second key
|
||
|
|
||
|
}
|
||
|
|
||
|
void flash_lock() {
|
||
|
if(FLASH->CR & FLASH_CR_LOCK) {
|
||
|
return; // Already locked
|
||
|
}
|
||
|
FLASH->CR |= FLASH_CR_LOCK; // Lock flash memory
|
||
|
}
|
||
|
|
||
|
void erase_sector(uint8_t sector){
|
||
|
|
||
|
// Wait if flash is busy
|
||
|
while(FLASH_BUSY);
|
||
|
|
||
|
// Check if flash is locked and unlock if needed
|
||
|
if(FLASH->CR & FLASH_CR_LOCK) {
|
||
|
flash_unlock();
|
||
|
}
|
||
|
|
||
|
// Set sector erase bit and sector number
|
||
|
FLASH->CR |= FLASH_CR_SER;
|
||
|
FLASH->CR &= ~FLASH_CR_SNB;
|
||
|
FLASH->CR |= (sector << FLASH_CR_SNB_Pos) & FLASH_CR_SNB_Msk;
|
||
|
|
||
|
// Start erase
|
||
|
FLASH->CR |= FLASH_CR_STRT;
|
||
|
|
||
|
// Wait for erase to complete
|
||
|
while(FLASH_BUSY);
|
||
|
|
||
|
// Clear sector erase bit
|
||
|
FLASH->CR &= ~FLASH_CR_SER;
|
||
|
|
||
|
}
|
||
|
|
||
|
void flash_program_word(uint32_t address,uint32_t data,uint32_t byte_len){
|
||
|
|
||
|
// Wait if flash is busy
|
||
|
while(FLASH_BUSY);
|
||
|
// Check if flash is locked and unlock if needed
|
||
|
if(FLASH->CR & FLASH_CR_LOCK) {
|
||
|
flash_unlock();
|
||
|
}
|
||
|
|
||
|
// Set program bit 32bit programm size and Write data to address
|
||
|
if(byte_len == 1) {
|
||
|
FLASH_8BYTE;
|
||
|
FLASH->CR |= FLASH_CR_PG;
|
||
|
*(volatile uint8_t*)address = (uint8_t)data;
|
||
|
} else {
|
||
|
FLASH_32BYTE;
|
||
|
FLASH->CR |= FLASH_CR_PG;
|
||
|
*(volatile uint32_t*)address = data;
|
||
|
}
|
||
|
|
||
|
// Wait for programming to complete
|
||
|
while(FLASH_BUSY);
|
||
|
|
||
|
// Clear program bit
|
||
|
FLASH->CR &= ~FLASH_CR_PG;
|
||
|
|
||
|
}
|
||
|
|
||
|
uint8_t flash_read_word(uint32_t address){
|
||
|
|
||
|
// Check if address is valid
|
||
|
if(address < FLASH_BASE || address > FLASH_END) {
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// Read byte from flash memory
|
||
|
return *((volatile uint8_t*)address);
|
||
|
|
||
|
}
|
||
|
// Wait if flash
|