Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запись во FLASH. Что я делаю не так?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
zheka
Что-то не получается писать во FLASH контроллера STM32F103VGT6 - у него память 1 Мбайт.
Пишу, затем читаю - одни единицы в памяти.
Вот базовые функции
CODE
#define FLASH_KEY1 ((uint32_t)0x45670123)
#define FLASH_KEY2 ((uint32_t)0xCDEF89AB)
void flash_unlock(void) {
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;
}

void flash_lock() {
FLASH->CR |= FLASH_CR_LOCK;
}

//Функция возврщает true когда можно стирать или писать память.
uint8_t flash_ready(void) {
return !(FLASH->SR & FLASH_SR_BSY);
}

//Функция стирает ВСЕ страницы. При её вызове прошивка самоуничтожается
void flash_erase_all_pages(void) {
FLASH->CR |= FLASH_CR_MER; //Устанавливаем бит стирания ВСЕХ страниц
FLASH->CR |= FLASH_CR_STRT; //Начать стирание
while(!flash_ready()) // Ожидание готовности.. Хотя оно уже наверное ни к чему здесь...
;
FLASH->CR &= FLASH_CR_MER;
}

//Функция стирает одну страницу. В качестве адреса можно использовать любой
//принадлежащий диапазону адресов той странице которую нужно очистить.
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_write(uint32_t address,uint32_t data) {
FLASH->CR |= FLASH_CR_PG; //Разрешаем программирование флеша
while(!flash_ready()) //Ожидаем готовности флеша к записи
;
*(__IO uint16_t*)address = (uint16_t)data; //Пишем младшие 2 бата
while(!flash_ready())
;
address+=2;
data>>=16;
*(__IO uint16_t*)address = (uint16_t)data; //Пишем старшие 2 байта
while(!flash_ready())
;
FLASH->CR &= ~(FLASH_CR_PG); //Запрещаем программирование флеша
}


А вот как я с ними работаю - пытаюсь писать в 1023 страницу.
Код
page_address=FLASH_BASE+1023*1024;
flash_unlock();
flash_erase_page(page_address);
flash_write(page_address,0xABCDEF00);
flash_data=flash_read(page_address);
flash_lock();

Как уже писал выше - при чтении одни единицы..
Что я делаю не так?
kan35
Вижу одну ошибку: в девайсе 512 страниц по 2кб (а не 1024 по 1кб)
и уж извините, совет: посмотрите в standard peripherial library как сделаны процедуры
zheka
хм... не знал, что эти функции уже написаны в стандартной библиотеке. Запустил - работает.
Спасибо.
uriy
еще есть application note. Ключевые слова stm32 eeprom emulation.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.