Здравствуйте. Микросхема STM32f103VG из линейки HD имеет 1Мгб флеш памяти (в даташите показано что она поделена на 2 банка по 512 килобайт).
Не получается разместить данный по настройке прибора в конце флеша, тоесть в конец второго банка. Хочу хранить эти данные начиная с 1022-го килобайта флеша (адрес 0x080FF800).
размещать данные не далеко от начала флеша - получается нормально.
например в 127-ом байте флеша (адресс 0x0801FC00) данный коректно записываются, обновляются и код раотает правильно. В проекте много картинок, поэтому возникает такая необходимость.
код:
Код:
|
#define FLASH_KEY1 ((uint32_t)0x45670123)
#define FLASH_KEY2 ((uint32_t)0xCDEF89AB)
#define Page_1022 0x080FF800 // по адрусу 0x0801FC00 код размещается без проблем, к примеру
void Write(void)
{
uint16_t len = 20;
uint32_t flash_p;
flash_p = Page_1022;
//----------------------------------------------------------------------------------------------------------------------
/* Authorize the FPEC Access */
FLASH-›KEYR = FLASH_KEY1; // снимаем блокировку
FLASH-›KEYR = FLASH_KEY2;
//FLASH_Erase Page
while((FLASH-›SR&FLASH_SR_BSY));
FLASH-›CR |= FLASH_CR_PER; // Устанавливаем бит стирания одной страницы
FLASH-›AR = (uint32_t)Page_1022; // Задаем её адрес (стирается 1022й байт)
FLASH-›CR |= FLASH_CR_STRT; // Запускаем стирание
while((FLASH-›SR&FLASH_SR_BSY));
FLASH-›CR &= ~FLASH_CR_PER; // востанавливаем бит стирания одной страници в исходное состояние
//----------------------------------------------------------------------------------------------------------------------
//FLASH_Program HalfWord
FLASH-›CR |= FLASH_CR_PG;
for(uint32_t i=0; i‹len; i++) {
while((FLASH-›SR&FLASH_SR_BSY));
*(__IO uint16_t*)flash_p = (uint16_t)0xA5; flash_p+=2;
}
while((FLASH-›SR&FLASH_SR_BSY));
FLASH-›CR &= ~FLASH_CR_PG;
FLASH-›CR |= FLASH_CR_LOCK; // устанавливаем блокировку
} |
Итак c Page_1022 = 0x0801FC00 работает без проблем, но затирает мне картинки в программе.
значение Page_1022 = 0x080FF800 просто не записываются в флеш.
Кто нибудь делал подобное?