Например TDA7294

Форум РадиоКот • Просмотр темы - Зависает запись во Flash на STM32F051
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Чт апр 18, 2024 04:50:08

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


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Зависает запись во Flash на STM32F051
СообщениеДобавлено: Вс июл 27, 2014 01:23:09 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Сб дек 27, 2008 12:01:35
Сообщений: 580
Откуда: Россия, Екатеринбург
Рейтинг сообщения: 0
Здравствуйте

Как известно, в микроконтроллерах серии STM32 нет внутренней eeprom, но есть много flash, которую можно использовать в своих корыстных целях для хранения данных программы, конечно не без своих неприятных особенностей.
Сейчас реализую проект, где как раз одной из задач стоит - хранение во внутренней памяти пользовательских настроек, но столкнулся с проблемой зависания контроллера при попытки записи.
В проекте применён контроллер STM32F051C8T6. Тактирование от внутреннего генератора. Для облегчения работы использую STL.
Инициализация, пока что сделана на скорую руку:
Код:
//   Тактирование
   RCC_DeInit();               //   сброс настроек тактового генератора
   RCC_HSEConfig(RCC_HSE_OFF);      //   отключение внешнего тактового генератора

   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FLITF | RCC_AHBPeriph_SRAM, ENABLE);
   RCC_HSICmd(ENABLE);

   RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_4);   //   тактирование от HSI с делителем 2 * 4 = 16МГц
   RCC_PLLCmd(ENABLE);            //   Включаем PLL
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);   //   устанавливаем значение

//   RTC
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);// Enable the PWR clock

   PWR_BackupAccessCmd(ENABLE);// Allow access to RTC
   RCC_LSEConfig(RCC_LSE_ON);// Enable the LSE OSC
   while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){} // Wait till LSE is ready
   RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);// Select the RTC Clock Source
   RCC_RTCCLKCmd(ENABLE);// Enable the RTC Clock
   RTC_WaitForSynchro();// Wait for RTC APB registers synchronisation

   RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
   RTC_InitStructure.RTC_SynchPrediv = 0x7FFF;
   RTC_Init(&RTC_InitStructure);

И такое ощущение, что в ней чего-то не хватат, из-за чего и виснет контроллер при попытки записи в свою память.
Сама запись выглядит следующем образом:
Код:
   #define FLASH_USER_START_ADDR   ((unsigned long)0x08007000)

   FLASH_Unlock();
   FLASH_ErasePage(FLASH_USER_START_ADDR+1);
   FLASH_ProgramWord(FLASH_USER_START_ADDR+1,0x0800F801);
   FLASH_Lock();

Если кто работал с ней - то подскажите, пожалуйста, где может скрываться ошибка или в какую сторону копать.

Если данная тема уже была и вопрос поднимался - то извиняюсь за невнимательность и прошу направить.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Зависает запись во Flash на STM32F051
СообщениеДобавлено: Вс июл 27, 2014 06:46:41 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
так работало
Код:
#define FLASH_PAGE 15
#define ADR_START     0x08003C00
.....
void FlashWrite(uint32_t Address, uint32_t Data)
{FLASH_Unlock();FLASH_ProgramWord(Address,Data);FLASH_Lock();}
......
  //erase page
  FLASH_Unlock();
  FLASH_ErasePage (FLASH_BASE + FLASH_PAGE * 1024);
  FLASH_Lock();
  //write data
  FlashWrite(ADR_START + 4, Data[1]);
  FlashWrite(ADR_START + 4*2, Data[2]);
  FlashWrite(ADR_START + 4*3, Data[3]);
.....


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Зависает запись во Flash на STM32F051
СообщениеДобавлено: Вс июл 27, 2014 09:01:07 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Сб дек 27, 2008 12:01:35
Сообщений: 580
Откуда: Россия, Екатеринбург
Рейтинг сообщения: 0
У меня нет.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Зависает запись во Flash на STM32F051
СообщениеДобавлено: Вс июл 27, 2014 09:28:50 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Тогда можно попробовать пример FLASH из SPL или из сниппетов http://www.compel.ru/2014/03/19/sbornik ... rammistam/


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Зависает запись во Flash на STM32F051
СообщениеДобавлено: Вс июл 27, 2014 19:13:11 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Сб дек 27, 2008 12:01:35
Сообщений: 580
Откуда: Россия, Екатеринбург
Рейтинг сообщения: 0
Спасибо за советы, но не один из методов не помогает, контроллер виснет. FLASH из SPL и так использую.
Ещё есть подозрение, что нужно копать в сторону настройки тактирования, а именно включить FLITF Clk, а ему в свою очередь нужен PDR режим. Но включение всего этого добра не помогло или неправильно включил, или чего-то ещё не хватает. Но вот чего не хватает - пока что не пойму.

При этом стирание памяти работало и работает нормально.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Зависает запись во Flash на STM32F051
СообщениеДобавлено: Пн июл 28, 2014 08:52:23 
Прорезались зубы
Аватар пользователя

Карма: 5
Рейтинг сообщений: 25
Зарегистрирован: Вт май 08, 2012 10:42:29
Сообщений: 232
Рейтинг сообщения: 0
И у меня такая проблема вылезла на 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; не сбрасывает или не успевает сбрасывать бит
попытался поставить небольшую паузу не помогло! тогда прописал эту строчку дважды! и о чудо все заработало!
С чем это может быть связано? растолкуйте кто в курсе!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Зависает запись во Flash на STM32F051
СообщениеДобавлено: Пн июл 28, 2014 13:50:57 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Сб дек 27, 2008 12:01:35
Сообщений: 580
Откуда: Россия, Екатеринбург
Рейтинг сообщения: 0
Среда CooCox?
И как выглядит инициализация?
И от чего тактируете?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Зависает запись во Flash на STM32F051
СообщениеДобавлено: Пн июл 28, 2014 15:06:56 
Прорезались зубы
Аватар пользователя

Карма: 5
Рейтинг сообщений: 25
Зарегистрирован: Вт май 08, 2012 10:42:29
Сообщений: 232
Рейтинг сообщения: 0
Среда 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


Вложения:
INIT.jpg [179.63 KiB]
Скачиваний: 700


Последний раз редактировалось optima Пн июл 28, 2014 21:04:18, всего редактировалось 1 раз.
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Зависает запись во Flash на STM32F051
СообщениеДобавлено: Пн июл 28, 2014 20:57:01 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Сб дек 27, 2008 12:01:35
Сообщений: 580
Откуда: Россия, Екатеринбург
Рейтинг сообщения: 0
Вопрос решен.
Ошибка была, как и оказалась - с моей стороны. И была она не в инициализации.
Т.к. с stm32 работаю не очень давно, то о многих аспектах ещё не знаю. Так и тут аспект в том, что нужно адресоваться кратно разрядности ячейки памяти - 4 байта.
Всем кто отозвался спасибо.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Зависает запись во Flash на STM32F051
СообщениеДобавлено: Ср июл 30, 2014 14:15:57 
Друг Кота
Аватар пользователя

Карма: 94
Рейтинг сообщений: 2197
Зарегистрирован: Ср янв 06, 2010 23:31:56
Сообщений: 3242
Откуда: Боровичи, Новг. обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
Alex_EXE писал(а):
кратно разрядности ячейки памяти - 4 байта.

Я адресовал по 2 байта, и писал соответсвенно 16 битное число, так как больше и не нужно было. Проблем ни каких не было. Все четко писалось, стиралось, и читалось. Причем если для записи ставить последнюю страницу флеша, то даже после программирования улинком данные сохранялись. Так как при перепрограммировании он затирает только ту часть флеша что нужна под программу.

_________________
Прототипы печатных плат на заказ https://radiokot.ru/forum/viewtopic.php?f=54&t=122701


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Зависает запись во Flash на STM32F051
СообщениеДобавлено: Ср июл 30, 2014 16:08:43 
Прорезались зубы
Аватар пользователя

Карма: 5
Рейтинг сообщений: 25
Зарегистрирован: Вт май 08, 2012 10:42:29
Сообщений: 232
Рейтинг сообщения: 0
Но адресуешь же uint32_t а не uint16_t, а записать да можно минимум 16 бит.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Зависает запись во Flash на STM32F051
СообщениеДобавлено: Сб авг 02, 2014 13:35:59 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Сб дек 27, 2008 12:01:35
Сообщений: 580
Откуда: Россия, Екатеринбург
Рейтинг сообщения: 0
Сейчас в срочном порядке доделываю проект, на более гибкое и рациональное использование памяти перейду позже, во время оптимизации. Самое главное - что проблему обнаружил и решил.
За информацию, что можно писать по 2 байта - спасибо, обязательно проверю и перейду на неё, там, где это нужно.
На счёт записи в последнею страницу - это и так. Кстати, среда с моим китайским st-link'ом тоже позволяют стирать только ту область памяти, где расположена программа.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Зависает запись во Flash на STM32F051
СообщениеДобавлено: Сб авг 02, 2014 23:17:28 
Прорезались зубы

Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Пт май 18, 2012 23:12:23
Сообщений: 249
Рейтинг сообщения: 0
у меня работает так:


стирание:
Код:
      FLASH_Unlock();
      FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
      FLASH_ErasePage(CONFIG_START_ADDR);
      FLASH_Lock();


запись:
Код:
      U32 *source_addr = (void *)&config;
      U32 *dest_addr   = (void *)CONFIG_RECORD(config_record);
      FLASH_Unlock();
      FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
      for (U16 i=0; i<CONFIG_WORDS; i++) {
         FLASH_ProgramWord((U32)dest_addr, *source_addr);
         source_addr++;
         dest_addr++;
      }
      FLASH_Lock();


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Зависает запись во Flash на STM32F051
СообщениеДобавлено: Пн авг 21, 2017 12:08:26 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Сб янв 17, 2015 06:37:10
Сообщений: 27
Рейтинг сообщения: 0
Извиняюсь, что дергаю старую тему, но:
При попытке записи или стирания получаю кучу ошибок:
Цитата:
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).


Код:
HAL_FLASH_Unlock();
       
        FLASH_EraseInitTypeDef EraseInitStruct;
        EraseInitStruct.PageAddress = 0x08010000;
        EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
        EraseInitStruct.NbPages = 1;
        uint32_t SectorError = 0;

        if (HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK)
            {     
                    HAL_FLASH_Lock();
            }

        HAL_FLASH_Unlock();
        HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, 0x08010000, AHReady);
        HAL_FLASH_Lock();


Пробовал менять адрес, ничего не помогает


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

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


Кто сейчас на форуме

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


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

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


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y