Как известно, в микроконтроллерах серии STM32 нет внутренней eeprom, но есть много flash, которую можно использовать в своих корыстных целях для хранения данных программы, конечно не без своих неприятных особенностей. Сейчас реализую проект, где как раз одной из задач стоит - хранение во внутренней памяти пользовательских настроек, но столкнулся с проблемой зависания контроллера при попытки записи. В проекте применён контроллер STM32F051C8T6. Тактирование от внутреннего генератора. Для облегчения работы использую STL. Инициализация, пока что сделана на скорую руку:
И такое ощущение, что в ней чего-то не хватат, из-за чего и виснет контроллер при попытки записи в свою память. Сама запись выглядит следующем образом:
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Спасибо за советы, но не один из методов не помогает, контроллер виснет. FLASH из SPL и так использую. Ещё есть подозрение, что нужно копать в сторону настройки тактирования, а именно включить FLITF Clk, а ему в свою очередь нужен PDR режим. Но включение всего этого добра не помогло или неправильно включил, или чего-то ещё не хватает. Но вот чего не хватает - пока что не пойму.
При этом стирание памяти работало и работает нормально.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
И у меня такая проблема вылезла на F103C6 при попытке сохранения нужных параметров во флеш! код такой: void mainFL(void)//стирание и запись 1 страницы флеш { // Разблокировка FLASH FLASH->KEYR = FLASH_KEY1; FLASH->KEYR = FLASH_KEY2;
//Стирание одной страницы во FLASH while((FLASH->SR&FLASH_SR_BSY));//ждем когда можно стирать или писать память. FLASH->CR |= FLASH_CR_PER; //Устанавливаем бит стирания одной страницы FLASH->AR = Page_31_0; // Задаем адрес страницы FLASH->CR |= FLASH_CR_STRT; // Запускаем стирание while((FLASH->SR&FLASH_SR_BSY)); //Ждем пока страница сотрется. FLASH->CR &= ~FLASH_CR_PER; //Сбрасываем бит стирания одной страницы обратно FLASH->CR |= FLASH_CR_PG; //Разрешаем программирование FLASH
while((FLASH->SR&FLASH_SR_BSY)); *(__IO uint16_t*)(Page_31_0 ) = nomer_avto_sot_tmp; while((FLASH->SR&FLASH_SR_BSY)); *(__IO uint16_t*)(Page_31_1 ) = nomer_avto_des_tmp; while((FLASH->SR&FLASH_SR_BSY)); *(__IO uint16_t*)(Page_31_2 ) = nomer_avto_ede_tmp; while((FLASH->SR&FLASH_SR_BSY)); FLASH->CR &= ~FLASH_CR_PG;//Запрещаем программирование FLASH FLASH->CR |= FLASH_CR_LOCK;//Блокировка FLASH } При чем при отладке все работает ОК! Без отладки балалайка, проходит только стирание записи нет! перемещая точку останова определил что FLASH->CR &= ~FLASH_CR_PER; не сбрасывает или не успевает сбрасывать бит попытался поставить небольшую паузу не помогло! тогда прописал эту строчку дважды! и о чудо все заработало! С чем это может быть связано? растолкуйте кто в курсе!
Среда IAR Тактируется HSE кварц 8 Мгц вот инициализация:
Наковырял в доке помогите понять
Note: 1 These options should be used in accordance with the Flash memory access time. The wait states represent the ratio of the SYSCLK (system clock) period to the Flash memory access time: zero wait state, if 0 < SYSCLK <= 24 MHz one wait state, if 24 MHz < SYSCLK <= 48 MHz two wait states, if 48 MHz < SYSCLK <= 72 MHz
Вопрос решен. Ошибка была, как и оказалась - с моей стороны. И была она не в инициализации. Т.к. с stm32 работаю не очень давно, то о многих аспектах ещё не знаю. Так и тут аспект в том, что нужно адресоваться кратно разрядности ячейки памяти - 4 байта. Всем кто отозвался спасибо.
Я адресовал по 2 байта, и писал соответсвенно 16 битное число, так как больше и не нужно было. Проблем ни каких не было. Все четко писалось, стиралось, и читалось. Причем если для записи ставить последнюю страницу флеша, то даже после программирования улинком данные сохранялись. Так как при перепрограммировании он затирает только ту часть флеша что нужна под программу.
Сейчас в срочном порядке доделываю проект, на более гибкое и рациональное использование памяти перейду позже, во время оптимизации. Самое главное - что проблему обнаружил и решил. За информацию, что можно писать по 2 байта - спасибо, обязательно проверю и перейду на неё, там, где это нужно. На счёт записи в последнею страницу - это и так. Кстати, среда с моим китайским st-link'ом тоже позволяют стирать только ту область памяти, где расположена программа.
Извиняюсь, что дергаю старую тему, но: При попытке записи или стирания получаю кучу ошибок:
Цитата:
ANV_AMP_MTR\ANV_AMP_MTR.axf: Error: L6407E: Sections of aggregate size 0x40 bytes could not fit into .ANY selector(s). ANV_AMP_MTR\ANV_AMP_MTR.axf: Error: L6406E: No space in execution regions with .ANY selector matching iusefp.o(.text).
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения