×

Внимание

Форум находится в режиме только для чтения.

эмуляция eeprom в stm32

11 года 6 мес. назад - 11 года 6 мес. назад #4435 от Kerensky
Kerensky ответил в теме Re: эмуляция eeprom в stm32
#include "stm32f10x.h"

#define FLASH_KEY1 ((uint32_t)0x45670123) // ключи для снятия защиты памяти
#define FLASH_KEY2 ((uint32_t)0xCDEF89AB)
#define FLASH_PAGE_SIZE ((uint16_t)0x400) // размер страницы 1 кб
#define WRITE_START_ADDR ((uint32_t)0x08003800) // запись с 15го килобайта


//
стирание

void Erase_flash (u16 adr)
{
u16 dst = WRITE_START_ADDR + adr; // вычисление места записи

FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;

FLASH->CR |= FLASH_CR_PER; /* Page erase */
FLASH->AR = dst;
FLASH->CR|= FLASH_CR_STRT; /* Start erase */
while ((FLASH->SR & FLASH_SR_BSY) != 0 ); /* Wait end of eraze */
FLASH->CR &= ~FLASH_CR_PER; /* Page erase end */

FLASH->CR |= FLASH_CR_LOCK; /* Lock the flash back */
}

//
запись

void Write_flash (u16 Data, u16 adr)
{
u16 dst = WRITE_START_ADDR + adr;

FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;

FLASH->CR |= FLASH_CR_PG;
while ((FLASH->SR & FLASH_SR_BSY) != 0 );
*(__IO uint16_t*)dst = (uint16_t)Data;
while ((FLASH->SR & FLASH_SR_BSY) != 0 );
FLASH->CR &= ~FLASH_CR_PG;

FLASH->CR |= FLASH_CR_LOCK; /* Lock the flash back */
}

//
чтение

u16 Read_flash (u16 adr)
{
u16 dst = WRITE_START_ADDR + adr;
u16 a;
a = *(__IO uint16_t*) dst;
return a;
}

//

весь код взят из оф доков (программинг мануал), Денис Ягов помог разобраться.
все работает, проверенно не раз
использую для записи данных файловой системы внешней памяти.

Из опыта:
1. одна ячейка занимает 1 килобайт, т.е. во время стирания при указании любого адреса из этого килобайта, он сотрет весь диапазон.
2. на серии F100 нашел глюк с плохим переключением адресов при стирании - если стирать подряд два разных адреса, он сотрет два раза первый. Пока решил проблему тем что использую только 1 ячейку, т.е. еепром в 1 кб. На мк из серии F400 такого не наблюдал
3. следует принять во внимание что у всего МК единое адресное пространство, и что оперативка, регистр и флеш отличаються только адресом и защитой
4. WRITE_START_ADDR следует выбирать из расчета размера программы, что бы не стереть ее кусок при работе, т.к. прошивка пишеться в эту же флеш только начиная с адреса 0x08008000
5. И последний прикол - при работе с мк STM32F100C4T6, у кот 16 кб памяти, у меня получилось работать с памятью дальше этого размара, т.е. с 29,30,31 и 32 килобайтом, без последствый. Пока еще эксперементирую с этим, но есть мысль что мк, как и проци для компов, могут делаться по одному тех процессу, а после изготовления автомат отбраковывает мк у кот не работает то или другое и в зависимости от того что осталось ставит нужную маркировку. Но это только догадка...
11 года 6 мес. назад #4438 от LineAir
LineAir ответил в теме Re: эмуляция eeprom в stm32

наверное в ицфнике както ограничить обьем исользуемой ияром памяти что то исправить?


define symbol __ICFEDIT_region_ROM_end__   = 0x080FFFFF;
В этом месте "урежьте" конец флеша, а сами используейте последнюю страницу флеша контроллера и тогда программа не "налезет" на пользовательскую страницу
11 года 6 мес. назад #4445 от super_puper
super_puper ответил в теме Re: эмуляция eeprom в stm32
обязательно от HSI так тироваться? или можно от HSE?
11 года 6 мес. назад #4446 от LineAir
LineAir ответил в теме Re: эмуляция eeprom в stm32
Для работы с флеш без разницы. При тактировании от HSE на разных частотах разная задержка доступа к памяти (от 0 до 24МГц - 0такт., 24-48 1такт, 48-72 2такта, точно не помню). Но это CMCIS библиотека сама инициализирует вроде.
11 года 6 мес. назад #4451 от super_puper
super_puper ответил в теме Re: эмуляция eeprom в stm32
спасибо большое, но у меня вылетает в бесконечное прерывание проц(
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

частота 72 мегагерца от HSE кварца 25мег 
флэш с двумя пропусками настроенна:
/* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);




вот так в майне запись делаю:
Erase_flash (1);
  Write_flash (3030, 1);


вот так ограничил память программ
define symbol __ICFEDIT_region_ROM_end__   = 0x08003000;//было 0x080FFFFF

но виснет! что делать?(
11 года 6 мес. назад #4452 от LineAir
LineAir ответил в теме Re: эмуляция eeprom в stm32
А как вы получили 72МГц от кварца в 25? Умножитель частоты имеет вроде только целые коэффициенты. От 25 можно получить максимум 50МГц, ну или 75 на крайняк.
Время создания страницы: 0.045 секунд
Работает на Kunena форум