Столкнулся с потребностью сохранять данные во внутреннем флеше МК (F103). Можно было бы во внешнем ЕЕПРОМ, но его на уже разведенной и запаяной плате нет. Проблема, собственно в следующем: при попытке стирания страницы флеша - контроллер намертво виснет. Делаю так:
Попробовал код из статьи, все равно подвисает... Похоже, не неправильной странице при стирании обращаюсь. Хотя, по мануалам адрес страницы 8 и есть 0x8002000
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Попробовал - заработало. Стирает и пишет. Почему-то виснет при попытках стирать страницы с номером, ближе к использованным. В итоге все кончилось тем, что работаю с 30й страницей ) Еще обнаружил один момент, если страницу стереть, потом записать данные, потом еще раз попытаться записать данные - все намертво виснет. В итоге, похоже, что перед операцией записи в любом случае нужно вызывать операцию стирания. Лучше всего - затолкать данные для сохранения в структуру, и потом эту структуру записывать через указатель одной операцией записи. Проблема решена - спасибо! Теперь буду думать над чтением )
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: stm32f103 HAL: зранение данных во внутреннем флеше
Добавлено: Вс июл 02, 2017 19:35:35
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
KT315B писал(а):
Почему-то виснет при попытках стирать страницы с номером, ближе к использованным.
Наверное затираете какие-то данные.
KT315B писал(а):
Еще обнаружил один момент, если страницу стереть, потом записать данные, потом еще раз попытаться записать данные - все намертво виснет.
Так я не пробовал, после записи сразу же лочу запись во флеш.
KT315B писал(а):
Лучше всего - затолкать данные для сохранения в структуру, и потом эту структуру записывать через указатель одной операцией записи.
Ну лично я, как раз так и сделал.
KT315B писал(а):
Теперь буду думать над чтением
Я объявил переменную в области флеш и делал вот так просто.
Код:
#define VAR_FL __attribute__((section(".var_area"))) //область для хранения во флеш переменных ... extern volatile DEVICE_t DEVICE; volatile DEVICE_t DEVICE_FLASH VAR_FL; ... DEVICE=DEVICE_FLASH; //считываем из флеша
Местоположение секции .var_area определена мной в файле линковщика. Но можно структуру того же типа объявить как указатель и присвоить ему фиксированный адрес. Но в первом варианте как раз гарантируется, что данные не налезут друг на друга.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Я объявил переменную в области флеш и делал вот так просто.
Хм, настолько глубоко я еще пока не залезал. А какой компилятор используете? Или там все равно? У меня SW4STM32. Хотя есть еще и Keil, просто проект делался в SW4STM32.
Всем привет! Подниму тему. Перехожу на HAL, нужно писать данные во FLASH. МК STM32F103C8T6, пишу данные в конец флэша - на 63 страницу, в качестве данных значение переменной isTimeWorkL - время работы одного из двигателей. Делаю это следующим образом:
Код:
HAL_FLASH_Unlock(); // Разблокируем флеш память FLASH_WaitForLastOperation(500); // Ожидаем окончания операции FLASH_PageErase(0x0800F7C2); // Очищаем страницу 63 флеш памяти FLASH_WaitForLastOperation(500); // Ожидаем окончания операции HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, 0x0800F7C2, isTimeWorkL ); // Записываем значение переменной isTimeWorkL на 63 странице флеш памяти FLASH_WaitForLastOperation(500); // Ожидаем окончания операции HAL_FLASH_Lock(); // Блокируем флеш память FLASH_WaitForLastOperation(500); // Ожидаем окончания операции
В итоге после записи во флеш значения переменной isTimeWorkL я наблюдаю на 63 странице 0xFFFFFFFF, т.е. такое ощущение, что флеш была стерта, но не записана. Что я делаю не так?
У меня вообще черех HAL не хотело писАться, в итоге пришлось добавить самопальные функции. Код, который прислал Z_h_e - рабочий, им можно пользоваться. Ну а данные лучше в структуру затолкать...
У меня вообще черех HAL не хотело писАться, в итоге пришлось добавить самопальные функции. Код, который прислал Z_h_e - рабочий, им можно пользоваться. Ну а данные лучше в структуру затолкать...
Я такой код использовал раньше и он тоже работал, НО хочется избавится от костылей и использовать чистый HAL.
Нет, Вы передаете число которое соответствует символу А кодовой таблицы.
Согласен, не верно выразился. К, сожалению, не нашел рабочего примера, чтобы и компилятор не ругался и преобразовывалось. Например, число 97 это буква "a", как данное число можно "малой кровью" отобразить как "a"?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения