Easyelectronics.ru

Электроника для всех
Текущее время: 05 июн 2020, 15:47

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 14:02 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
Контролер STM32F303.
Раньше я пользовался EEPROM emulation.
Библиотека от ST которая емулирует EEPROM. В принципе работает хорошо нет нареканий. Но сейчас хотят отказаться от этого метода и писать напрямую во флеш. Писать надо параметры упакованные в структуру. Что вы посоветуете. У меня в этом опыта нету.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 14:07 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
jenya77 писал(а):
и писать напрямую во флеш. Что вы посоветуете.

Писать во флеш напрямую :) Это не тяжело.
Хотите конкретных ответов - задавайте конкретные вопросы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 14:09 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2870
А до этого вы куда писали?)) В EEPROM?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 14:10 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
alexsam писал(а):
jenya77 писал(а):
и писать напрямую во флеш. Что вы посоветуете.

Писать во флеш напрямую :) Это не тяжело.
Хотите конкретных ответов - задавайте конкретные вопросы.

а как записать структуру во флеш напрямую?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 14:11 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
Hold писал(а):
А до этого вы куда писали?)) В EEPROM?

до этого библиотека писала за меня :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 14:13 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
jenya77 писал(а):
alexsam писал(а):
jenya77 писал(а):
и писать напрямую во флеш. Что вы посоветуете.

Писать во флеш напрямую :) Это не тяжело.
Хотите конкретных ответов - задавайте конкретные вопросы.

а как записать структуру во флеш напрямую?

Например писать каждое поле одно за другим увеличивая адрес во флеш памяти на размер поля.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 14:15 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
alexsam писал(а):
Хотите конкретных ответов - задавайте конкретные вопросы.
Например писать каждое поле одно за другим увеличивая адрес во флеш памяти на размер поля.


я вижу есть файл stm32f30x_flash.c. судя по всему правильная последовательность записи будет следующая
Код:
FLASH_Unlock();
FLASH_ErasePage(Page_Address);
FLASH_ProgramWord(uint32_t Address, uint32_t Data);
FLASH_Lock();

но это для одной переменной. а если у нас структура?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 14:20 
Старожил
Аватара пользователя

Зарегистрирован: 03 дек 2012, 10:42
Сообщения: 438
Address видите? , вот его надо увеличивать и в Data писать новые данные.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 14:21 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
Вот мой код для сохранения во флеш цепочки структур, каждая новая структура читается из оперативки здесь:
Код:
Cur = Cur->Next;

