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

 
 
> Запись во 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
 
Start new topic
Ответов
AHTOXA
сообщение Jan 22 2018, 12:53
Сообщение #2


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

Группа: Свой
Сообщений: 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
Сообщение #3


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

Группа: Участник
Сообщений: 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
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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
Jenya7
сообщение Jan 22 2018, 13:40
Сообщение #5


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

Группа: Участник
Сообщений: 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
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #7


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

Группа: Участник
Сообщений: 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
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #9


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

Группа: Участник
Сообщений: 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

Сообщений в этой теме
- Jenya7   Запись во FLASH   Jan 22 2018, 09:54
- - Сергей Борщ   QUOTE (Jenya7 @ Jan 22 2018, 11:54) Делаю...   Jan 22 2018, 10:33
|- - Jenya7   Цитата(Сергей Борщ @ Jan 22 2018, 15:33) ...   Jan 22 2018, 10:46
|- - Сергей Борщ   QUOTE (Jenya7 @ Jan 22 2018, 12:46) ничег...   Jan 22 2018, 12:44
|- - scifi   Цитата(Jenya7 @ Jan 22 2018, 16:54) R1 - ...   Jan 22 2018, 13:58
|- - Jenya7   Цитата(scifi @ Jan 22 2018, 18:58) Ну и? ...   Jan 22 2018, 14:02
|- - scifi   Цитата(Jenya7 @ Jan 22 2018, 17:02) 62-я....   Jan 22 2018, 14:07
|- - Jenya7   Цитата(scifi @ Jan 22 2018, 19:07) Конечн...   Jan 22 2018, 14:16
|- - scifi   Цитата(Jenya7 @ Jan 22 2018, 17:16) ой. ч...   Jan 22 2018, 14:21
|- - Jenya7   Цитата(scifi @ Jan 22 2018, 19:21) Мой ка...   Jan 22 2018, 14:25
- - scifi   Цитата(AHTOXA @ Jan 22 2018, 15:53) Может...   Jan 22 2018, 13:38
- - Aleksandr Baranov   На всякий случай хочу напомнить: Any attempt to r...   Jan 22 2018, 14:00


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

 


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


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