Easyelectronics.ru

Электроника для всех
Текущее время: 14 ноя 2019, 09:52

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



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

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

Зарегистрирован: 29 янв 2016, 17:34
Сообщения: 69
Использую камень 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
Сообщения: 69
На 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
Сообщения: 2428
Какой отладчик - STLink?
Он может - наступал на эти грабли.
Взял JLink и "всё прошло".

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

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


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

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


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

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


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

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

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