#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