Перейти к содержанию
    

Делаю так

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.

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Делаю так

        if (*dstw != *srcw )
        {
          goto EndPrg;
        }

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

 

На строчке while ((FLASH->SR & FLASH_SR_BSY) != 0) вылетает в HardFault_Handler.
А какую именно ассемблерную команду выполняет в этот момент процессор? Что находится в задействованных в команде регистрах?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

Я вообще не понимаю как при чтении из статусного регистра может возникнуть HardFault.

post-71075-1516617977_thumb.png

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ничего криминального не вижу
Вы предлагаете мне телепатически определить ассемблерную команду и содержимое регистров ядра, приводящие к исключению? В любом случае, чудес не бывает.

Я вообще не понимаю как при чтении из статусного регистра может возникнуть HardFault.
То, что оболочка показывает вам на какую-то строчку в исходнике на языке высокого уровня, вовсе не означает, что в этот момент исполняется ассемблерная команда, относящаяся именно к этой строчке. Оптимизация, однако.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Делаю так

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 байта?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может, src или dst не выровнены на 2 байта?

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

 

Вы предлагаете мне телепатически определить ассемблерную команду и содержимое регистров ядра, приводящие к исключению? В любом случае, чудес не бывает.

То, что оболочка показывает вам на какую-то строчку в исходнике на языке высокого уровня, вовсе не означает, что в этот момент исполняется ассемблерная команда, относящаяся именно к этой строчке. Оптимизация, однако.

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

 

извиняюсь не то.

вот до и после строчки

post-71075-1516627799_thumb.png

post-71075-1516628126_thumb.png

post-71075-1516628135_thumb.png

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да вроде работало в прошлом проекте.
так может там данные случайно выровнены оказались?

вот дизасембли
Да ну нафиг, разбирайтесь сами. Вы хотите меня убедить, что исключение возникает на команде перехода на WriteFlash? Нет, оно там происходить не может. Так накой вы мне показываете какой-то совсем не имеющий отношения к исключению кусок кода? У вас руки отваляться пошагать по ассемблерным командам до исключения, запомнить команду, сбросить проц, дошагать до нее еще раз и показать саму команду и содержимое R0...R15?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может, src или dst не выровнены на 2 байта?

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

Да уж, аргумент сногсшибательный. Вам не приходило в голову, что между проектами есть различия? Иначе это был бы один проект.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так может там данные случайно выровнены оказались?

Да ну нафиг, разбирайтесь сами. Вы хотите меня убедить, что исключение возникает на команде перехода на WriteFlash? Нет, оно там происходить не может. Так накой вы мне показываете какой-то совсем не имеющий отношения к исключению кусок кода? У вас руки отваляться пошагать по ассемблерным командам до исключения, запомнить команду, сбросить проц, дошагать до нее еще раз и показать саму команду и содержимое R0...R15?

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

 

а это регистры до и после

post-71075-1516628692_thumb.png

post-71075-1516628700_thumb.png

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Вероятно, виновата инструкция "STRH R4, [R1]". Надо посмотреть содержимое регистра R1. Нечётный адрес, видимо, как уже сказано выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вероятно, виновата инструкция "STRH R4, [R1]". Надо посмотреть содержимое регистра R1. Нечётный адрес, видимо, как уже сказано выше.

R1 = 0x200042A0 начальный адрес записываемой структуры motor_sys_params

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

R1 = 0x200042A0 начальный адрес записываемой структуры motor_sys_params

Это забавно, потому что на скриншоте R1=0x0801E7FF.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это забавно, потому что на скриншоте R1=0x0801E7FF.

пардон перепутал - R0 - начальный адрес структуры а R1 - начальный адрес страницы.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

R1 - начальный адрес страницы.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На всякий случай хочу напомнить:

 

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...