UPD: код для F401 там стирание идет по секторам
Код:
void rfSaveDevices(void) {
  //0x4002 3C00 - 0x4002 3FFF
  // Unlock flash to erase and write
 
  if (rfDevices == NULL) {
    QueueResponse((char *) "Nothing to store\n");
    return;
  }
  taskENTER_CRITICAL();

  FLASH->KEYR = 0x45670123;
  FLASH->KEYR = 0xCDEF89AB;
  while(FLASH->SR & FLASH_SR_BSY) {};    //Wait untill memory ready for erase

  FLASH->CR |= FLASH_CR_SER;              //Erase one sector
  FLASH->CR |= (FLASH_CR_SNB_0 | FLASH_CR_SNB_1 | FLASH_CR_SNB_2);    //Erase sector 7
  FLASH->CR |= FLASH_CR_STRT;

  while(FLASH->SR & FLASH_SR_BSY) {};    //Wait untill memory ready
  FLASH->CR &= ~FLASH_CR_SER;

  FLASH->CR |= FLASH_PSIZE_WORD;

  FLASH->CR |= FLASH_CR_PG;                 //Allow flash programming
 
  while(FLASH->SR & FLASH_SR_BSY) {};

  dLink Cur = rfDevices;
  uint32_t Address = 0x08060000;
  while (Cur != NULL) {
    if (Cur->Type == NULL) {
      Cur = Cur->Next;
      continue;
    }
    *(__IO uint32_t*)Address = ((uint32_t)Cur->Address) | ((uint32_t)Cur->Type << 16) | ((uint32_t)Cur->Config << 24);
    Address +=4;
    *(__IO uint32_t*)Address = (uint32_t)Cur->Salt;
    Address +=4;
    Cur = Cur->Next;
  };

  while(FLASH->SR & FLASH_SR_BSY) {};
 
  printf("SR: %d\n", FLASH->SR);

  FLASH->CR &= ~(FLASH_CR_PG);
  taskEXIT_CRITICAL();
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 14:27 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
В моем примере запись идет всегда в начало сектора. Если нужно "жалеть флеш" чтоб не протереть дырку (часто записываются данные), то можно искать конец предыдущей записи и новую дописывать дальше пока не закончится сектор/страница. Этот метод подходит если заранее известен размер записываемых данных (легко потом читать). Если размер неизвестен то в конец (или начало) данных ставим какой-нибудь флаг (набор из нескольких уникальных байт которые вряд ли встретятся в такой последовательности в данных) и по нему определяем границы наших данных.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 14:36 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
alexsam писал(а):
В моем примере запись идет всегда в начало сектора. Если нужно "жалеть флеш" чтоб не протереть дырку (часто записываются данные), то можно искать конец предыдущей записи и новую дописывать дальше пока не закончится сектор/страница. Этот метод подходит если заранее известен размер записываемых данных (легко потом читать). Если размер неизвестен то в конец (или начало) данных ставим какой-нибудь флаг (набор из нескольких уникальных байт которые вряд ли встретятся в такой последовательности в данных) и по нему определяем границы наших данных.

спасибо за пример. попробую разобраться.
у меня редко пишутся параметры. я хочу выделить постоянную страницу и писать туда структуру. запись довольно редкая. износ флеша пока не беспокоит.

по вашему примеру надо все члены структуры перебирать. но у меня члены не однотипные
Код:
typedef struct sFlashParams
{
   uint32_t fuse_on_delay;
   uint32_t fuse_off_delay;
   uint16_t uid;
   uint16_t temp_param;
   uint16_t I_period;
   uint16_t dc_offset;
   uint16_t OC_protection;
   uint16_t crc;
   uint8_t i_sc;
   uint8_t r_sense;
   uint8_t retries;
   uint8_t gain;
}sFlashParams;

надо бы их все сделать uint32_t но народ отказывается это делать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 14:48 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2870
Можно же просто шагать по указателю на структуру, скажем по 2 байта, и так перебрать её всю. Структура должна быть выровнена. При чтении также записывать по указателю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 14:49 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
Необязательно, пишите в том типе, в котором у вас сам параметр, при этому указатель адреса сдвигайте на соответствующее кол-во байт.

Запись:
Код:
*(__IO uint16_t*)Address = Data16;
*(__IO uint8_t*)Address = Data8;


Hold писал(а):
Можно же просто шагать по указателю на структуру, скажем по 2 байта, и так перебрать её всю. Структура должна быть выровнена. При чтении также записывать по указателю.

Можно и так, а чтоб не выравнивать писать по байтно, но есть проблема - при просмотре через Stlink utility хрен че поймешь :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 15:11 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
alexsam писал(а):
Необязательно, пишите в том типе, в котором у вас сам параметр, при этому указатель адреса сдвигайте на соответствующее кол-во байт.

Запись:
Код:
*(__IO uint16_t*)Address = Data16;
*(__IO uint8_t*)Address = Data8;


Hold писал(а):
Можно же просто шагать по указателю на структуру, скажем по 2 байта, и так перебрать её всю. Структура должна быть выровнена. При чтении также записывать по указателю.

Можно и так, а чтоб не выравнивать писать по байтно, но есть проблема - при просмотре через Stlink utility хрен че поймешь :)

а если все члены uint32_t как мне перебрать их в цикле?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 15:17 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2870
Вы же знаете размер структуры в байтах?) Вот столько раз и нужно перебрать однобайтным указателем всю структуру. Это же просто данные, которые лежат в памяти. Ничем не отличается от массива. Берете (uint8_t*)&DataInStruct++ и перебираете каждый байт структуры. При чтении - также побайтно читаете в структуру, байты уложатся точно также.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 15:31 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
Hold писал(а):
Вы же знаете размер структуры в байтах?) Вот столько раз и нужно перебрать однобайтным указателем всю структуру. Это же просто данные, которые лежат в памяти. Ничем не отличается от массива. Берете (uint8_t*)&DataInStruct++ и перебираете каждый байт структуры. При чтении - также побайтно читаете в структуру, байты уложатся точно также.

