Easyelectronics.ru

Электроника для всех
Текущее время: 02 июн 2020, 10:13

Часовой пояс: 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
Сообщения: 261
* во флеш писать
* подключить часовую батарейку (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
Сообщения: 261
В гугле забанили?
"AN2594 EEPROM emulation in STM32F10x microcontrollers"


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

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


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

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


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

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 736
только батарейка или запись во флеш. первый вариант называется 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
Сообщения: 6746
Это сложно. У Flash количество стираний ограничено, и если вы начнете стирать-записывать просто_так, то кончится может печально. Для снижения этого дефекта, нужно следовать двум правилам:
1. записывать надо тогда, когда записывать надо, а не просто так. Например, если user изменил настройки системы и они должны примениться и сохраняться. Например - настроил скорость COM порта (пример глупый).
Считывать вы можете сколько угодно раз, на ресурс это не сказывается.
2. отделить "запись" от "стирания". А именно - стираться может только(!!) страница Flash. Если ваши данные занимают меньше "страницы", а так всегда и есть, то вы обязаны предусмотреть механизм последовательного заполнения страницы Flash до ее конца. Т.е. не так - стер-записал-стер-записал. А так - стер страницу, и записываешь до тех пор, пока страница не закончится (последовательно). При этом надо найти последнюю запись, естественно. Последней является та, за которой лежит стертая информация ( данные 0xFFFF), или закончилась страница.
Это не так трудно, как кажется.
После исчерпывания страницы, нужно стереть "старую" и продолжить запись с нового места. Чтобы не оказаться у разбитого корыта, лучше задействовать две (и более) страниц, тогда при вЫключении в момент стирания не уничтожит (предыдущие) настройки, ведь вы будете стирать не "эту" (последнюю страницу), а другую, и информация в ней уже давно устарела.


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

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

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

_________________
RADIOWOLF.RU


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

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


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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 Кб | Просмотров: 781 ]


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

Зарегистрирован: 28 сен 2018, 00:25
Сообщения: 261
что-то я сомневаюсь что насос может включиться на 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
Сообщения: 263
Eddy_Em писал(а):
Не надо человека пугать количеством циклов перезаписи! Даже если во флеши сохранять логи объемом до килобайта в сутки, то на свободном месте ~100кБ (в худшем случае) выйдет записать 100 суток. Если вспомнить, что минимально гарантируемое количество перезаписей — 100000, то это будет порядка 27 килолет записи логов!!!
Вряд ли какая-то железка больше 50 лет проживет, так что, нужно отталкиваться от этого.

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


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

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

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


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

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4629
Откуда: КЧР, поселок Нижний Архыз
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
Сообщения: 736
чувак, используй внешнюю FRAM.


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

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


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

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


Код:
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
Сообщения: 144
Arcanum писал(а):
чувак, используй внешнюю FRAM.

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


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

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


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

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


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

Зарегистрирован: 06 авг 2019, 11:28
Сообщения: 18
Если работаем в 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 часов


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

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


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

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

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