реклама на сайте
подробности

 
 
> Запись во FLASH. Что я делаю не так?
zheka
сообщение Mar 1 2014, 09:41
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Что-то не получается писать во 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();

Как уже писал выше - при чтении одни единицы..
Что я делаю не так?

Сообщение отредактировал IgorKossak - Mar 3 2014, 11:23
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 21:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01355 секунд с 7
ELECTRONIX ©2004-2016