в данном случае нужно наверно (uint16_t*)&DataInStruct++. во флеш пишется по 16 бит.

хм. а в принципе какая разница. во флеш можно писать и побайтно я думаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 15:42 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
jenya77 писал(а):
Hold писал(а):
Вы же знаете размер структуры в байтах?) Вот столько раз и нужно перебрать однобайтным указателем всю структуру. Это же просто данные, которые лежат в памяти. Ничем не отличается от массива. Берете (uint8_t*)&DataInStruct++ и перебираете каждый байт структуры. При чтении - также побайтно читаете в структуру, байты уложатся точно также.

в данном случае нужно наверно (uint16_t*)&DataInStruct++. во флеш пишется по 16 бит.

Какой типа адреса зададите так и запишет. Я же вам привел выше пример для записи по 1 и 2 байта во флеш.
При записи по 2 байта нужно чтоб у вас структура была выровнена до N/2 байт. Иначе захватите что-то лишнее. Если писать по 1 байту то проблем с этим нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 16:18 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
alexsam писал(а):
jenya77 писал(а):
Hold писал(а):
Вы же знаете размер структуры в байтах?) Вот столько раз и нужно перебрать однобайтным указателем всю структуру. Это же просто данные, которые лежат в памяти. Ничем не отличается от массива. Берете (uint8_t*)&DataInStruct++ и перебираете каждый байт структуры. При чтении - также побайтно читаете в структуру, байты уложатся точно также.

в данном случае нужно наверно (uint16_t*)&DataInStruct++. во флеш пишется по 16 бит.

Какой типа адреса зададите так и запишет. Я же вам привел выше пример для записи по 1 и 2 байта во флеш.
При записи по 2 байта нужно чтоб у вас структура была выровнена до N/2 байт. Иначе захватите что-то лишнее. Если писать по 1 байту то проблем с этим нет.

у вас в примере пишется по 4 байта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 16:23 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
jenya77 писал(а):
у вас в примере пишется по 4 байта.

Я же вот приводил пример:
Код:
*(__IO uint16_t*)Address = Data16;     - запись 2х байтного значения
*(__IO uint8_t*)Address = Data8;     - запись 1но байтного значения


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 16:47 
Старожил
Аватара пользователя

Зарегистрирован: 23 окт 2012, 15:51
Сообщения: 462
Show давненько уже делал, так руки и не дошли причесать... и так работает

_________________
#define ? ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 16:49 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
alexsam писал(а):
jenya77 писал(а):
у вас в примере пишется по 4 байта.

Я же вот приводил пример:
Код:
*(__IO uint16_t*)Address = Data16;     - запись 2х байтного значения
*(__IO uint8_t*)Address = Data8;     - запись 1но байтного значения

что то я не прнимаю. если можно писать данные разного размера то почему в примере ST - FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) они пишут по 16 бит?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 17:15 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
jenya77 писал(а):
что то я не прнимаю. если можно писать данные разного размера то почему в примере ST - FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) они пишут по 16 бит?

Это будет вашим домашним заданием :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 19 апр 2016, 17:45 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
большое спасибо за примеры. сейчас попробую написать картину маслом. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 27 мар 2020, 12:09 
Старожил
Аватара пользователя

Зарегистрирован: 07 июн 2010, 21:00
Сообщения: 612
я так сделал...
Show код


Show или даже так

_________________
Надежность оборудования обратно пропорциональна числу и положению лиц, за ним наблюдающих


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись параметров во флеш.
СообщениеДобавлено: 28 мар 2020, 19:54 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 20:11
Сообщения: 104
Откуда: Омск
AlexArt писал(а):
я так сделал...


У Вас Flash_Lock() срабатывает только при успешной записи. Это не есть хорошо.
Рекомендую строки:
> return 0xff;
заменить на:
> status = 0xFF;

Тем более, что статус и возвращается в самом конце функции.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB