Easyelectronics.ru

Электроника для всех
Текущее время: 17 сен 2019, 11:46

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



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: stm32l0 запись по FLASH
СообщениеДобавлено: 20 авг 2019, 17:06 
Заглядывает иногда

Зарегистрирован: 29 янв 2016, 17:34
Сообщения: 59
Использую камень STM32L051C8T6. В нём есть EEPROM память, в неё запись работает нормально, но мне нужно писать именно во FLASH. Пытаюсь записать в последствию (511 станицу) 0x0800FF80. Делаю всё по reference manual, с началa разблокирую записать во FLASH, потом стираю страницу, потом записываю, и блокирую FLASH.
Вот код:
Код:
//--------------------------------------------Разблокировать
   while ((FLASH->SR & FLASH_SR_BSY) != 0)
   {
   }
   if ((FLASH->PECR & FLASH_PECR_PELOCK) != 0)
   {
      FLASH->PEKEYR = FLASH_PEKEY1;
      FLASH->PEKEYR = FLASH_PEKEY2;
   }
//--------------------------------------------Стирание
   FLASH->PECR |= FLASH_PECR_ERASE | FLASH_PECR_PROG ;
   *(__IO uint32_t *)(0x0800FF80) = (uint32_t)0;
   while ((FLASH->SR & FLASH_SR_BSY) != 0)
   {
   }
   if ((FLASH->SR & FLASH_SR_EOP) != 0)
   {
      FLASH->SR = FLASH_SR_EOP;
   }
   else
   {
      /* Manage the error cases */
   }
   FLASH->PECR &= ~(FLASH_PECR_ERASE | FLASH_PECR_PROG);
//--------------------------------------------Запись
   *(__IO uint32_t*)(0x0800FF80) = 1;
   while ((FLASH->SR & FLASH_SR_BSY) != 0)
   {
   }
   if ((FLASH->SR & FLASH_SR_EOP) != 0)
   {
      FLASH->SR = FLASH_SR_EOP;
   }
   else
   {
      /* Manage the error cases */
   }
//--------------------------------------------Заблокировать
   while ((FLASH->SR & FLASH_SR_BSY) != 0)
   {
   }
   FLASH->PECR |= FLASH_PECR_PELOCK;

Когда делаю стирание памяти BSY, всегда стоит 0, и не приходит флаг EOP. Что я делаю не так? Почему так может происходить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32l0 запись по FLASH
СообщениеДобавлено: 21 авг 2019, 09:42 
Заглядывает иногда

Зарегистрирован: 29 янв 2016, 17:34
Сообщения: 59
На L-серии нужно ещё разблокировать стирание запись.
Может кому-то пригодиться:
Код:
//--------------------------------------------Разблокировать
   while ((FLASH->SR & FLASH_SR_BSY) != 0)
   {
   }
   if ((FLASH->PECR & FLASH_PECR_PELOCK) != 0)
   {
      FLASH->PEKEYR = FLASH_PEKEY1;
      FLASH->PEKEYR = FLASH_PEKEY2;
   }

   while ((FLASH->SR & FLASH_SR_BSY) != 0)
   {
   }
   if ((FLASH->PECR & FLASH_PECR_PELOCK) == 0)
   {
      if ((FLASH->PECR & FLASH_PECR_PRGLOCK) != 0)
      {
         FLASH->PRGKEYR = FLASH_PRGKEY1;
         FLASH->PRGKEYR = FLASH_PRGKEY2;
      }
   }
//--------------------------------------------Стирание
   FLASH->PECR |= FLASH_PECR_ERASE | FLASH_PECR_PROG ;
   *(__IO uint32_t *)(0x0800FF80) = (uint32_t)0;
   while ((FLASH->SR & FLASH_SR_BSY) != 0)
   {
   }
   if ((FLASH->SR & FLASH_SR_EOP) != 0)
   {
      FLASH->SR = FLASH_SR_EOP;
   }
   else
   {
      /* Manage the error cases */
   }
   FLASH->PECR &= ~(FLASH_PECR_ERASE | FLASH_PECR_PROG);
//--------------------------------------------Запись
   *(__IO uint32_t*)(0x0800FF80) = 1;
   while ((FLASH->SR & FLASH_SR_BSY) != 0)
   {
   }
   if ((FLASH->SR & FLASH_SR_EOP) != 0)
   {
      FLASH->SR = FLASH_SR_EOP;
   }
   else
   {
      /* Manage the error cases */
   }
//--------------------------------------------Заблокировать
   while ((FLASH->SR & FLASH_SR_BSY) != 0)
   {
   }
   FLASH->PECR |= FLASH_PECR_PELOCK;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32l0 запись по FLASH
СообщениеДобавлено: 21 авг 2019, 10:07 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2346
Какой отладчик - STLink?
Он может - наступал на эти грабли.
Взял JLink и "всё прошло".

Это не ошибка кода, это "фича" STLink

Проверьте - если без отладки пишет - это STLink однозначно.


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

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


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

Сейчас этот форум просматривают: Nosaer


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

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

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