Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запись во FLASH
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Jenya7
Делаю так
CODE
void WriteFlash(void* src, void* dst, int len)
{
uint32_t timeout = 0;
uint16_t* srcw = (uint16_t*)src;
volatile uint16_t* dstw = (uint16_t*)dst;

FLASH->CR |= FLASH_CR_PG; /* Programm the flash */

while (len)
{
*dstw = *srcw;
while ((FLASH->SR & FLASH_SR_BSY) != 0)
{
timeout++;
if (timeout > 100000) break;
}
if (*dstw != *srcw )
{
goto EndPrg;
}
dstw++;
srcw++;
len = len - sizeof(uint16_t);
}

EndPrg:
FLASH->CR &= ~FLASH_CR_PG; /* Reset the flag back !!!! */
}

void WriteToFlash(uint32_t flash_page)
{
uint32_t *addr;
uint32_t size;

FLASH_Status status;

//flash unlock
if((FLASH->CR & FLASH_CR_LOCK) != RESET)
{
/* Authorize the FLASH Registers access */
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;
}

status = FLASH_ErasePage(flash_page);

if (status == FLASH_COMPLETE)
{
addr = (uint32_t *)flash_page;
size = sizeof(MOTOR_SYS_PARAMS);
WriteFlash(&motor_sys_params, addr, size);
}

//flash lock
FLASH->CR |= FLASH_CR_LOCK;
}

На строчке while ((FLASH->SR & FLASH_SR_BSY) != 0) вылетает в HardFault_Handler.
Я этот код выдернул из старого проекта, он работал на том же STM32F3.
Сергей Борщ
QUOTE (Jenya7 @ Jan 22 2018, 11:54) *
Делаю так
CODE
        if (*dstw != *srcw )
        {
          goto EndPrg;
        }

а break чем не подошел? Вопрос риторический, не обращайте внимания.

QUOTE (Jenya7 @ Jan 22 2018, 11:54) *
На строчке while ((FLASH->SR & FLASH_SR_BSY) != 0) вылетает в HardFault_Handler.
А какую именно ассемблерную команду выполняет в этот момент процессор? Что находится в задействованных в команде регистрах?
Jenya7
Цитата(Сергей Борщ @ Jan 22 2018, 15:33) *
а break чем не подошел? Вопрос риторический, не обращайте внимания.

А какую именно ассемблерную команду выполняет в этот момент процессор? Что находится в задействованных в команде регистрах?

ничего криминального не вижу

Я вообще не понимаю как при чтении из статусного регистра может возникнуть HardFault.
Сергей Борщ
QUOTE (Jenya7 @ Jan 22 2018, 12:46) *
ничего криминального не вижу
Вы предлагаете мне телепатически определить ассемблерную команду и содержимое регистров ядра, приводящие к исключению? В любом случае, чудес не бывает.
QUOTE (Jenya7 @ Jan 22 2018, 12:46) *
Я вообще не понимаю как при чтении из статусного регистра может возникнуть HardFault.
То, что оболочка показывает вам на какую-то строчку в исходнике на языке высокого уровня, вовсе не означает, что в этот момент исполняется ассемблерная команда, относящаяся именно к этой строчке. Оптимизация, однако.
AHTOXA
Цитата(Jenya7 @ Jan 22 2018, 14:54) *
Делаю так
Код
void WriteFlash(void* src, void* dst, int len)
{
    uint32_t timeout = 0;      
    uint16_t* srcw = (uint16_t*)src;
    volatile uint16_t* dstw = (uint16_t*)dst;
}

Может, src или dst не выровнены на 2 байта?
Jenya7
Цитата(AHTOXA @ Jan 22 2018, 17:53) *
Может, src или dst не выровнены на 2 байта?

да вроде работало в прошлом проекте.

Цитата(Сергей Борщ @ Jan 22 2018, 17:44) *
Вы предлагаете мне телепатически определить ассемблерную команду и содержимое регистров ядра, приводящие к исключению? В любом случае, чудес не бывает.
То, что оболочка показывает вам на какую-то строчку в исходнике на языке высокого уровня, вовсе не означает, что в этот момент исполняется ассемблерная команда, относящаяся именно к этой строчке. Оптимизация, однако.

вот дизасембли

