СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №8/2014
ЭЛЕМЕНТЫ И КОМПОНЕНТЫ 40 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 8 2014 Листинг // Подключение библиотек #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" // Объявление ключей разблокировки #define FLASH_KEY1 ((uint32_t)0x45670123) #define FLASH_KEY2 ((uint32_t)0xCDEF89AB) // Объявление номера страницы #define FLASH_PAGE ((uint8_t)0x7F) // Функция анализа готовности флэш-памяти uint8_t flash_ready(void) { return !(FLASH->SR & FLASH_SR_BSY); } // Функция стирания страницы флэш-памяти, // которой принадлежит определенный адрес void flash_erase_page(uint32_t address) { FLASH->CR|= FLASH_CR_PER; FLASH->AR = address; FLASH->CR|= FLASH_CR_STRT; while(!flash_ready()) {;} FLASH->CR&= ~FLASH_CR_PER; } // Функция разблокировки флэш-памяти void flash_unlock(void) { FLASH->KEYR = FLASH_KEY1; FLASH->KEYR = FLASH_KEY2; } // Функция блокировки флэш-памяти void flash_lock() { FLASH->CR |= FLASH_CR_LOCK; } // Функция записи 32-разрядного слова во флэш-память // по определенному адресу void flash_write(uint32_t address, uint32_t data) { FLASH->CR |= FLASH_CR_PG; while(!flash_ready()) {;} *(__IO uint16_t*)address = (uint16_t)data; while(!flash_ready()) {;} address+=2; data>>=16; *(__IO uint16_t*)address = (uint16_t)data; while(!flash_ready()) {;} FLASH->CR &= ~(FLASH_CR_PG); } // Функция чтения флэш-памяти uint32_t flash_read(uint32_t address) { return (*(__IO uint32_t*) address); } // Главный модуль программы int main(void) { uint32_t dwr=0x12345678; // Переменная для записи uint32_t drd=0x0; // Переменная для чтения // Стартовый адрес страницы uint32_t st_address = FLASH_BASE + FLASH_PAGE * 1024; flash_unlock(); // Разблокировать флэш-память flash_erase_page(st_address); // Стереть страницу flash_lock(); // Заблокировать флэш-память flash_unlock(); // Разблокировать флэш-память flash_write(st_address, dwr); // Записать данные flash_lock();// Заблокировать флэш-память drd=flash_read(st_address); // Читать данные while(1) { // место для других команд } } Регистр FLASH_SR содержит следую- щие специальные разряды: ● разряд 5 EOP (End of Operation) уста- навливается аппаратно при успеш- ном завершении операции записи или стирании флэш-памяти; ● разряд 4WRPRTERR (Write Protection Error) устанавливается при попытке программирования защищённой от записи области памяти; ● разряд 2 PGERR (Programming Error) устанавливается при программиро- вании, если данные по заданному адресу отличны от значения 0xFFFF, то есть не стёрты перед программи- рованием; ● разряд 0 BSY (Busy) устанавливает- ся во время операций записи и сти- рания флэш-памяти. Он аппаратно сбрасывается по окончании опера- ций записи или стирания, а также при возникновении ошибки во вре- мя этих операций. Все эти разряды сбрасываются запи- сью в них единичного значения. Регистр FLASH_CR имеет следующие разряды: ● разряд 12 EOPIE (End of Operation Interrupt Enable) разрешает генера- цию прерывания после завершения операции записи или стирания дан- ных во флэш-память; ● разряд 10 ERRIE (Error Interrupt Enable) разрешает генерацию преры- вания при возникновении ошибок, то есть при установке бита PGERR или WRPRTERR в регистре FLASH_SR; ● разряд 9 OPTWRE (Option Bytes Write Enable) разрешает программирова- ние опционных байт, устанавлива- ется записью последовательности ключей в регистр FLASH_OPTKEYR, а сбрасывается программно; ● разряд 7 LOCK блокирует запись и стирание флэш-памяти; ● разряд 6 STRT запускает процедуру стирания флэш-памяти; ● разряд 5 OPTER разрешает процеду- ру стирания опционных байт; ● разряд 4 OPTPG разрешает процедуру программирования опционных байт; ● разряд 2 MER (Mass Erase) разрешает процедуру полного стирания флэш- памяти; ● разряд 1 PER (Page Erase) разрешает процедуру стирания одной страни- цы флэш-памяти; ● разряд 0 PG (Programming) разрешает процедуру программирования флэш- памяти. Регистр FLASH_AR предназначен для задания адреса программируе- © СТА-ПРЕСС
RkJQdWJsaXNoZXIy MTQ4NjUy