реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F2xx, запись во флеш
esaulenka
сообщение Sep 16 2013, 08:31
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Приветствую!

При написании загрузчика столкнулся с непонятными граблями. Пользуюсь стандартной библиотекой
Код
  * @file    stm32f2xx_flash.c
  * @version V1.0.0
  * @date    18-April-2011


Вызываю
FLASH_Unlock ()
FLASH_EraseSector () - возвращает complete
FLASH_Unlock ()
FLASH_ProgramByte ()

ProgramByte выпадает в hardfault на команде branch на FLASH_WaitForLastOperation()

Код
    /* if the previous operation is completed, proceed to program the new data */
    FLASH->CR &= CR_PSIZE_MASK;
    FLASH->CR |= FLASH_PSIZE_BYTE;
    FLASH->CR |= FLASH_CR_PG;
  
    *(__IO uint8_t*)Address = Data;
        
    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation();

Пробовал перемещать весь модуль stm32f2xx_flash в ОЗУ, не помогло. (а надо ли? в reference manual сказано, что к flash нельзя обращаться в момент записи, но в примерах EEPROM Emulation ничего для этого не предпринимается).

Кто-нибудь вообще запись во флеш делал?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
shmur
сообщение Sep 16 2013, 08:37
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 28-11-11
Пользователь №: 68 553



Ну я делал, причем даже нулевой сектор прошивал, выполняясь при этом из флеша. Правда писал я через FLASH_ProgramWord, а не FLASH_ProgramByte, может в этом проблема..
Go to the top of the page
 
+Quote Post
bseyur
сообщение Sep 16 2013, 08:46
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 8-01-07
Из: Томск
Пользователь №: 24 208



Скорее всего, в момент прошивки флеш ядро обращается к обработчику какого-нибудь прерывания.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Sep 16 2013, 11:56
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(shmur @ Sep 16 2013, 12:37) *
Ну я делал, причем даже нулевой сектор прошивал, выполняясь при этом из флеша. Правда писал я через FLASH_ProgramWord, а не FLASH_ProgramByte, может в этом проблема..

Спасибо, обнадёживает :-)
word'ами тоже пробовал, разницы никакой.


Цитата(bseyur @ Sep 16 2013, 12:46) *
Скорее всего, в момент прошивки флеш ядро обращается к обработчику какого-нибудь прерывания.

Забыл сказать, что программа очень простая. Прошивку считываю из внешней памяти, никаких прерываний нет и не будет.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
VAI
сообщение Sep 16 2013, 12:45
Сообщение #5


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Я вот так пишу флэшь на STM32F205.
Проблем не было.

CODE

#define PAGE_SZ ( (uint32_t)0x4000 ) // Размер секторов 0..3 равен 16 кБ
#define CONST0_START ( (uint32_t)0x08004000 ) // start address from sector1
#define CONST0_ID FLASH_Sector_1
#define CONST1_START ( CONST0_START + PAGE_SZ ) // start address from sector2
#define CONST1_ID FLASH_Sector_2
#define VOLTAGE_RANGE (uint8_t)VoltageRange_3 // Device voltage range supposed to be [2.7V to 3.6V], the operation will be done by word


/* --- wr_sector() ---------------------------------------------------------------------------------------- **
* Запись сектора
* adr - адрес во флэш, куда писать
* dat - адрес от куда писать
* len - размер данных в байтах
* -------------------------------------------------------------------------------------------------------- */
static FLASH_Status wr_sector( uint32_t adr, uint32_t *dat, int len )
{
FLASH_Status fs;

for ( fs = FLASH_COMPLETE; len; len -= sizeof( uint32_t ), adr += sizeof( uint32_t ), dat++ )
if (( fs = FLASH_ProgramWord( adr, *dat )) != FLASH_COMPLETE )
break;
return( fs );
}

/* --- wr_const() ----------------------------------------------------------------------------------------- **
* Запись констант в копию number (0 или 1 )
* -------------------------------------------------------------------------------------------------------- */
static FLASH_Status wr_const( int number )
{
uint32_t id, adr;
FLASH_Status fs;

id = CONST0_ID;
adr = CONST0_START;
if ( !number )
{ id = CONST1_ID;
adr = CONST1_START;
}
FLASH_Unlock();
if (( fs = FLASH_EraseSector( id, VOLTAGE_RANGE )) == FLASH_COMPLETE )
fs = wr_sector( adr, (uint32_t *)&r_const, sizeof( ATM_Constant ));
FLASH_Lock();
return( fs );
}


Добавлено: Заметил опечатку в функции wr_const(),
Код
  if ( !number )

а надо
Код
  if ( number )

правда это ни на что не влияет, просто поменяются местами блоки.


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Sep 16 2013, 13:05
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Вот такой кусок у меня работает:

Код
INT8 FlashWriteBlock(UINT32 WriteAddr, UINT8 * pBuffer, UINT32 byteCnt)
{
....
  // Disable interrupts to prevent flash programming errors from firing
  __disable_interrupt();
  FLASH_Unlock();
  UINT32 FlashEnd = FlashGetEndAddr();
  for (UINT32 WriteCount = 0;(WriteCount < byteCnt) && (WriteAddr < FlashEnd); WriteCount += 4)
  {
    // Clear pending flags incase they were triggered
    FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
                    FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
    /* Program the data received into STM32F10x Flash */
    FLASH_ProgramWord(WriteAddr, *(UINT32*)pBuffer);
    if (*(uint32_t*)WriteAddr != *(uint32_t*)pBuffer)
    {
      FLASH_Lock();
      __enable_interrupt();
      return -2;
    }
    WriteAddr += 4;
    pBuffer += 4;
  }
  FLASH_Lock();
  __enable_interrupt();
  return 0;
}


--------------------
ASB
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Sep 16 2013, 16:47
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(esaulenka @ Sep 16 2013, 12:31) *
ProgramByte выпадает в hardfault на команде branch на FLASH_WaitForLastOperation()


Мда... Стоило опечататься в одном нолике в дефайне FLASH_BASE_ADDRESS, и ничего не работает...
Поменял на стандартный библиотечный FLASH_BASE - и всё стало гораздо приятнее.

За предоставленный код всем спасибо!


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Stirliz85
сообщение Nov 1 2013, 05:28
Сообщение #8





Группа: Участник
Сообщений: 10
Регистрация: 24-06-10
Пользователь №: 58 129



Добрый день! Немного не в тему, ну может подскажите.Возможна ли работа с flash при включенной защите кода?У меня вопрос возник с stm32f405 - храню настройки в памяти контроллера, но при включении защиты кода все перестает работать...

Сообщение отредактировал Stirliz85 - Nov 1 2013, 05:31
Go to the top of the page
 
+Quote Post
zatylok
сообщение Nov 20 2013, 07:52
Сообщение #9





Группа: Новичок
Сообщений: 5
Регистрация: 19-04-11
Пользователь №: 64 467



защита кода влияет на внешний доступ, внутри программы все читается и пишется во flash. защита 2lvl.
после установки защиты перезагружал?

Сообщение отредактировал zatylok - Nov 20 2013, 07:53
Go to the top of the page
 
+Quote Post
zatylok
сообщение Nov 20 2013, 12:00
Сообщение #10





Группа: Новичок
Сообщений: 5
Регистрация: 19-04-11
Пользователь №: 64 467



2 lvl никогда не ставить ))) его не снять потом
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 06:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01435 секунд с 7
ELECTRONIX ©2004-2016