jenya7 0 22 января, 2018 Опубликовано 22 января, 2018 (изменено) · Жалоба Делаю так 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. Изменено 22 января, 2018 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 22 января, 2018 Опубликовано 22 января, 2018 · Жалоба Делаю так if (*dstw != *srcw ) { goto EndPrg; } а break чем не подошел? Вопрос риторический, не обращайте внимания. На строчке while ((FLASH->SR & FLASH_SR_BSY) != 0) вылетает в HardFault_Handler.А какую именно ассемблерную команду выполняет в этот момент процессор? Что находится в задействованных в команде регистрах? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 22 января, 2018 Опубликовано 22 января, 2018 (изменено) · Жалоба а break чем не подошел? Вопрос риторический, не обращайте внимания. А какую именно ассемблерную команду выполняет в этот момент процессор? Что находится в задействованных в команде регистрах? ничего криминального не вижу Я вообще не понимаю как при чтении из статусного регистра может возникнуть HardFault. Изменено 22 января, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 22 января, 2018 Опубликовано 22 января, 2018 · Жалоба ничего криминального не вижуВы предлагаете мне телепатически определить ассемблерную команду и содержимое регистров ядра, приводящие к исключению? В любом случае, чудес не бывает. Я вообще не понимаю как при чтении из статусного регистра может возникнуть HardFault.То, что оболочка показывает вам на какую-то строчку в исходнике на языке высокого уровня, вовсе не означает, что в этот момент исполняется ассемблерная команда, относящаяся именно к этой строчке. Оптимизация, однако. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 22 января, 2018 Опубликовано 22 января, 2018 · Жалоба Делаю так 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 байта? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 22 января, 2018 Опубликовано 22 января, 2018 (изменено) · Жалоба Может, src или dst не выровнены на 2 байта? да вроде работало в прошлом проекте. Вы предлагаете мне телепатически определить ассемблерную команду и содержимое регистров ядра, приводящие к исключению? В любом случае, чудес не бывает. То, что оболочка показывает вам на какую-то строчку в исходнике на языке высокого уровня, вовсе не означает, что в этот момент исполняется ассемблерная команда, относящаяся именно к этой строчке. Оптимизация, однако. вот дизасембли извиняюсь не то. вот до и после строчки Изменено 22 января, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 22 января, 2018 Опубликовано 22 января, 2018 · Жалоба да вроде работало в прошлом проекте.так может там данные случайно выровнены оказались? вот дизасемблиДа ну нафиг, разбирайтесь сами. Вы хотите меня убедить, что исключение возникает на команде перехода на WriteFlash? Нет, оно там происходить не может. Так накой вы мне показываете какой-то совсем не имеющий отношения к исключению кусок кода? У вас руки отваляться пошагать по ассемблерным командам до исключения, запомнить команду, сбросить проц, дошагать до нее еще раз и показать саму команду и содержимое R0...R15? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 22 января, 2018 Опубликовано 22 января, 2018 · Жалоба Может, src или dst не выровнены на 2 байта? да вроде работало в прошлом проекте. Да уж, аргумент сногсшибательный. Вам не приходило в голову, что между проектами есть различия? Иначе это был бы один проект. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 22 января, 2018 Опубликовано 22 января, 2018 (изменено) · Жалоба так может там данные случайно выровнены оказались? Да ну нафиг, разбирайтесь сами. Вы хотите меня убедить, что исключение возникает на команде перехода на WriteFlash? Нет, оно там происходить не может. Так накой вы мне показываете какой-то совсем не имеющий отношения к исключению кусок кода? У вас руки отваляться пошагать по ассемблерным командам до исключения, запомнить команду, сбросить проц, дошагать до нее еще раз и показать саму команду и содержимое R0...R15? так я и дошагал руками - во второй диаграмме на выделенной строчке вываливается в HardFault. а это регистры до и после Изменено 22 января, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 22 января, 2018 Опубликовано 22 января, 2018 · Жалоба так я и дошагал руками - во второй диаграмме на выделенной строчке вываливается в HardFault. Вероятно, виновата инструкция "STRH R4, [R1]". Надо посмотреть содержимое регистра R1. Нечётный адрес, видимо, как уже сказано выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 22 января, 2018 Опубликовано 22 января, 2018 · Жалоба Вероятно, виновата инструкция "STRH R4, [R1]". Надо посмотреть содержимое регистра R1. Нечётный адрес, видимо, как уже сказано выше. R1 = 0x200042A0 начальный адрес записываемой структуры motor_sys_params Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 22 января, 2018 Опубликовано 22 января, 2018 · Жалоба R1 = 0x200042A0 начальный адрес записываемой структуры motor_sys_params Это забавно, потому что на скриншоте R1=0x0801E7FF. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 22 января, 2018 Опубликовано 22 января, 2018 · Жалоба Это забавно, потому что на скриншоте R1=0x0801E7FF. пардон перепутал - R0 - начальный адрес структуры а R1 - начальный адрес страницы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 22 января, 2018 Опубликовано 22 января, 2018 · Жалоба R1 - начальный адрес страницы. Ну и? Ничто не смущает? Что это за страница такая, у которой начальный адрес 0x0801E7FF? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 22 января, 2018 Опубликовано 22 января, 2018 · Жалоба На всякий случай хочу напомнить: 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться