Easyelectronics.ru

Электроника для всех
Текущее время: 16 окт 2019, 07:23

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



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

Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 03 сен 2019, 14:55 
Только пришел

Зарегистрирован: 19 авг 2019, 13:25
Сообщения: 11
Доброго времени суток, необходимо создать энергонезависимую переменную для сохранения настроек, как это сделать не знаю, может кто нибудь подскажет ? Заранее спасибо за ответы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 03 сен 2019, 14:59 
Заглядывает иногда

Зарегистрирован: 28 сен 2018, 00:25
Сообщения: 162
* во флеш писать
* подключить часовую батарейку (VBAT - 1 нога, емнип) и в часах хранить


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 03 сен 2019, 15:12 
Только пришел

Зарегистрирован: 19 авг 2019, 13:25
Сообщения: 11
cubot писал(а):
* во флеш писать
* подключить часовую батарейку (VBAT - 1 нога, емнип) и в часах хранить



А по другому - никак ни сделать ? Чтобы без батарейки
А как писать во флеш


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 03 сен 2019, 15:27 
Заглядывает иногда

Зарегистрирован: 28 сен 2018, 00:25
Сообщения: 162
В гугле забанили?
"AN2594 EEPROM emulation in STM32F10x microcontrollers"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 03 сен 2019, 15:30 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1002
Ну можно в облаке хранить, сейчас модно :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 03 сен 2019, 15:50 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3996
Откуда: КЧР, поселок Нижний Архыз
Я вот такую эмуляцию EEPROM во флеш сделал. Страницы стираются по мере необходимости, поиск бинарный → экономишь очень много времени при старте. Можно еще при необходимости добавить защиту от пропадания напряжения при записи — забульбенить какой-нибудь локальный источник питания на суперкондере. Но на мой взгляд, если диодом отделить кренку, питающую чисто камень, то 47мкФ на ее входе и 100мкФ на выходе хватит с лихвой!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 03 сен 2019, 18:40 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 733
Откуда: Вольгинский, 33
только батарейка или запись во флеш. первый вариант называется backup регистры. второй вариант это
Код:
uint64_t MEM_flash_read64(uint32_t _address)
{
   while (!MEM_flash_bsy())
      ;
   while (!MEM_flash_eop())
      ;
   return (*(__IO uint64_t*) _address);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 03 сен 2019, 22:11 
Только пришел

Зарегистрирован: 19 авг 2019, 13:25
Сообщения: 11
Arcanum писал(а):
только батарейка или запись во флеш. первый вариант называется backup регистры. второй вариант это
Код:
uint64_t MEM_flash_read64(uint32_t _address)
{
   while (!MEM_flash_bsy())
      ;
   while (!MEM_flash_eop())
      ;
   return (*(__IO uint64_t*) _address);
}


Я только начинаю осваивать программирование на STM, есть главная программа main, есть цикл while (1), необходимо создать переменную например "z" чтобы её значение сохранялось, как осуществить это, применительно к вышеописанному коду, чтобы при выключении питания, следующее включение устройства начиналось с записанного в неё ранее, значения. Заранее спасибо за ответ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 03 сен 2019, 22:42 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
Это сложно. У Flash количество стираний ограничено, и если вы начнете стирать-записывать просто_так, то кончится может печально. Для снижения этого дефекта, нужно следовать двум правилам:
1. записывать надо тогда, когда записывать надо, а не просто так. Например, если user изменил настройки системы и они должны примениться и сохраняться. Например - настроил скорость COM порта (пример глупый).
Считывать вы можете сколько угодно раз, на ресурс это не сказывается.
2. отделить "запись" от "стирания". А именно - стираться может только(!!) страница Flash. Если ваши данные занимают меньше "страницы", а так всегда и есть, то вы обязаны предусмотреть механизм последовательного заполнения страницы Flash до ее конца. Т.е. не так - стер-записал-стер-записал. А так - стер страницу, и записываешь до тех пор, пока страница не закончится (последовательно). При этом надо найти последнюю запись, естественно. Последней является та, за которой лежит стертая информация ( данные 0xFFFF), или закончилась страница.
Это не так трудно, как кажется.
После исчерпывания страницы, нужно стереть "старую" и продолжить запись с нового места. Чтобы не оказаться у разбитого корыта, лучше задействовать две (и более) страниц, тогда при вЫключении в момент стирания не уничтожит (предыдущие) настройки, ведь вы будете стирать не "эту" (последнюю страницу), а другую, и информация в ней уже давно устарела.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 03 сен 2019, 23:37 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4335
Откуда: Кемеровская область, Киселевск
PM0075 читай как работать с флеш памятью. Там все написано в мануале.
Если тебе нужна эмуляция полной работы EEPROM читай AN2594

А лучше возьми чип с EEPROM или установи внешнюю аппаратную.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 04 сен 2019, 01:32 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3996
Откуда: КЧР, поселок Нижний Архыз
Не надо человека пугать количеством циклов перезаписи! Даже если во флеши сохранять логи объемом до килобайта в сутки, то на свободном месте ~100кБ (в худшем случае) выйдет записать 100 суток. Если вспомнить, что минимально гарантируемое количество перезаписей — 100000, то это будет порядка 27 килолет записи логов!!!
Вряд ли какая-то железка больше 50 лет проживет, так что, нужно отталкиваться от этого.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 04 сен 2019, 02:48 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
Eddy_Em, читайте документацию перед тем, как, а не после.
Вложение:
345.png
345.png [ 6.02 Кб | Просмотров: 611 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 04 сен 2019, 03:25 
Только пришел

Зарегистрирован: 19 авг 2019, 13:25
Сообщения: 11
u37 писал(а):
Это сложно. У Flash количество стираний ограничено, и если вы начнете стирать-записывать просто_так, то кончится может печально. Для снижения этого дефекта, нужно следовать двум правилам:
1. записывать надо тогда, когда записывать надо, а не просто так. Например, если user изменил настройки системы и они должны примениться и сохраняться. Например - настроил скорость COM порта (пример глупый).
Считывать вы можете сколько угодно раз, на ресурс это не сказывается.
2. отделить "запись" от "стирания". А именно - стираться может только(!!) страница Flash. Если ваши данные занимают меньше "страницы", а так всегда и есть, то вы обязаны предусмотреть механизм последовательного заполнения страницы Flash до ее конца. Т.е. не так - стер-записал-стер-записал. А так - стер страницу, и записываешь до тех пор, пока страница не закончится (последовательно). При этом надо найти последнюю запись, естественно. Последней является та, за которой лежит стертая информация ( данные 0xFFFF), или закончилась страница.
Это не так трудно, как кажется.
После исчерпывания страницы, нужно стереть "старую" и продолжить запись с нового места. Чтобы не оказаться у разбитого корыта, лучше задействовать две (и более) страниц, тогда при вЫключении в момент стирания не уничтожит (предыдущие) настройки, ведь вы будете стирать не "эту" (последнюю страницу), а другую, и информация в ней уже давно устарела.




Вот код, полностью рабочий и уже проверенный на практике. В коде после case 2: комментарии прошу не читать, просто запарился описывать, и поэтому забил дальше на комментарии. Прошу за написание кода сильно не критиковать, я начал программировать три недели назад. Суть проекта состоит в том чтобы написать управляющую программу на STM32F103. Управляющую дозирующим, однопоршневым насосом. Управление состоит в том, чтобы, двумя кнопками "+" и "-" управлять степенью подачи дозирующем насосом химии в магистраль воды. Программа управляет насосом, изменяя дискретно скважность питания 220В насоса. Алгоритм такой, нажал один раз кнопку "+", насос включается на 9/10 секунды, потом выключается на 1/10 секунды, нажимаешь второй раз, насос включается на 8/10 секунды, потом выключается на 2/10 секунды, нажимаешь третий раз, насос включается на 7/10 секунды, потом выключается на 3/10 секунды и т.д. если нажимаешь кнопку "-" то процесс регулировки подачи химии идёт обратно. При этом информация о степени скважности регулировки насоса должна выводится на двух разрядный - семисегментный индикатор. Предполагается что питание контроллера может пропадать в среднем 2 - 3 раза в год, если так, то необходимо сохранить регулировку подачи насоса после включения питания контроллера, чтобы собственник мойки самообслуживания не вбивал регулировку насоса снова. Так вот, чтобы это осуществить, необходимо сохранение некоторых переменных, в программе, после выключения питания системы. Как это сделать пока не знаю, чтобы ускорить решение этой задачи, спрашиваю у народа, как это сделать, не общими объяснениями теории, а конкретными решениями в коде. Заранее благодарен, за ответы.


Вложения:
2019-09-03_23-58-14.jpg
2019-09-03_23-58-14.jpg [ 244.7 Кб | Просмотров: 598 ]


Последний раз редактировалось alek4322 04 сен 2019, 03:49, всего редактировалось 2 раз(а).
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 04 сен 2019, 03:36 
Заглядывает иногда

Зарегистрирован: 28 сен 2018, 00:25
Сообщения: 162
что-то я сомневаюсь что насос может включиться на 0,2сек и за это время нечто вменяемое сделать. да и с паузой 100мс тоже вопросы-сомнения..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 04 сен 2019, 03:52 
Только пришел

Зарегистрирован: 19 авг 2019, 13:25
Сообщения: 11
cubot писал(а):
что-то я сомневаюсь что насос может включиться на 0,2сек и за это время нечто вменяемое сделать. да и с паузой 100мс тоже вопросы-сомнения..



Если бы не было ограничение на выкладывание файлов по размеру 256 кБ, то выложил бы видео работы регулировки насоса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 04 сен 2019, 06:26 
Заглядывает иногда

Зарегистрирован: 02 май 2017, 18:54
Сообщения: 199
Eddy_Em писал(а):
Не надо человека пугать количеством циклов перезаписи! Даже если во флеши сохранять логи объемом до килобайта в сутки, то на свободном месте ~100кБ (в худшем случае) выйдет записать 100 суток. Если вспомнить, что минимально гарантируемое количество перезаписей — 100000, то это будет порядка 27 килолет записи логов!!!
Вряд ли какая-то железка больше 50 лет проживет, так что, нужно отталкиваться от этого.

Вы нулём промахнулись, лишний напечатали. К-во перезаписей страницы 10-20 ТЫС. !!! И не забываем, что каждая страница будет перезаписана дважды: стёрли - записали.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 04 сен 2019, 06:27 
Заглядывает иногда

Зарегистрирован: 02 май 2017, 18:54
Сообщения: 199
cubot писал(а):
что-то я сомневаюсь что насос может включиться на 0,2сек и за это время нечто вменяемое сделать. да и с паузой 100мс тоже вопросы-сомнения..

О ужОс - может! Успеть узнать, что ротор заклинило.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 04 сен 2019, 10:48 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3996
Откуда: КЧР, поселок Нижний Архыз
u37 писал(а):
Eddy_Em, читайте документацию перед тем, как, а не после.

Блин, вместо 27 тысяч лет МК будет писать "всего лишь" в течение 2700 лет...
Разница как будто бы так существенна!!!
leocat3 писал(а):
И не забываем, что каждая страница будет перезаписана дважды: стёрли - записали.

Даже если так. Страницы стираются только когда уже писать некуда. Далее начинается заполнение флеша. Как только дошли до конца — стираем опять.
Если у вас даже всего лишь 32кБ флеша свободно (скажем, в МК только 64кБ доступного флеша, а вы каким-то чудом — возможно, используя калокуб, — умудрились свою прошивку аж на 32кБ раскатать), то писать туда переменную размером в 1-2 байта можно больше 16 тысяч раз, прежде чем кончится место и придется возобновлять процесс!
Т.е. даже на 5000 циклов (а это только минимально гарантируемое количество, народ на форумах хвастался, что и 100 тысяч спокойно работает) эту переменную можно 81.9млн раз записать!!!

Дело с записью во встроенный флеш плохо только у STM8S003, где больше 100 раз не гарантируют. Но там зато EEPROM есть!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 04 сен 2019, 11:13 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 733
Откуда: Вольгинский, 33
чувак, используй внешнюю FRAM.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 04 сен 2019, 12:12 
Заглядывает иногда

Зарегистрирован: 28 сен 2018, 00:25
Сообщения: 162
нахера ставить лишний корпус, если у него по сути просто моргалка светодиодом. И он при всем желании даже с халом, крайне небрежном написании и большом желании не займет и половины от 64КБ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 06 сен 2019, 00:38 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1102
Пример решения в лоб, если на самом деле не будете играться с конфигом (постоянно перезаписывать) то он вполне работоспособен.


Код:
void Erase_EEPROM_BLOCK(void) {                      //стирание блока памяти

   while (FLASH->SR & FLASH_SR_BSY);
   if (FLASH->SR & FLASH_SR_EOP) {
      FLASH->SR = FLASH_SR_EOP;
   }

   FLASH->CR |= FLASH_CR_PER;
   FLASH->AR = FLASH_PAGE_63;
   FLASH->CR |= FLASH_CR_STRT;
   while (!(FLASH->SR & FLASH_SR_EOP));
   FLASH->SR = FLASH_SR_EOP;
   FLASH->CR &= ~FLASH_CR_PER;
}
void Write_EEPROM_BLOCK(void) {                      //Запись данных во Flash
   uint16_t flip_int=0;
   uint8_t byte1,byte2=0;
   
    FLASH->KEYR = FLASH_KEY1;  // Разблокировать FLASH
    FLASH->KEYR = FLASH_KEY2;
    if (*(__IO uint32_t*)FLASH_PAGE_63 != 0xFFFFFFFF)
      {Erase_EEPROM_BLOCK();}   
    // Записать константу
   
      byte1 = ((Settings>>16) &0xFF);
      byte2 = ((Settings>>24) &0xFF);
      
      flip_int  = byte1<<8;
      flip_int |= byte2;
      
      FLASH->CR |= FLASH_CR_PG;
    while(FLASH->SR&FLASH_SR_BSY);
    *(__IO uint16_t*)FLASH_PAGE_63 = flip_int;
      while (!(FLASH->SR & FLASH_SR_EOP));
      FLASH->SR = FLASH_SR_EOP;
      
      byte1 =  (Settings & 0xFF);
      byte2 = ((Settings>>8) & 0xFF);
            
      flip_int  = byte1<<8;
      flip_int |= byte2;
      
      while(FLASH->SR&FLASH_SR_BSY);
      *(__IO uint16_t*)(FLASH_PAGE_63+2) = flip_int;
      while (!(FLASH->SR & FLASH_SR_EOP));
      FLASH->SR = FLASH_SR_EOP;
    FLASH->CR &= ~FLASH_CR_PG;
      FLASH->CR |= FLASH_CR_LOCK;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 06 сен 2019, 17:22 
Заглядывает иногда

Зарегистрирован: 07 фев 2014, 15:45
Сообщения: 139
Arcanum писал(а):
чувак, используй внешнюю FRAM.

О кстати да, серия MSP430FR очень интересна


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 06 сен 2019, 19:36 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
"необходимо сохранение некоторых переменных, в программе, после выключения питания системы."
Варианты решения:
1. получить сигнал (извне) о том, что происходит вЫключение и по этому сигналу сохранять настройки в Flash. Процесс записи очень быстрый, это со стиранием проблема (долго). Т.е. алгоритм проверки должен учитывать стирание страниц "заранее".
Например, при_включении проверять доступность блока на сохранение (есть ли пустое место в текущей странице) и подчищать если надо.
2. Если юзер изменил значение, то его записать (сейчас), при условии, что от предыдущего события записи прошло не менее (30 секунд?).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 11 сен 2019, 23:16 
Только пришел

Зарегистрирован: 06 авг 2019, 11:28
Сообщения: 12
Отличная тема. Тоже интересует как сохранить в память камня настройки. Вопрос к экспертам: как узнать свободна ли страница памяти, которую мы планируем стирать для последующей записи данных?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как создать энергонезависимую переменную на STM32F103
СообщениеДобавлено: 11 сен 2019, 23:19 
Только пришел

Зарегистрирован: 06 авг 2019, 11:28
Сообщения: 12
Если работаем в IAR у нас есть файл icf. Там есть какие то данные по памяти занимаемой программой при прошивке. К примеру:
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x0800FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__ = 0x200;


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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