|
Запись во 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, 10:33
|

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

|
Цитата(Сергей Борщ @ Jan 22 2018, 15:33)  а break чем не подошел? Вопрос риторический, не обращайте внимания.
А какую именно ассемблерную команду выполняет в этот момент процессор? Что находится в задействованных в команде регистрах? ничего криминального не вижу Я вообще не понимаю как при чтении из статусного регистра может возникнуть HardFault.
Сообщение отредактировал Jenya7 - Jan 22 2018, 11:41
Эскизы прикрепленных изображений
|
|
|
|
|
Jan 22 2018, 12:44
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
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
Эскизы прикрепленных изображений
|
|
|
|
|
Jan 22 2018, 14:00
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 22 2018, 14:02
|
Профессионал
    
Группа: Участник
Сообщений: 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 а что неправильно?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|