|
Запись во FLASH, STM32F303VC |
|
|
|
Jan 22 2018, 09:54
|
Профессионал
    
Группа: Участник
Сообщений: 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] - для короткого!
|
|
|
|
|
 |
Ответов
|
Jan 22 2018, 12:53
|

фанат дивана
     
Группа: Свой
Сообщений: 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 байта?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 22 2018, 13:30
|
Профессионал
    
Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
|
|
|
|
|
Jan 22 2018, 13:35
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jan 22 2018, 13:40
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Сергей Борщ @ Jan 22 2018, 18:35)  так может там данные случайно выровнены оказались? Да ну нафиг, разбирайтесь сами. Вы хотите меня убедить, что исключение возникает на команде перехода на WriteFlash? Нет, оно там происходить не может. Так накой вы мне показываете какой-то совсем не имеющий отношения к исключению кусок кода? У вас руки отваляться пошагать по ассемблерным командам до исключения, запомнить команду, сбросить проц, дошагать до нее еще раз и показать саму команду и содержимое R0...R15? так я и дошагал руками - во второй диаграмме на выделенной строчке вываливается в HardFault. а это регистры до и после
Сообщение отредактировал Jenya7 - Jan 22 2018, 13:45
Эскизы прикрепленных изображений
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|