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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Запись во FLASH, STM32F303VC
Jenya7
сообщение Jan 22 2018, 09:54
Сообщение #1


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Делаю так
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.

Сообщение отредактировал IgorKossak - Jan 22 2018, 20:22
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 22 2018, 10:33
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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.
А какую именно ассемблерную команду выполняет в этот момент процессор? Что находится в задействованных в команде регистрах?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 22 2018, 10:46
Сообщение #3


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Jan 22 2018, 15:33) *
а break чем не подошел? Вопрос риторический, не обращайте внимания.

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

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

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

Сообщение отредактировал Jenya7 - Jan 22 2018, 11:41
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 22 2018, 12:44
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 22 2018, 12:53
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 22 2018, 13:30
Сообщение #6


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

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

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

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

извиняюсь не то.
вот до и после строчки

Сообщение отредактировал Jenya7 - Jan 22 2018, 13:35
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 22 2018, 13:35
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 22 2018, 13:38
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

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

Да уж, аргумент сногсшибательный. Вам не приходило в голову, что между проектами есть различия? Иначе это был бы один проект.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 22 2018, 13:40
Сообщение #9


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

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

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

Сообщение отредактировал Jenya7 - Jan 22 2018, 13:45
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 22 2018, 13:43
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Вероятно, виновата инструкция "STRH R4, [R1]". Надо посмотреть содержимое регистра R1. Нечётный адрес, видимо, как уже сказано выше.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 22 2018, 13:47
Сообщение #11


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

R1 = 0x200042A0 начальный адрес записываемой структуры motor_sys_params
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 22 2018, 13:48
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Это забавно, потому что на скриншоте R1=0x0801E7FF.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 22 2018, 13:54
Сообщение #13


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

пардон перепутал - R0 - начальный адрес структуры а R1 - начальный адрес страницы.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 22 2018, 13:58
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Ну и? Ничто не смущает? Что это за страница такая, у которой начальный адрес 0x0801E7FF?
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Jan 22 2018, 14:00
Сообщение #15


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

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



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

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
.


--------------------
ASB
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 22 2018, 14:02
Сообщение #16


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(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

а что неправильно?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 22 2018, 14:07
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Конечно неправильно. А что, это не очевидно? wacko.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 22 2018, 14:16
Сообщение #18


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

ой. чо то я...оплошал. страница 2 кило. получается 62 * 2048 = 0x801F000 так что ли?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 22 2018, 14:21
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Мой калькулятор то же самое показывает. И вообще,
#define FLASH_PAGE(n) (0x08000000 + (n) * 0x800)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 22 2018, 14:25
Сообщение #20


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

спасибо. в этом была проблема. не туда писал. все заработало.
Go to the top of the page
 
+Quote Post

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

 


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


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