извиняюсь не то.
вот до и после строчки
Сергей Борщ
QUOTE (Jenya7 @ Jan 22 2018, 15:30) *
да вроде работало в прошлом проекте.
так может там данные случайно выровнены оказались?
QUOTE (Jenya7 @ Jan 22 2018, 15:30) *
вот дизасембли
Да ну нафиг, разбирайтесь сами. Вы хотите меня убедить, что исключение возникает на команде перехода на WriteFlash? Нет, оно там происходить не может. Так накой вы мне показываете какой-то совсем не имеющий отношения к исключению кусок кода? У вас руки отваляться пошагать по ассемблерным командам до исключения, запомнить команду, сбросить проц, дошагать до нее еще раз и показать саму команду и содержимое R0...R15?
scifi
Цитата(AHTOXA @ Jan 22 2018, 15:53) *
Может, src или dst не выровнены на 2 байта?

Цитата(Jenya7 @ Jan 22 2018, 16:30) *
да вроде работало в прошлом проекте.

Да уж, аргумент сногсшибательный. Вам не приходило в голову, что между проектами есть различия? Иначе это был бы один проект.
Jenya7
Цитата(Сергей Борщ @ Jan 22 2018, 18:35) *
так может там данные случайно выровнены оказались?
Да ну нафиг, разбирайтесь сами. Вы хотите меня убедить, что исключение возникает на команде перехода на WriteFlash? Нет, оно там происходить не может. Так накой вы мне показываете какой-то совсем не имеющий отношения к исключению кусок кода? У вас руки отваляться пошагать по ассемблерным командам до исключения, запомнить команду, сбросить проц, дошагать до нее еще раз и показать саму команду и содержимое R0...R15?

так я и дошагал руками - во второй диаграмме на выделенной строчке вываливается в HardFault.

а это регистры до и после
scifi
Цитата(Jenya7 @ Jan 22 2018, 16:40) *
так я и дошагал руками - во второй диаграмме на выделенной строчке вываливается в HardFault.

Вероятно, виновата инструкция "STRH R4, [R1]". Надо посмотреть содержимое регистра R1. Нечётный адрес, видимо, как уже сказано выше.
Jenya7
Цитата(scifi @ Jan 22 2018, 18:43) *
Вероятно, виновата инструкция "STRH R4, [R1]". Надо посмотреть содержимое регистра R1. Нечётный адрес, видимо, как уже сказано выше.

R1 = 0x200042A0 начальный адрес записываемой структуры motor_sys_params
scifi
Цитата(Jenya7 @ Jan 22 2018, 16:47) *
R1 = 0x200042A0 начальный адрес записываемой структуры motor_sys_params

Это забавно, потому что на скриншоте R1=0x0801E7FF.
Jenya7
Цитата(scifi @ Jan 22 2018, 18:48) *
Это забавно, потому что на скриншоте R1=0x0801E7FF.

пардон перепутал - R0 - начальный адрес структуры а R1 - начальный адрес страницы.
scifi
Цитата(Jenya7 @ Jan 22 2018, 16:54) *
R1 - начальный адрес страницы.

Ну и? Ничто не смущает? Что это за страница такая, у которой начальный адрес 0x0801E7FF?
Aleksandr Baranov
На всякий случай хочу напомнить:

Any attempt to read the Flash memory on STM32F4xx while it is being written or erased,
causes the bus to stall. Read operations are processed correctly once the program
operation has completed. This means that code or data fetches cannot be performed while
a write/erase operation is ongoing
.
Jenya7
Цитата(scifi @ Jan 22 2018, 18:58) *
Ну и? Ничто не смущает? Что это за страница такая, у которой начальный адрес 0x0801E7FF?

62-я. я долго считал
Код
#define FLASH_PAGE60 0x801D7FF
#define FLASH_PAGE61 0x801DFFF
#define FLASH_PAGE62 0x801E7FF
#define FLASH_PAGE63 0x801EFFF
#define FLASH_PAGE64 0x801F7FF

а что неправильно?
scifi
Цитата(Jenya7 @ Jan 22 2018, 17:02) *
62-я. я долго считал
а что неправильно?

Конечно неправильно. А что, это не очевидно? wacko.gif
Jenya7
Цитата(scifi @ Jan 22 2018, 19:07) *
Конечно неправильно. А что, это не очевидно? wacko.gif

ой. чо то я...оплошал. страница 2 кило. получается 62 * 2048 = 0x801F000 так что ли?
scifi
Цитата(Jenya7 @ Jan 22 2018, 17:16) *
ой. чо то я...оплошал. страница 2 кило. получается 62 * 2048 = 0x801F000 так что ли?

Мой калькулятор то же самое показывает. И вообще,
#define FLASH_PAGE(n) (0x08000000 + (n) * 0x800)
Jenya7
Цитата(scifi @ Jan 22 2018, 19:21) *
Мой калькулятор то же самое показывает. И вообще,
#define FLASH_PAGE(n) (0x08000000 + (n) * 0x800)

спасибо. в этом была проблема. не туда писал. все заработало.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.