EEPROM stm32

sanstan
Offline
Зарегистрирован: 24.06.2019

Добрый день, подскажите. почему не работает  сохранение в EEPROM на nucleo401:

#include <EEPROM.h>

int addr = 0;
int val=0;
int val2;
void setup() {
  Serial.begin(115200); 
  EEPROM.get(addr,val);
  pinMode(PA5, OUTPUT);
}

void loop() {

  digitalToggle(PA5);
  val++;


  EEPROM.put(addr, val);
  val2 = EEPROM.get(addr,val);

 
  
  Serial.println(String(val)+"---2o---"+String(val2));  

  delay(100);
}

1. Вроде чтение проходит - в терминале начинает считать с 255

2. Пробовал через read-write - тоже не работает.

3. После заливки программы - терминал зависает. Приходится питание выкл-вкл- пропадает COM , затем еще раз выкл-вкл питание - COM появляется.

b707
Онлайн
Зарегистрирован: 26.05.2017

sanstan пишет:

1. Вроде чтение проходит - в терминале начинает считать с 255

если начинает работать не с нуля - в чем проблема? - значит работает

Но вообще, идея писать в ЕЕПРОМ в loop() - абсолютно бредовая, вы так в ЕЕПРОМ дырку протрете за несколько запусков.

Цитата:
3. После заливки программы - терминал зависает. Приходится питание выкл-вкл- пропадает COM , затем еще раз выкл-вкл питание - COM появляется.

это нормально

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

А там не надо commit делать при записи, случаем?

b707
Онлайн
Зарегистрирован: 26.05.2017

DIYMan пишет:

А там не надо commit делать при записи, случаем?

если это ардуиновская либа ЕЕПРОМ, то вроде нет.  Во всяком случае у Кларка точно нет.

b707
Онлайн
Зарегистрирован: 26.05.2017

добавка - вспомнил особенность - в стм32 в ЕЕПРОМ нет шаблонов для записи сложных типов, либа умеет читать и писать только байты, все остальное надо писать самому

sanstan
Offline
Зарегистрирован: 24.06.2019

b707 пишет:

если начинает работать не с нуля - в чем проблема? - значит работает

Во флеш памяти по умолчанию FF - так что получается - туда ничего не пишется

b707 пишет:

Но вообще, идея писать в ЕЕПРОМ в loop() - абсолютно бредовая, вы так в ЕЕПРОМ дырку протрете за несколько запусков.

с паузой 100мс не успеет ?! и запись растягивается до 1секунды.

1. Сбрасывается через раз в FF - видимо нельзя питание отключать при записи?!

EEPROM.get(eeAddress, f); 

EEPROM.put(eeAddress, f);

2. Вроде должны любой тип читать и записывать?

3. Как несколько байт преобразовать в long ?

4. Изменяю программу - заливаю - в мониторе опять тоже самое отображается!

b707
Онлайн
Зарегистрирован: 26.05.2017

sanstan пишет:

2. Вроде должны любой тип читать и записывать?

откройте библиотеку и посмотрите сами

Цитата:
3. Как несколько байт преобразовать в long ?

 много раз обсуждали

 

 

 

nik182
Offline
Зарегистрирован: 04.05.2015

Да Вы чё? У stm нет EEPROM. Там память обычная флэш и в неё можно писать много во все место что не занято программой, а стирать можно только большими страницами. Библиотеки от ардуины никак не подойдут. 

b707
Онлайн
Зарегистрирован: 26.05.2017

nik182 пишет:

Да Вы чё? У stm нет EEPROM. Там память обычная флэш и в неё можно писать много во все место что не занято программой, а стирать можно только большими страницами. Библиотеки от ардуины никак не подойдут. 

вы не правы. Аддон Ардуино для СТМ содержит библиотеку EEPROM c синтаксисом, полностью аналогичном либе ЕЕПРОМ для АВР.

Хотя внутри оно, конечно, пишет во флеш

nik182
Offline
Зарегистрирован: 04.05.2015

Не поленился, залез в https://github.com/stm32duino/Arduino_Core_STM32/tree/master/libraries/EEPROM/examples

 

What is the EEPROM library.
Th EEPROM library provides an easy to use interface to interact with the internal non-volatile storage found in AVR based Arduino boards. This library will work on many AVR devices like ATtiny and ATmega chips.
 
Ни одного слова про STM32 не нашёл. Посмотрел библиотеки. Ни одной команды записи в stm32 флэш нет.  Так как она пишет в stm?
sanstan
Offline
Зарегистрирован: 24.06.2019

nik182 пишет:

Не поленился, залез в https://github.com/stm32duino/Arduino_Core_STM32/tree/master/libraries/EEPROM/examples

 

What is the EEPROM library.
Th EEPROM library provides an easy to use interface to interact with the internal non-volatile storage found in AVR based Arduino boards. This library will work on many AVR devices like ATtiny and ATmega chips.
 
Ни одного слова про STM32 не нашёл. Посмотрел библиотеки. Ни одной команды записи в stm32 флэш нет.  Так как она пишет в stm?

А вы какими функциями/библиотеками    сохраняете/читаете переменные во Flash?

b707
Онлайн
Зарегистрирован: 26.05.2017

nik182 пишет:

Ни одного слова про STM32 не нашёл. Посмотрел библиотеки. Ни одной команды записи в stm32 флэш нет.  Так как она пишет в stm?

вот тут смотрите

https://github.com/rogerclarkmelbourne/Arduino_STM32/tree/master/STM32F1/libraries/EEPROM

nik182
Offline
Зарегистрирован: 04.05.2015

Ну вот. Отлично. Всё есть. Вот только повторная запись очень не понятно как пару чисел переписать без затирания остального .

b707
Онлайн
Зарегистрирован: 26.05.2017

nik182 пишет:

Ну вот. Отлично. Всё есть. Вот только повторная запись очень не понятно как пару чисел переписать без затирания остального .

насколько я помню, они там повторно в ту же ячейку не пишут, пишут каждый раз в новую - и адрес,  что использует юзер при обращении к ЕЕПРОМ - фиктивный.

А когда страница кончилась - один раз стирают всю страницу и начинают заново

b707
Онлайн
Зарегистрирован: 26.05.2017

да, а ноги всего этого растут из LeafLab проекта:

https://stm32duinoforum.com/forum/viewtopic_f_9_t_4383.html

sanstan
Offline
Зарегистрирован: 24.06.2019

Подскажите, что сделать можно :

Изменяю программу - заливаю в контроллер. В контроллере почему то осталась прежняя программа.

b707
Онлайн
Зарегистрирован: 26.05.2017

sanstan пишет:

Изменяю программу - заливаю в контроллер. В контроллере почему то осталась прежняя программа.

смотрите внимательно на сообщения в окне компиляции и загрузки. При работе через DFU не всегда реально доходит до загрузки кода, при этом Ардуино ИДЕ ошибок не пишет.

Обязательно в ходе загрузки должна пробежать строчка из диезов:

"############################################", если такой строчки нет - значит и реальной загрузки не было